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

我有一个运行自签名SSL证书的Apache Tomcat 6.x服务器。 我希望客户端将自己的证书提交给服务器,以便我可以基于用户数据库对其进行身份validation。 我有一个基于我在网上find的例子,但是这个例子带有jar头证书和一个预先构build的JKS数据存储。 我想用我自己的证书创build自己的数据存储,但没有运气。

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

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

我一直在玩java keytool好几个小时了。

最后得到解决我的问题,所以我会在这里发布结果,如果其他人卡住了。

感谢Michael的软件思考和Ramblings的 Michael Martin,我发现:

在生成自签名证书时,keytool默认使用DSAalgorithm。 早期版本的Firefox接受这些密钥没有问题。 使用Firefox 3testing版5,使用DSA不起作用,但使用RSA。 在生成自签名证书时传递“-keyalg RSA”将创buildFirefox 3 beta 5完全接受的证书。

我只是设置了这个标志,清除了FireFox中的所有caching,它的function就像一个魅力! 我使用这个作为我的项目的testing设置,我需要与其他人分享,所以我写了一个小批处理脚本,创build两个SSL证书。 一个可以放入Tomcat设置,另一个是可以导入到FireFox / IE的.p12文件。 谢谢!

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

@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上进行testing)

 <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" /> 

要启用客户端身份validation,您需要为Tomcat指定一个“信任存储区”:包含您信任的根证书颁发机构的证书的密钥存储区,每个标记为“trustEntry”。

这由Connector元素的属性指定: truststoreFiletruststorePass (默认为keystorePass的值)和truststoreType (默认为“JKS”)。

如果客户使用自签名证书,则其“根”CA是证书本身; 那么你需要将客户的自签名证书导入到Tomcat的信任存储中。

如果你有很多客户,这将很快成为一个麻烦。 在这种情况下,您可能需要考虑为客户签署证书。 Java keytool命令无法执行此操作,但OpenSSL中提供了所有必需的命令行实用程序。 或者你可以大规模地看看EJBCA 。

更好的是,请问你的客户使用现有的免费CA,如startcom.org 。 这并不总是适用于服务器证书,因为StartCom的证书不包括在所有的浏览器中,但这种情况是相反的,StartCom根证书可以很容易地导入Tomcat信任存储。

创build证书:

 keytool -genkey -alias tomcat -keyalg RSA -keystore /home/bob/mykeystore 

input您需要的自签名证书的所有数据,然后编辑Tomcat的server.xml并在SSL连接器上指定密钥库属性,例如:

 <Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" keystoreFile="/home/bob/mykeystore" clientAuth="false" sslProtocol="TLS" /> 

或者按照Tomcat的文档…

http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html

以前的答案对我很有用,但没有shell工具版本。 所以我写了一个。

key_gen.sh:

 #! /bin/bash # a key generator for https, basename=server key_algorithm=RSA password_key=123456 password_store=123456 country=US # clean - pre rm "${basename}.jks" # generate server side keytool -genkeypair -alias "${basename}cert" -keyalg $key_algorithm -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=${country}" -keypass $password_key -keystore "${basename}.jks" -storepass $password_store 

对于tomcat8 ,可以将以下configuration添加到server.xml

  <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" acceptCount="75" keystoreFile="${catalina.home}/conf/server.jks" keystorePass="123456" />