将中间证书添加到pkcs12文件

22

我有一个证书,其认证链如下:Entrust -> 我的CA -> 我的发行CA -> 我的JBoss证书。现在,如果我在我的JBoss实例上安装了我的证书,那么我访问的任何页面都将显示为不受信任,因为我的发行CA未被浏览器识别。我知道我的计算机拥有Entrust签名机构的公钥。我应该如何安装我的证书,以便任何浏览器都可以看到整个证书链?

我制作了一个所有证书的单个.pem文件,希望这样做可以解决问题。但是它并没有起作用。是否有人能够解释我做错了什么,或者是否有可能实现这一目标?

2个回答

34

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

以下是我在我的Web和邮件服务器上的操作方式。

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

第二步,我打开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 -----

证书链中的第三张证书 - My CA - 是可选的。如果你的客户端使用My CA作为信任锚点,那么你就不需要它。如果你的客户端使用Entrust作为信任锚点,那么你需要将其包含在内。

如果你cat你的www-example-com.crt并且它没有多个证书,则不要继续。在你的服务器证书具备验证证书链所需的所有必要中间证书之前,不要执行openssl pkcs12操作。

不要包含Entrust CA证书。


我怀疑Entrust也会使用一个中间证书进行签名。因此,你的证书链可能看起来像:

----- 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 -----

Entrust提供他们的CA和中间证书,网址为Entrust根证书。我无法告诉你需要哪一个,因为你没有提供URL或展示你所拥有的链。但我猜测你可能需要以下一种或多种证书:

  • Entrust L1E Chain Certificate
  • Entrust L1C Chain Certificate
  • Entrust L1E Chain Certificate (SHA2)
  • Entrust L1C Chain Certificate (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发布到你的服务器上,这样我们就能看到发生了什么。


将我的 PEM 编码证书链(除 Entrust 之外)连接起来成功了。我能够通过将我的公司 CA、公司 CA 签名机构和我的服务器证书连接成一个单独的 pem .crt 文件,然后将其与我的服务器私钥一起导出到 pkcs12 文件中,从而安全地建立与 JBoss 实例的 HTTP 连接。 - blackirishman
谢谢!未来的用户请注意 - 如果您从LetsEncrypt或类似的地方生成了证书,则可能会有一个“fullchain.pem”(已经连接),因此需要使用它而不是仅使用“cert.pem”。 - shad0w_wa1k3r

0
我有一个证书,其认证链如下:Entrust->My CA->My Issuing CA->My JBoss Certificate...
我认为你在这里有两个问题。第一个是签名的CA,第二个是不完整的客户端链。
首先,容易解决的问题。服务器必须发送终端实体(服务器)证书和任何中间证书以构建所需的链。服务器发送中间证书以避免“哪个目录”问题。 “哪个目录”是PKI中众所周知的问题。基本上,客户端不知道去哪里获取缺失的中间证书。
因此,您的第一个解决方案是让服务器发送以下链:
- 您的中间证书('My Issuing CA') - 您的服务器证书('My JBoss Certificate')
其次,您面临的问题是不受信任的发行者。客户端必须信任您的内部颁发CA。
因此,您的第二个解决方案是确保客户端信任您的内部CA('My CA')。在这种情况下,客户端甚至无需使用Entrust,因为信任点根源于您的内部CA。

您可以让服务器发送一个包含'My CA'、'My Issuing CA'和'My JBoss Certificate'的证书链。在这种情况下,客户端必须信任'Entrust'。

如果客户端不信任'Entrust'或'My CA',则会出现验证错误。


我制作了一个包含所有证书的单个.pem文件,以为这样就可以了。但是没有成功。有人能解释一下我做错了什么,或者这是否可能吗?
在这种情况下,我们需要查看证书以了解情况。您能否发布一个提供证书并使用链的URL,并在线发布您的内部CA(“我的CA”)证书?
以下是使用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,则问题可能出在浏览器和信任点上。

我的客户信任Entrust。Entrust已包含在所有主要浏览器的信任存储中。我创建了一个pkcs12文件,其中包括Entrust、我的CA、我的颁发CA和我的服务器的所有公钥以及我的服务器的私钥。当我使用openssl s_client -host "server.com" -port 443 -showcerts查询我的服务器时,我只看到了我的证书。 - blackirishman
在这种情况下,我们需要查看证书以了解发生了什么。您能发布一个提供证书并使用链的URL吗?并且在线发布您的内部CA(“我的CA”)证书吗?很遗憾我不能提供,这没有帮助。当我将所有证书包含在单个pen文件中并查询我的服务器时,我成功运行了openssl命令。该命令能够解析服务器的证书和授权。 - blackirishman
“... Entrust、My CA、My Issuing CA 的所有公钥…” - 这里有两个问题。(1) 证书链需要证书,而不是公钥。文件中证书的顺序有时很重要。(2) 证书链不需要 Entrust;如果您已经在托管的工作站和设备中预加载了组织的 CA 证书,则不需要“我的 CA”。 - jww
当我使用openssl s_client查询我的服务器时...你用的是什么-CAfile??? - jww

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接