jetty9配置https的方式

xiaoxiao2021-02-28  136

有关jetty9配置https的文档基本上很少,至少百度了几篇相当雷同. 由于本人对jetty并不是很熟,也走了很多坑,研究了2天,由于tomcat的https配置相对来说比较简单,具体可以参看上一篇文件.

1:首先可以先了解下jetty的相关信息.jetty是高度模块化,尤其是影响其启动的配置文件. 需要了解jetty的两个个环境变量 jetty.base jetty.home

jetty.base,可以理解成虚拟主机,其路径一般情况下是启动命令( java -jar start.jar )的当前路径. 当然也可以在任意目录下执行启动命令并添加相关模板.例如: java -jar ../start.jar –add-to-start=ssl,https,deploy,jsp 那么就可以在当前目录生成对应的一些文件和目录,例如tree命令查看如下:

#zhao-base tree ├── etc │ └── keystore ├── start.ini └── webapps 然后将项目war包放入webapps目录即可.

jetty.home,可以理解成安装jetty的目录,即start.jar的所在路径.

了解了如上的两个变量之后,那么就开始jetty的start启动配置. Jetty Start机制用命令行,start.ini文件和任何start.d/*.ini文件提供配置参数. 例如:

------Jetty IoC(或者SpringXML格式的XML文件 ------模块激活,格式为:--module=name ------属性,格式为:name=value,用于Jetty IoC XML的参数 ------标准Java属性文件,包含附加的启动属性 ------其它start.jar选项(看java -jar start.jar --help) ------一些JVM选项 ini文件放在jetty.base(如果不同于jetty.home),通过修改它们改变配置。

mod文件

modules/*.mod文件包含了模块的定义,这些模块能通过--module=name激活。每个mod文件定义: ------为排序和激活定义的模块依赖 ------需要被模块添加到classpath的库 ------需要被模块添加到命令行的XML文件 ------需要被激活模块的文件 ------一个模板ini文件,当使用--add-to-start=name激活是使用 mod文件通常被放在jetty.home,但是可以被jetty.base中的覆盖。通常很少编辑模块文件除非大的结构改变。

XML文件

Jetty支持Jetty IoC和Spring IoC格式的XML文件,可以在命令行中指定,也可以在ini文件中指定,或者通过模块定义添加到命令行中。XML文件实例化和注入Java对象,包括server、connectors和contexts。 因为Jetty IoC XML文件经常使用properties,一些通常的配置任务不需要编辑这些XML文件就能完成。如果XML配置被要求改变,XML文件应该从jetty.home/etc拷贝到jetty.base/etc,再做修改。

总结 通常Jetty的发布版本,包括下面的配置:

$JETTY_HOME/start.ini 全局命令行选项。从Jetty 9.1开始,start.ini的内容被移动到模块的start.d/下的ini文件中。 $JETTY_HOME/start.d 模块ini文件的文件夹,用于为Jetty modules设置OPTION、parameters和配置文件。这些modules可以通过重命名文件或者在9.1之后使用start.jar的--enable或者--disable选项来激活或者停止。 $JETTY_HOME/lib/*.xml Jetty IoC XML文件,配置个体特性;如jetty.xml(为server),jetty-http.xml,jetty-https.xml,jetty-jmx.xml。 $JETTY_HOME/webapps/* 用于部署标准WAR文件、web应用和上下文IoC XML文件。

如上部分 可以参考 http://blog.csdn.net/tomato__/article/details/27544671

start.ini文件的末尾加入指定的模块 jetty.server.dumpBeforeStop= etc/jetty-ssl.xml etc/jetty-https.xml 或者用–module=ssl的方式导入模块,建议使用后者.

https访问,需要修改配置文件 start.ini.

# Module: ssl --module=ssl jetty.ssl.port=8445 jetty.sslContext.trustStorePath=etc/keystore_xxx{keystore文件} jetty.sslContext.keyStorePath=etc/keystore_xxx{keystore文件} jetty.sslContext.keyStorePassword=xxxx{keystore的密码} jetty.sslContext.keyManagerPassword=xxxx{keystore的密码} jetty.server.dumpBeforeStop= etc/jetty-ssl.xml etc/jetty-https.xml 证书的路径是以start.jar为相对路径的起点.当然也可以自定义路径,至于密码,可以选择以明文的形式写在文件中,也可以以加密的形式写在文件中,当然建议还是写秘文,需要注意的情况是迷文需要加入OBF:的前缀.OBF:1vfx1vnq1w9j1w871vnc1vgx 生成OBF迷文的方式,使用 jetty.util.security.Password 的工具类即可.具体方法如下: java -cp jetty-util-9.4.6.v20170531.jar org.eclipse.jetty.util.security.Password {keystore的密码} 修改完成之后,重启jetty的脚本即可,另外如果项目只是以https访问的话,可以把start.ini的配置文件中http的模块注释掉,而只开启https服务. 下面的https访问的方式是修改xml的配置文件,功能类似.最关键的是找到配置https的相关配置文件,其对应的文件是在etc/jetty-https.xml内容如下: <Configure id="sslConnector" class="org.eclipse.jetty.server.ServerConnector"> <Call name="addIfAbsentConnectionFactory"> <Arg> <New class="org.eclipse.jetty.server.SslConnectionFactory"> <Arg name="next">http/1.1</Arg> <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg> </New> </Arg> </Call> <Call name="addConnectionFactory"> <Arg> <New class="org.eclipse.jetty.server.HttpConnectionFactory"> <Arg name="config"><Ref refid="sslHttpConfig" /></Arg> <Arg name="compliance"><Call class="org.eclipse.jetty.http.HttpCompliance" name="valueOf"><Arg><Property name="jetty.http.compliance" default="RFC7230"/></Arg></Call></Arg> </New> </Arg> </Call> </Configure>

但是在https的模块中,它的sslContextFactory对象并非定义在这里,网上的很多坑都说在这里添加证书相关的信息,但是无论添加到这个文件的哪里都会保存.在分析了这个文件之后,明白了sslContextFactory是引用了外部一个对象,因此问题的关键是找到外部的sslContextFactory对象.

经过各种启动测试和分析,以及debug启动(心酸….)终于在etc/jetty-ssl-context.xml中找到了定义了sslContextFactory的信息.

<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory"> <Set name="KeyStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.sslContext.keyStorePath" deprecated="jetty.keystore" default="etc/xx"/></Set> <Set name="TrustStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.sslContext.trustStorePath" deprecated="jetty.truststore" default="etc/xx"/></Set> <Set name="KeyStorePassword"><Property name="jetty.sslContext.keyStorePassword" deprecated="jetty.keystore.password" default="{passwd}"/></Set> <Set name="KeyManagerPassword"><Property name="jetty.sslContext.keyManagerPassword" deprecated="jetty.keymanager.password" default="{passwd}"/></Set> <Set name="KeyStoreType"><Property name="jetty.sslContext.keyStoreType" default="JKS"/></Set> <Set name="KeyStoreProvider"><Property name="jetty.sslContext.keyStoreProvider"/></Set> <Set name="TrustStorePassword"><Property name="jetty.sslContext.trustStorePassword" deprecated="jetty.truststore.password"/></Set> <Set name="TrustStoreType"><Property name="jetty.sslContext.trustStoreType"/></Set> <Set name="TrustStoreProvider"><Property name="jetty.sslContext.trustStoreProvider"/></Set> <Set name="EndpointIdentificationAlgorithm"></Set> <Set name="NeedClientAuth"><Property name="jetty.sslContext.needClientAuth" deprecated="jetty.ssl.needClientAuth" default="false"/></Set> <Set name="WantClientAuth"><Property name="jetty.sslContext.wantClientAuth" deprecated="jetty.ssl.wantClientAuth" default="false"/></Set> <Set name="useCipherSuitesOrder"><Property name="jetty.sslContext.useCipherSuitesOrder" default="true"/></Set> <Set name="sslSessionCacheSize"><Property name="jetty.sslContext.sslSessionCacheSize" default="-1"/></Set> <Set name="sslSessionTimeout"><Property name="jetty.sslContext.sslSessionTimeout" default="-1"/></Set> </Configure>

关键是修改如如上的前四个参数,至于证书相关的信息可以参看上一篇博文.

转载请注明原文地址: https://www.6miu.com/read-71570.html

最新回复(0)