【问题标题】:Need to configure Tomcat 7 for SSL需要为 SSL 配置 Tomcat 7
【发布时间】:2018-08-01 18:57:24
【问题描述】:

我正在努力为 SSL 配置 Tomcat,如果有任何帮助,我将不胜感激。出于我的目的,我需要创建一个根证书和一个由根证书签名的服务器证书。

为了帮助我理解,我将其分为两个步骤:使用 openssl 创建证书,以及将证书导入 Tomcat 的密钥库。这是我使用 openssl 和 keystore 命令的步骤顺序。

-- Create certficates --
1. Create CA key in private directory:                                               
openssl genrsa -out CA.key 4096
2. Create CA PEM request using CN <Root Name> and CA key:  
openssl req -key ../private/CA.key -new -out CA.req
3. Create CA PEM using Create CA PEM request:                   
openssl x509 -req -days 365 -in CA.req -signkey ../private/CA.key -sha256 -out CA.pem
4. Create server key (encrypted with password):                      
openssl genrsa -des3 -out server.key 4096
5. Create server PEM request using CN <FQDN of Server>:  
openssl req -new -key server.key -out server.req
6. Create server PEM using Create server PEM request:           
openssl x509 -req -days 3650 -in server.req -signkey ../private/CA.key -out server.pem
7. Export CA certificate as PKCS12 file (possibly not necessary):
openssl pkcs12 -export -inkey ../private/CA.key -in CA.pem -out CA.p12 
8. Export server certificate as PKCS12 file:
openssl pkcs12 -export -inkey ../private/CA.key -in server.pem -out server.p12

-- Install certificates --
9. Add CA PEM to server keystore:
keytool -import -trustcacerts -alias root -file CA.pem -keystore keystore.jks
10. Add server PKCS12 to client keystore:
keytool -import -alias server -file server.p12 -keystore KeyStore.jks

在最后一个命令中,我收到以下错误消息:

keytool error: java.lang.Exception: Input not an X.509 certificate

我不完全理解 PEM 和 PKCS12 格式之间的关系,以及为什么我需要导入 PEM 格式的根证书和 PKCS12 格式的服务器证书 - 也许这就是我出错的地方?

感谢您的帮助。

