一尘不染

Tomcat服务器/客户端自签名SSL证书

tomcat

我有一台运行有自签名SSL证书的Apache Tomcat
6.x服务器。我希望客户端将自己的证书提交给服务器,以便我可以基于用户数据库对它们进行身份验证。我可以根据在网上找到的示例来完成所有工作,但是该示例附带了罐装证书和预构建的JKS数据存储区。我想用自己的证书创建自己的数据存储区,但是没有运气。

如何为Tomcat创建数据存储?
如何为Tomcat创建自签名证书?

如何为客户端创建自签名证书?
如何强制Tomcat信任客户端的签名?

我已经使用java keytool玩了很多小时了。


阅读 488

收藏
2020-06-16

共1个答案

一尘不染

终于找到了解决我问题的方法,所以如果有人卡住,我会将结果发布在这里。

多亏了Michael 软件思想与杂乱无章的 Michael
Martin,我发现:

默认情况下,keytool在生成自签名证书时使用DSA算法。早期版本的Firefox可以毫无问题地接受这些密钥。在Firefox 3 beta
5中,不能使用DSA,但是可以使用RSA。在生成自签名证书时传递“ -keyalg RSA”将创建Firefox 3 beta 5完全接受的证书。

我只是设置了该标志,清除了FireFox中的所有缓存,它就像一个魅力!我将其用作项目的测试设置,并且需要与他人共享,因此我编写了一个小批处理脚本来创建两个SSL证书。一个可以放入Tomcat设置,另一个是.p12文件,可以将其导入FireFox
/ IE。谢谢!

用法:第一个命令行参数是客户端的用户名。所有密码均为“密码”(不带引号)。更改任何硬编码位以满足您的需求。

@echo off
if "%1" == "" goto usage

keytool -genkeypair -alias servercert -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -keystore server.jks -storepass password
keytool -genkeypair -alias %1 -keystore %1.p12 -storetype pkcs12 -keyalg RSA -dname "CN=%1,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass password -storepass password
keytool -exportcert -alias %1 -file %1.cer -keystore %1.p12 -storetype pkcs12 -storepass password
keytool -importcert -keystore server.jks -alias %1 -file %1.cer -v -trustcacerts -noprompt -storepass password
keytool -list -v -keystore server.jks -storepass password
del %1.cer
goto end

:usage
echo Need user id as first argument: generate_keystore [username]
goto end

:end
pause

结果是两个文件。一个名为server.jks的文件,您放入了Tomcat,另一个名为{username}
.p12的文件,您导入了浏览器。server.jks文件已将客户端证书添加为可信证书。

我希望其他人觉得这很有用。

这是需要添加到Tomcat conf / sever.xml文件中的XML(仅在Tomcat 6.x上进行了测试)

<Connector
   clientAuth="true" port="8443" minSpareThreads="5" maxSpareThreads="75"
   enableLookups="true" disableUploadTimeout="true"
   acceptCount="100" maxThreads="200"
   scheme="https" secure="true" SSLEnabled="true"
   keystoreFile="${catalina.home}/conf/server.jks"
   keystoreType="JKS" keystorePass="password"
   truststoreFile="${catalina.home}/conf/server.jks"
   truststoreType="JKS" truststorePass="password"
   SSLVerifyClient="require" SSLEngine="on" SSLVerifyDepth="2" sslProtocol="TLS"
/>

对于Tomcat 7:

<Connector protocol="org.apache.coyote.http11.Http11NioProtocol"
           port="8443" SSLEnabled="true"
           maxThreads="200" scheme="https" secure="true"
           keystoreFile="${catalina.base}/conf/server.jks" keystorePass="password"
           clientAuth="false" sslProtocol="TLS" />
2020-06-16