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

时间:2009-07-24 21:59:29

标签: tomcat ssl ssl-certificate self-signed keytool

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

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

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

我已经玩了几个小时的java keytool。

4 个答案:

答案 0 :(得分:60)

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

感谢Michael's Software Thoughts & Ramblings的迈克尔·马丁,我发现:

  

默认情况下,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" />    

答案 1 :(得分:3)

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

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

如果客户端使用自签名证书,则其“根”CA是证书本身;然后,您需要将客户端的自签名证书导入Tomcat的信任存储区。

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

更好的是,请让您的客户使用现有的免费CA,例如startcom.org。这并不总是适用于服务器证书,因为StartCom的证书不包含在所有浏览器中,但这种情况相反,可以轻松地将StartCom根证书导入Tomcat信任库。

答案 2 :(得分:2)

创建证书:

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

输入您需要的自签名证书的所有数据,然后编辑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

答案 3 :(得分:1)

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

<强> key_gen.sh:

tomcat8

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

reloadOnSearch: false