【发布时间】:2012-07-19 15:41:23
【问题描述】:
我想有以下场景:
- 创建我自己的 CA
- 创建服务器证书并使用我的 CA 对其进行签名
- 创建多个客户端证书并使用我的 CA 对其进行签名
接下来,我想验证每个提供由我的 CA 签名的证书的客户端。
是否可以在不将每个客户端证书添加到我的 tomcat 密钥库的情况下实现这种情况?我只想验证客户端提供的证书是否由我的 CA 颁发和签名。
【问题讨论】:
我想有以下场景:
接下来,我想验证每个提供由我的 CA 签名的证书的客户端。
是否可以在不将每个客户端证书添加到我的 tomcat 密钥库的情况下实现这种情况?我只想验证客户端提供的证书是否由我的 CA 颁发和签名。
【问题讨论】:
免责声明:仅在开发环境中使用自签名根证书。
如需更完整的概述(逐步):
Create a root certificate
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 365
Create a key and CSR
openssl genrsa -out mycert.key 2048
openssl req -new -nodes -key mycert.key -out mycert.csr
Sign the CSR with your root certificate
openssl x509 -req -in mycert.csr -CA cert.pem -CAkey key.pem -CAcreateserial -out mycert.pem
Create a PKCS#12 certificate with the cert and key
openssl pkcs12 -export -out mycert.p12 -inkey mycert.key -in mycert.pem
Create a separate JKS keystore containing just the CA certificate (to use as the truststore)
keytool -import -alias my-ca -keystore truststore.jks -file cert.pem
这适用于 Ian Roberts 的 Tomcat 配置。
【讨论】:
是的,这当然是可能的,而我正是这样做的。如果您使用包含 CA 证书的信任库配置 Tomcat,那么它应该接受由该 CA 签名的任何客户端证书。
我假设您已经生成了 CA 密钥和根证书,并且您知道如何使用它将 CSR 转换为证书。
首先生成您的服务器密钥,以及相应的 CSR
$ openssl genrsa -out XXX.key 2048
$ openssl req -new -nodes -key XXX.key -out XXX.csr
使用您的 CA 证书签署 CSR,生成服务器证书 XXX.crt。现在将服务器密钥、服务器证书和 CA 证书打包到单个 PKCS#12 文件中
$ cat XXX.crt ca-certificate.pem | openssl pkcs12 -export -inkey XXX.key -out XXX.p12 -name tomcat -caname myauthority
此过程将提示您输入多个密码,将它们全部设置为相同的值(这个值是什么并不重要,它不必是安全密码,它必须是非空 - 我使用 changeit)。
这个.p12 文件现在可以作为Tomcat 的keystore。接下来,您需要创建一个单独的 JKS 密钥库,其中仅包含 CA 证书以用作 truststore。
$ keytool -import -alias myauthority -keystore truststore.jks -file ca-certificate.pem
再次,使用相同的非空密码回复所有密码提示,例如changeit。
终于可以配置Tomcat了:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
connectionTimeout="20000"
keystoreFile="${catalina.home}/conf/XXX.p12"
keystoreType="PKCS12"
keystorePass="changeit"
truststoreFile="${catalina.home}/conf/truststore.jks"
truststoreType="JKS"
truststorePass="changeit"
clientAuth="true" sslProtocol="TLS" />
【讨论】:
你应该看看 openSSL :http://openssl.org/ 或者,如果您想要一个免费的现有 CA(但您必须每个月都这样做),那就是:http://www.startssl.com/
【讨论】: