【问题标题】:Tomcat and SSL Client certificateTomcat 和 SSL 客户端证书
【发布时间】:2012-07-19 15:41:23
【问题描述】:

我想有以下场景:

  1. 创建我自己的 CA
  2. 创建服务器证书并使用我的 CA 对其进行签名
  3. 创建多个客户端证书并使用我的 CA 对其进行签名

接下来,我想验证每个提供由我的 CA 签名的证书的客户端。

是否可以在不将每个客户端证书添加到我的 tomcat 密钥库的情况下实现这种情况?我只想验证客户端提供的证书是否由我的 CA 颁发和签名。

【问题讨论】:

    标签: tomcat ssl


    【解决方案1】:

    免责声明:仅在开发环境中使用自签名根证书。

    如需更完整的概述(逐步):

    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 配置。

    【讨论】:

      【解决方案2】:

      是的,这当然是可能的,而我正是这样做的。如果您使用包含 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" />
      

      【讨论】:

      • 另外,如果您不知道如何处理CA,可以查看this(包括工具链接的cmets):最难的是管理部分。
      【解决方案3】:

      你应该看看 openSSL :http://openssl.org/ 或者,如果您想要一个免费的现有 CA(但您必须每个月都这样做),那就是:http://www.startssl.com/

      【讨论】:

      • 这用于客户端证书。在极少数情况下,将普通 Internet PKI 用于用于对服务进行身份验证的客户端证书是适当且明智的。
      • 也许只有在您有气隙网络并且将两台机器相互连接而不是互联网的情况下。
      猜你喜欢
      • 2010-10-16
      • 2017-06-01
      • 1970-01-01
      • 2015-07-27
      • 2013-06-20
      • 1970-01-01
      • 2013-08-04
      • 2017-04-28
      • 2012-02-15
      相关资源
      最近更新 更多