将中间证书添加到pkcs12文件

时间:2014-03-24 18:50:26

标签: openssl ssl-certificate jboss6.x pkcs#12

我的证书具有以下认证链: Entrust->我的CA->我的发行CA->我的JBoss证书。现在,如果我在我的JBoss实例上安装我的证书,那么我在此实例上运行的任何页面都将显示为不可信,因为我的浏览器无法识别我的颁发CA.我知道我的计算机拥有Entrust签名权限的公钥。如何安装我的证书,以便任何浏览器都可以看到整个证书链?

我制作了一个包含所有证书的.pem文件。它没。谁能解释我做错了什么,或者即使这是可能的?

2 个答案:

答案 0 :(得分:21)

  

将中间证书添加到pkcs12文件中......

以下是我在网络和邮件服务器上的操作方法。

首先,www-example-com.crt是由Startcom签署的Web服务器证书。 Startcom提供免费的Class 1证书,可以信赖我的大多数浏览器和移动设备,因此我使用它们。证书采用PEM格式(----- BEGIN CERT ---------- END CERT -----)。

其次,我打开www-example-com.crt并附加Startcom的Class 1 Intermediate。我从Startcom的Index of /certs获得了中级。现在我的www-example-com.crt有两个PEM编码的编码证书。

第三,我执行以下操作来创建一个用于IIS的PKCS12 / PFX文件。

openssl pkcs12 -export -in www-example-com.crt -inkey www.example.key -out www-example-com.p12

在您的情况下,您的www-example-com.crt将至少包含三个PEM编码证书:

----- BEGIN CERT -----
< My JBoss Certificate >
----- END CERT -----

----- BEGIN CERT -----
< My Issuing CA >
----- END CERT -----

----- BEGIN CERT -----
< My CA >
----- END CERT -----

链中的第三个证书 - My CA - 是可选的。如果您的客户使用My CA作为信任锚,则不需要它。如果您的客户使用Entrust作为信任锚,则需要包含它。

如果您cat www-example-com.crt NOT 有多个证书,则请勿继续。在服务器证书具有验证链所需的所有必需中间证书之前,请不要执行openssl pkcs12

不要包含Entrust CA证书。


我怀疑Entrust直接与他们的CA签约。他们也可能使用中间体。所以你的证书链可能应该是这样的:

----- BEGIN CERT -----
< My JBoss Certificate >
----- END CERT -----

----- BEGIN CERT -----
< My Issuing CA >
----- END CERT -----

----- BEGIN CERT -----
< My CA >
----- END CERT -----

----- BEGIN CERT -----
< Entrust Intermediate >
----- END CERT -----

Entrusts在Entrust Root Certificates提供其CA和中级证书。我无法告诉您需要哪一个,因为您不会提供URL或向我们展示您拥有的链。但我猜它将成为一个或多个:

  • 委托L1E连锁证书
  • 委托L1C连锁证书
  • 委托L1E链证书(SHA2)
  • 委托L1C链证书(SHA2)

您可以使用OpenSSL的`s_client测试您的链。这次,您将使用Entrust的证书:

echo -e "GET / HTTP/1.0\r\n" | openssl s_client -connect myserver:8443 \
                                       -CAfile entrust-ca.pem

您可以从Entrust Root Certificates获取entrust-ca.pem。运行它并告诉我们你得到了什么错误。或者更好的是,将URL发布到您的服务器,以便我们可以看到正在发生的事情。

答案 1 :(得分:0)

  

我的证书具有以下认证链:Entrust-&gt;我的CA-&gt;我的签发CA-&gt;我的JBoss证书......

我认为你有两个问题。第一个是会签的CA,第二个是不完整的客户链。

首先,容易出问题。服务器必须将最终实体(服务器)证书和任何中间证书发送到所需的构建链。服务器发送中间证书以避免&#34;哪个目录&#34;问题。 &#34;哪个目录&#34;是PKI中众所周知的问题。从本质上讲,客户端不知道从哪里获取缺少的中间证书。

因此,您的第一个解决方案是服务器发送链:

  • 您的中级证书(&#39;我的签发CA&#39;)
  • 您的服务器证书(&#39;我的JBoss证书&#39;)

其次,您遇到了不受信任的发行人的问题。客户必须信任您的内部颁发CA.

因此,您的第二个解决方案是确保您的客户信任您的内部CA(&#39;我的CA&#39;)。在这种情况下,客户端甚至不需要使用Entrust,因为信任点植根于您的内部CA.

您可以让服务器通过“我的CA”,“我的发行CA”和“发布CA”来发送链。和我的JBoss证书&#39;。在这种情况下,客户必须信任'Entrust&#39;

如果客户不信任Entrust&#39;或者&#39;我的CA&#39;,然后您将收到验证错误。


  

我制作了一个包含所有证书的.pem文件。它没。谁能解释我做错了什么,或者即使这是可能的?

在这种情况下,我们需要查看证书以查看正在进行的操作。您是否可以发布提供证书并使用链的URL;并在线发布内部CA(&#39;我的CA&#39;)证书?

这是一种快速而肮脏的方法来测试与OpenSSL s_client的连接:

echo -e "GET / HTTP/1.0\r\n" | openssl s_client -connect myserver:8443 \
                                       -CAfile my-issuing-ca.pem

默认情况下,OpenSSL不信任任何内容(与浏览器不同),因此您必须使用-CAfile指定信任锚。

该命令应以类似于以下内容的方式结束。

SSL-Session:
    Protocol  : TLSv1
    Cipher    : DHE-RSA-AES256-SHA
    Session-ID: 37E5AF0EE1745AB2...
    Session-ID-ctx:
    Master-Key: 7B9F8A79D3CC3A41...
    Key-Arg   : None
    Start Time: 1243051912
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

如果OpenSSL命令导致OK,则问题出在浏览器和信任点上。