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

Openssl 将中间证书添加到pkcs12文件,openssl,ssl-certificate,jboss6.x,pkcs#12,Openssl,Ssl Certificate,Jboss6.x,Pkcs#12,我有一份具有以下认证链的证书: 委托->我的CA->我的颁发CA->我的JBoss证书。现在,如果我在我的JBoss实例上安装了我的证书,那么在这个实例上运行的任何我访问的页面都将显示为不可信,因为我的浏览器无法识别我的颁发CA。我知道我的计算机具有委托签署机构的公钥。如何安装证书,以便任何浏览器都可以看到整个证书链 我制作了一个包含所有证书的.pem文件,认为这样做是可行的。事实并非如此。有人能解释我做错了什么,或者即使这是可能的吗 我有一个具有以下认证链的证书:委托->我的CA->我的颁发C

我有一份具有以下认证链的证书: 委托->我的CA->我的颁发CA->我的JBoss证书。现在,如果我在我的JBoss实例上安装了我的证书,那么在这个实例上运行的任何我访问的页面都将显示为不可信,因为我的浏览器无法识别我的颁发CA。我知道我的计算机具有委托签署机构的公钥。如何安装证书,以便任何浏览器都可以看到整个证书链

我制作了一个包含所有证书的.pem文件,认为这样做是可行的。事实并非如此。有人能解释我做错了什么,或者即使这是可能的吗

我有一个具有以下认证链的证书:委托->我的CA->我的颁发CA->我的JBoss证书

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

首先,简单的问题。服务器必须发送终端实体(服务器)证书和任何中间证书以构建所需链。服务器发送中间证书以避免“哪个目录”问题。“哪个目录”是PKI中众所周知的问题。本质上,客户端不知道去哪里获取丢失的中间证书

因此,您的第一个解决方案是让服务器发送一个包含以下内容的链:

  • 您的中级证书(“我的颁发CA”)
  • 您的服务器证书(“我的JBoss证书”)
其次,您有一个不受信任的发行人的问题。客户必须信任您的内部发行CA

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

您可以让服务器发送带有“我的CA”、“我的颁发CA”和“我的JBoss证书”的链。在这种情况下,客户必须信任“委托”

如果客户不信任“委托”或“我的CA”,则您将收到验证错误


我制作了一个包含所有证书的.pem文件,认为这样做是可行的。事实并非如此。有人能解释我做错了什么,或者即使这是可能的吗


在这种情况下,我们需要查看证书以了解发生了什么。你能发布一个服务于证书和使用链的URL吗;并将您的内部CA(“我的CA”)证书发布到网上

这里有一种快速而肮脏的方法来测试与OpenSSL的
s\u客户端的连接:

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,那么问题在于浏览器和信任点

正在将中间证书添加到pkcs12文件

下面是我如何在我的web和邮件服务器上执行此操作的

首先,
www-example-com.crt
是Startcom签署的web服务器证书。Startcom提供免费的Class 1证书,这是我最信任的浏览器和移动设备,所以我使用它们。证书采用PEM格式(
----开始证书---
----结束证书---

其次,我打开
www-example-com.crt
并附加Startcom的Class 1中间层。我从Startcom那里得到了中间体。现在,我的
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 -----
委托人在提供其CA和中级证书。我不能告诉你你需要哪一个,因为你不会提供一个URL或向我们展示你的链接。但我猜它将是一个或多个:

  • 委托L1E链证书
  • 委托L1C链证书
  • 委托L1E链条证书(SHA2)
  • 委托L1C链条证书(SHA2)
您可以使用OpenSSL的` s_客户端测试您的链。这一次,您将使用委托人的认证:

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

您可以从中获取
trustate-ca.pem
。运行它并告诉我们您遇到了哪些错误。或者更好的办法是,将URL发布到您的服务器上,这样我们就可以看到发生了什么。

我的客户确实信任我。委托包含在所有主要浏览器的信任库中。我创建了一个pkcs12文件,其中包括委托、我的CA、我的颁发CA和我的服务器的所有公钥以及我的服务器的私钥。当我使用openssl s_客户端-主机“server.com”-端口443-showcerts查询我的服务器时,我只看到我的证书。“在这种情况下,我们需要查看证书以了解发生了什么。你能发布一个服务于证书并使用该链的URL吗?并将你的内部CA(“我的CA”)证书发布到网上吗?”我不能,很遗憾,这没有帮助。当我在一个pen文件中包含所有证书并查询我的服务器时,我成功地运行了openssl命令。该命令能够解析服务器的证书和权限。“…所有委托的公钥,我的CA,我的颁发CA…”-这里有两件事。(1) 证书链需要证书,而不是公钥。文件中证书的顺序有时很重要。(2) 证书链不需要委托;如果您已在托管工作站和设备中预加载了您组织的CA证书,则不需要“我的CA”。“当我使用openssl s_客户端查询我的服务器时…”-您使用什么来
-CAfile
??连接我的pem编码证书链(减去委托)工作成功。通过将我公司的ca、我公司的ca签名机构和我的box证书连接到一个pem.crt中,我能够与我的JBoss实例建立一个安全的http连接,然后将它与我的box私钥一起导出到pkcs12文件中。
echo -e "GET / HTTP/1.0\r\n" | openssl s_client -connect myserver:8443 \
                                       -CAfile entrust-ca.pem