Tomcat里面配置HTTPS注意事项

通过给别人解决Tomcat的配置SSL的问题,又加深了一些理解,也想为新人记录一些注意事项。现在记录如下:

1. 生成证书的文章多得是,我就不说了,但是在配置ssl的时候,可以直接使用PKCS12格式的证书充当证书库,可能不是每个人都知道。如果这样使用的时候,一定要告诉Tomcat你正在使用PKCS12格式的证书库,因为默认的格式是JKS. 举例如下:

Xml代码
SSLEnabled="true" maxThreads="150" sslProtocol="TLS" clientAuth="true"
keystoreFile="E:\JBosss_Tomcat\Tomcat6\Test_SSL\apache-tomcat-6.0.18\conf\server.p12"
keystoreType="PKCS12" keystorePass="password"
truststoreFile="E:\JBosss_Tomcat\Tomcat6\Test_SSL\apache-tomcat-6.0.18\conf\root.jks"
truststoreType="JKS" truststorePass="password"/>

SSLEnabled="true" maxThreads="150" sslProtocol="TLS" clientAuth="true"
keystoreFile="E:\JBosss_Tomcat\Tomcat6\Test_SSL\apache-tomcat-6.0.18\conf\server.p12"
keystoreType="PKCS12" keystorePass="password"
truststoreFile="E:\JBosss_Tomcat\Tomcat6\Test_SSL\apache-tomcat-6.0.18\conf\root.jks"
truststoreType="JKS" truststorePass="password"/>

2. XML文件是区分大小写的,你写在server.xml里配置的有些是通过MBean赋值到Tomcat的javabean里的,如果你大小写搞错了,他也无法认识。举例:如keystoreFile如果你写成keystorefile, tomcat就不知道这个文件在哪里,因为你指定的文件路径并没有通过MBean赋值到Tomcat里的javabean。

3. 文件的路径,如果在server.xml没有指定路径,而只指定一个文件名,Tomcat会到它的根目录下去找文件,如果文件不是放在根目录下,也是找不到的。这里的根目录也可以叫“默认目录”。其实还有一个“默认目录”的概念, 如果在server.xml里不指定keystoreFile的话,如下配置:
Xml代码
SSLEnabled="true" maxThreads="150" sslProtocol="TLS"/>

SSLEnabled="true" maxThreads="150" sslProtocol="TLS"/>

Tomcat会到当前用户的根目录下去找一个叫".keystore"的文件,如果当前用户是Administrator, 就去找文件C:\Documents and Settings\Administrator\.keystore, 如果找不到启动的时候就会出错。这个应该与JVM有关,不知道有没有办法改变这个路径。

4. 如果不是做JSSE的ssl开发的话,可能很少有人用系统参数来指定keyStore和trustStore的。在做JSSE的时候可以用如下配置:
Java代码
-Djavax.net.ssl.trustStore="E:\JBosss_Tomcat\Tomcat6\Test_SSL\apache-tomcat-6.0.18\conf\root.jks"
-Djavax.net.ssl.trustStorePassword="password"
-Djavax.net.ssl.trustStoreType="JKS"
-Djavax.net.ssl.keyStore="E:\JBosss_Tomcat\Tomcat6\Test_SSL\apache-tomcat-6.0.18\conf\server.p12"
-Djavax.net.ssl.keyStorePassword="password"
-Djavax.net.ssl.keyStoreType="PKCS12"

-Djavax.net.ssl.trustStore="E:\JBosss_Tomcat\Tomcat6\Test_SSL\apache-tomcat-6.0.18\conf\root.jks"
-Djavax.net.ssl.trustStorePassword="password"
-Djavax.net.ssl.trustStoreType="JKS"
-Djavax.net.ssl.keyStore="E:\JBosss_Tomcat\Tomcat6\Test_SSL\apache-tomcat-6.0.18\conf\server.p12"
-Djavax.net.ssl.keyStorePassword="password"
-Djavax.net.ssl.keyStoreType="PKCS12"

这样也可以指定这些参数。但是在Tomcat里的trustStore这样指定一点问题都没有,但是keyStore这样,却不行。我不知道是什么原因,如果有知道的朋友可以指出来。

5. 如果有关这些trustStore都不想配置,那可以直接把你的CA导入到JRE里。如果你使用的CA是特别著名的CA, 那么很可能JRE里已经有了,那么这一步不用做任何与trustStore有关的配置。

6. keystoreFile里必须是有私钥信息的,因为建立ssl握手必须要有私钥(有兴趣的话,最好了解一下握手过程, 请见最后附件的示意图。)。可以把p12里的信息证书和私钥导入到jks里(有些CA直接发的是p12格式的证书,而没有直接发给你x.509格式的),这个可能有点麻烦,因为keytool根本就没有提供操作私钥的办法。在测试时你也可以先用keytool生成一个带有证书的jks, 然后把里面的证书导出来。

证书的其他概念也可以参考:http://grandboy.javaeye.com/admin/blogs/441778

先总结这么多吧。以后再补充。

附件:

HTTPS通信过程(单身认证)示意图:

我记得以前专门写过一个文章,详细讲解这个通信过程的。但是现在找不到了,只简单画一个图说明一下。网上也有很多牛人写的这方面文章,只不过信息太多,可能要甄别一下准确性。

  1. da shang
    donate-alipay
               donate-weixin weixinpay

发表评论↓↓