jetty9配置https的方式

有关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>

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值