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

问题描述:

我有一个运行自签名SSL证书的Apache Tomcat 6.x服务器。我希望客户端将自己的证书提交给服务器,以便我可以基于用户数据库对其进行身份验证。我基于我在网上找到的一个例子开展工作,但这个例子带有罐装证书和一个预先构建的JKS数据存储。我想用自己的证书创建自己的数据存储区,但没有运气。Tomcat服务器/客户端自签名SSL证书

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

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

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

终于得到了解决我的问题,因此,如果任何人卡住我会在这里发布结果。的Michael's Software Thoughts & Ramblings

感谢迈克尔·马丁,我发现:

密钥工具默认使用DSA 算法生成 自签名证书时。 的早期版本Firefox接受这些密钥而没有 问题。使用Firefox 3 beta 5,使用 DSA不起作用,但使用RSA。 生成 当自签名证书创建一个证书 火狐3测试版5完全 接受传递“-keyalg RSA”。

我只是设置该标志,清除所有在FireFox中的缓存,它的工作就像一个魅力!我使用这个作为我的项目的测试设置,我需要与其他人分享,所以我写了一个创建两个SSL证书的小批处理脚本。一个可以放入Tomcat设置中,另一个可以导入到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文件(仅在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的XML:

<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

非常感谢这个!我已经被各种各样的“教程”整天鬼混,这实际上与clientAuth =工作为先“的真“ – 2009-12-09 19:05:31

创建证书:

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

输入的所有数据,你需要那么SSL连接器上编辑Tomcat的server.xml中指定密钥库属性的自签名证书,如:

<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

我看到前面,它得到了我一半的答案,但是你错过更棘手的部分。我如何使用自签名客户端证书? 在您提供的示例中,它表示“clientAuth ='false'。” “ ”如果您希望Tomcat要求所有SSL客户端提供客户端证书才能使用此套接字,请将此值设置为true。“ 这就是我想要的。但是,我不能让服务器接受客户端的自签名的证书。 – davidemm 2009-07-24 23:13:37

要启用客户端验证,你需要指定一个“信任存储”为Tomcat:包含从根证书颁发机构的证书密钥存储,你放心,每个标记为“trustEntry”。

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

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

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

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

以前的答案对我很有用,但没有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,可以以下配置添加到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" 
    />