【问题讨论】:

    标签: java ssl tomcat7 x509 keytool


    【解决方案1】:

    我认为上述答案是正确的,但如果它对任何发现此问题的人有所帮助,那么我只是在此处发布我开始工作的脚本(将&lt;password&gt; 替换为提示时使用的密码):

    REM Create certficates --
    REM 1. Create CA key in private directory:                                               
    REM openssl genrsa -out CA.key 4096
    REM 2. Create CA PEM request using CN <Root Name> and CA key:  
    openssl req -key ../private/CA.key -new -out CA.req
    REM 3. Create CA PEM using Create CA PEM request:                   
    openssl x509 -req -days 365 -in CA.req -signkey ../private/CA.key -sha256 -out CA.pem
    REM 4. Create server key (encrypted with password):                      
    openssl genrsa -des3 -out server.key 4096
    REM 5. Create server PEM request using CN <FQDN of Server>:  
    openssl req -new -key server.key -out server.req
    REM 6. Create server PEM using Create server PEM request:           
    openssl x509 -req -days 3650 -in server.req -CA CA.pem -CAkey ../private/CA.key -CAcreateserial -CAserial ca.srl -out server.pem
    REM 7. Export CA certificate as PKCS12 file (possibly not necessary):
    REM openssl pkcs12 -export -inkey ../private/CA.key -in CA.pem -out CA.p12 
    REM 8. Export server certificate as PKCS12 file:
    openssl pkcs12 -export -in server.pem -inkey server.key -out server.p12 -name server -CAfile CA.pem -caname root
    
    REM -- Install certificates --
    REM 9. Add CA PEM to server keystore:
    keytool -import -trustcacerts -alias root -file CA.pem -keystore keystore.jks
    REM 10. Add server PKCS12 to keystore:
    keytool -importkeystore -deststorepass <password> -destkeypass <password> -destkeystore keystore.jks -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass <password> -alias server
    REM 11. List keys in keystore
    keytool -list -keystore keystore.jks
    

    【讨论】:

      【解决方案2】:

      大部分都是骗HAProxy SSL termination + client certificate validation + curl / java client

      首先,您的#6 是错误的;您不会创建由 CA 签名的服务器证书,而是使用服务器名称和 CA 密钥创建自签名证书。这就是为什么您的#8 需要将“服务器”证书与 CA 密钥配对,这通常没有意义。在 #6 中使用 -CA-CAkey,并更改 8 以使用服务器密钥和服务器证书最好也是 CA 证书(仅限)作为 CA 证书使用-CA——即:

       openssl pkcs12 -export -in server.pem -inkey server.key -CA CA.pem -out server.p12
      

      其次,正如我现在更新的欺骗中所解释的那样,您可能根本不需要转换为 JKS; Java 通常可以处理 PKCS12。但是如果你这样做,你需要使用-importkeystore,如图所示,这是一个单独的不同操作,而不是-import[cert]

      最后,您的部分困惑可能是由于误用“PEM”造成的。 PEM 不是一个单一的东西。它是一种可用于多种用途的格式,由包含 5 个连字符的 BEGIN 行、单词 BEGIN、一个或几个标识数据类型的单词以及另外 5 个连字符组成;然后是一个可选的(并且相当少见的)RFC822 样式的标头;然后一行或多行 base64 编码 BEGIN 行指定的任何数据;然后是 END 而不是 BEGIN 的类似行。

      PEM 可用于证书(几种格式)、密钥(几种格式)、CSR、CRL、OCSP 请求和响应、多种格式的消息,也许还有其他东西。您命名为“.pem”的文件更准确地说是 PEM 格式的证书;您使用的“.key”和“.req”文件也是 PEM 格式,但不是证书,而是密钥和证书请求 (CSR)。证书文件(PEM 或任何其他格式)和 PKCS12 文件之间的关键区别(请原谅双关语)是 PKCS12 通常包含私钥证书或(通常)“链”的几个证书。 (尽管 Java9 使用 - 可以说是滥用 - PKCS12 所以它可以只包含证书;这是非常规且 AFAICT 无法互操作的。)

      所有这些 PEM 文件都有非 PEM 等效文件,OpenSSL 将其称为“DER”(尽管“二进制”可能更准确)。您可以在 PEM DER 中拥有证书,但它仍然是证书;您可以在 PEM DER 中有一个密钥;等PKCS12是个例外;它仅支持二进制/非 PEM 格式。尽管并非所有 OpenSSL 命令在所有情况下都支持 PEM 和 DER。 您的错误消息不是由于尝试“-importcert”非 PEM 格式的东西,而是尝试“-importcert”不是特定证书(任何格式)的东西。这就是为什么它说“输入不是 X.509 证书”——这意味着输入不包含证书。

      通常情况下(与此处无关的极少数例外情况)SSL/TLS 服务器需要私钥证书或链;像旧 Tomcat 这样的 Java SSL/TLS 服务器需要 Java 支持的密钥库格式的私钥和证书/链,如上可以是 JKS 或 PKCS12。 (Tomcat 8.5 和 9 将此更改为“合并”Java JSSE 和 APR OpenSSL 的配置。)如果您正在导入 CA 为在 Java 中生成的密钥对颁发的证书回复,并且特别是在密钥库文件中,那么您通常需要导入构成该链的多个证书,作为单个链(通常是 P7B)或从根目录单独开始;您可能一直在查看该案例的说明,这不是您在 OpenSSL 而不是在 Java 密钥库中生成密钥对(以及证书)的情况。

      SSL/TLS 客户端 OTOH 只需要信任锚证书(无密钥),通常是根 CA 证书。对于由“真实”(公共)CA 颁发的证书,包括 Java 在内的大多数客户端已经内置了公共根 CA,但是由于您正在创建自己的 CA,因此您需要(仅)将 CA 证书分发给您的客户端( )(可能除了忽略不正确证书的任何证书,例如openssl s_clientcurl -k)。

      最后一个警告:以这种方式使用 OpenSSL 生成的证书(因此您的服务器使用它们)将无法在 Chrome 58 或更高版本(自 2017 年中期以来)中运行,因为它现在需要 SubjectAltNames aka SAN;请参阅许多关于此的现有问题。

      【讨论】:

      • 哇 - 这非常有用 - 谢谢。我还没有尝试过您建议的更改,但我希望它会起作用!
      • 我将第 6 步更新为: openssl x509 -req -days 3650 -in server.req -CA CA.pem -CAkey ../private/CA.key -out server.pem 但不幸的是我得到了以下错误:CA.srl:没有这样的文件或目录
      • 一点谷歌搜索建议将其更新为: openssl x509 -req -days 3650 -in server.req -CA CA.pem -CAkey ../private/CA.key -CAcreateserial -CAserial ca .srl -out server.pem 我做了并且它运行了(并且也创建了一个 ca.srl 文件)。但是现在第 8 步失败了。当我运行 openssl pkcs12 -export -in server.pem -inkey server.key -CA CA.pem -out server.p12 时出现错误:pkcs12: Unknown cipher CA
      • 我得到了第 8 步:openssl pkcs12 -export -in server.pem -inkey server.key -CAfile CA.pem -out server.p12
      • @user304582:在第 6 步,您的修复工作有效,或者您可以手动预填充串行文件;我更喜欢后者,因为它可以防止以后创建具有相同颁发者和序列号的两个证书,这可能会导致问题。在第 8 步,pkcs12 -export ... -CAfile 是对的——抱歉,我写错了。很高兴你还是想通了。
      猜你喜欢
      • 1970-01-01
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 2013-12-01
      • 2017-05-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      相关资源
      最近更新 更多