3

一篇教会你用Jetty配置Https

 2 years ago
source link: https://server.51cto.com/article/705865.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

由于工作需要,需要测试Jetty配置HTTPS的解析情况,本篇记录下Jetty下的HTTPS的配置。

一、简单介绍

1.1 Jetty介绍

Jetty 是一个Servlet引擎,是一个可扩展和非常灵活的应用服务。它有一个基本数据模型,这个数据模型就是 Handler(处理器),所有可以被扩展的组件都可以作为一个 Handler,添加到 Server 中,Jetty 就是帮你管理这些 Handler。 下图是 Jetty 的基本架构图,整个 Jetty 的核心组件由 Server 和 Connector 两个组件构成,整个 Server 组件是基于 Handler 容器工作的,它类似与 Tomcat 的 Container 容器。 Connector 用于负责接受客户端的连接请求,并将请求分配给一个处理队列去处理。

d907cda19443107b606531e201ee3883a1dd89.jpg

1.2 Jetty优点

Jetty的架构简单,可以按需加载组件,减少不需要的组件,减少服务器内存开销。

Jetty 采用异步的Servlet,可以同时处理大量连接,且长时间保持连接状态。

Jetty 采用NIO在处理I/O请求更占优势,处理静态资源性能更好。

Jetty 嵌入到应用中,使一个普通应用快速支持http服务。

二、Jetty 配置和使用

Jetty最新版本为:

jetty-distribution-9.4.29.v20200521.tar.gz ,和以前版本使用方法稍微有所不同。

2.1 添加默认启动模块

默认情况下,https和日志模块都没有开启,运行jetty连个日志都没有,实在是不合理。

#添加日志模块
java -jar start.jar --add-to-start=console-capture
#添加https 模块
java -jar start.jar --add-to-start=https
# https模块要依赖ssl模块
java -jar start.jar --add-to-start=ssl

以上命令在jetty_home目录运行,更改start.ini配置文件。

## Connector host/address to bind to
 jetty.ssl.host=0.0.0.0

## Connector port to listen on
 jetty.ssl.port=7443
 jetty.sslContext.keyStorePath=etc/keystore
 jetty.sslContext.trustStorePath=etc/keystore

2.2 启动命令

前台启动:

java -jar start.jar

后台启动命令:

./bin/jetty.sh  start

报错信息如下:

2020-05-25 14:35:52.228:WARN:oejx.XmlConfiguration:main: 
java.security.PrivilegedActionException: java.io.IOException: Is a directory
 at java.security.AccessController.doPrivileged(Native Method)

配置的key文件错误,使用keystore文件试试,转换方法如下:

2.3 pem文件转keystore

jetty 使用的是keystore文件,需要进行转换,转命令:

#需要输入密码 假设输入123456
openssl pkcs12 -export -in server-cert.pem -inkey server-key.pem  -out out.pk12
#转成keystore文件
keytool -importkeystore -deststorepass 123456 -destkeypass 123456 -destkeystore sh.keystore -srckeystore out.pk12 -srcstoretype PKCS12 -srcstorepass 123456 

转换密码:

java -cp lib/jetty-util-9.4.29.v20200521.jar  org.eclipse.jetty.util.security.Password 123456
2020-05-25 15:06:01.084:INFO::main: Logging initialized @114ms to org.eclipse.jetty.util.log.StdErrLog
123456
OBF:19iy19j019j219j419j619j8
MD5:e10adc3949ba59abbe56e057f20f883e

配置更改start.ini文件:

## Keystore file path (relative to $jetty.base)
jetty.sslContext.keyStorePath=etc/keystore/sh.keystore
## Truststore file path (relative to $jetty.base)
jetty.sslContext.trustStorePath=etc/keystore/sh.keystore
## Keystore password
 jetty.sslContext.keyStorePassword=OBF:19iy19j019j219j419j619j8

配置后继续报错:

2020-05-25 15:12:39.532:INFO:oejus.SslContextFactory:main: x509=X509@1786dec2(1,h=[192.168.63.1],w=[]) for Server@6acdbdf5[provider=null,keyStore=file:///home/miaohq/soft/jetty/etc/keystore/sh.keystore,trustStore=file:///home/miaohq/soft/jetty/etc/keystore/sh.keystore]
2020-05-25 15:12:39.573:WARN:oejx.XmlConfiguration:main: 
java.security.PrivilegedActionException: java.security.UnrecoverableKeyException: Cannot recover key

到这里面才发现是不是密钥套件没配置,所以提取不了key?所以下面配置下。

三、配置https和ssl配置

3.1 配置jetty-ssl-context.xml修改

 <Set name="KeyStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.sslContext.keyStorePath" deprecated="jetty.keystore" default="etc/keystore/sh.keystore"/></Set>
  <Set name="KeyStorePassword"><Property name="jetty.sslContext.keyStorePassword" deprecated="jetty.keystore.password" default="OBF:19iy19j019j219j419j619j8"/></Set>
  <Set name="KeyManagerPassword"><Property name="jetty.sslContext.keyManagerPassword" deprecated="jetty.keymanager.password" default="OBF:19iy19j019j219j419j619j8"/></Set>
  <Set name="TrustStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.sslContext.trustStorePath" deprecated="jetty.truststore" default="etc/keystore/sh.keystore"/></Set>

3.2 配置jetty-ssl.xml修改

<Set name="port"><Property name="jetty.ssl.port" deprecated="ssl.port" default="7443" /></Set>

3.3 通过系统命令启停jetty

添加服务到系统:

cp        bin/jetty.sh /etc/init.d/jetty
#jetty的安装目录
echo JETTY_HOME=`pwd` > /etc/default/jetty
#jetty的web目录
echo "JETTY_BASE=/opt/jetty-base" >> /etc/default/jetty

启动命令:

service jetty start

###3.4 配置Tls版本和支持密钥套件 更改jetty-ssl-context.xml 目前这个里面RSA的套件都不支持了:(。

<Set name="IncludeProtocols">
    <Array type="String">
        <Item>TLSv1.2</Item>
    </Array>
  </Set>

  <Set name="IncludeCipherSuites">
    <Array type="String">
      <Item>TLS_RSA_WITH_AES_128_CBC_SHA256</Item>
      <Item>TLS_RSA_WITH_AES_128_CBC_SHA</Item>
      <Item>TLS_RSA_WITH_AES_128_GCM_SHA256</Item>
      <Item>TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</Item>
    </Array>
  </Set>

3.4 注意

目前我是在jetty的目录下直接启动的,其实不是太合适,正规点,是需要自己指定个目录,然后jetty_base指向这个目录。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK