HAProxy - CA 签名证书不受信任,尽管位于信任库中

HAProxy - CA 签名证书不受信任,尽管位于信任库中

从 Stack Overflow 转发。有人建议我在这里发帖,因为 Stack Overflow 是用于编程的,而这个问题主要关注 SSL 和 HAProxy。

我正在尝试使用 HAProxy 完成 SSL 的设置。为此,我制作了一个 CSR 并将其发送给我的组织,并收到了受信任的证书。我从 jks 存储中创建了所需的 pem 文件,并将其设置在 haproxy.cfg 文件中。但是,浏览器仍然报告该站点不受信任,并且根证书不在受信任的存储中:

This CA Root certificate is not trusted because it is not in the Trusted Root Certification Authorities store.

不过,它下面的其他中间证书没有问题。我已经尝试在客户端安装证书,但它报告说它仍然不受信任。此外,当我让同事访问此页面时,他们遇到了同样的问题,尽管没有在客户端导入任何证书。这让我认为问题出在 pem 文件的设置上。

我使用以下命令创建证书:

  1. 创建密钥库
keytool -keystore test.jks -alias localhost -validity 365 -genkeypair -storepass changeit -keypass changeit -dname "CN=<FQDN for server>, OU=***** O=*****, L=*****, S=*****, C=*****" -ext SAN=DNS:$(hostname) -sigalg SHA256withRSA -keysize 2048 -keyalg RSA
  1. 创建 CSR
keytool -keystore test.jks -alias localhost -certreq -file cert-file -storepass changeit -sigalg SHA256withRSA -keysize 2048 -keyalg RSA
  1. 将根证书、中间证书和服务证书下载到服务器

  2. 将证书导入 jks 文件

keytool -importcert -file $CERT -alias $ALIAS -keystore test.jks
  1. 将jks转换为p12文件
keytool -importkeystore -srckeystore test.jks -destkeystore test.p12 -srcstoretype jks -deststoretype pkcs12
  1. 提取私钥,无需密码:
openssl pkcs12 -in test.p12  -nodes -nocerts -out key.pem
  1. 将私钥转换为rsa密钥:
openssl rsa -in key.pem -check -out rsa.pem
  1. 提取证书,无需密码:
openssl pkcs12 -in test.p12 -nokeys -out cert.pem
  1. 将 rsa 和 cert 文件合并为一个 pem 文件。
cat rsa.pem cert.pem > certrsa.pem
  1. 文件的 rsa 部分的正确格式。这是:
RSA key ok
-----BEGIN RSA PRIVATE KEY-----

应该变成这样(请告诉我如何正确地做到这一点:

Bag Attributes
    friendlyName: *****
    localKeyID: *****
Key Attributes: <No Attributes>
-----BEGIN RSA PRIVATE KEY-----
  1. 检查生成的 pem 文件以确保中间证书列在 RSA 密钥之后。否则,HAProxy 似乎会出错。

最终结果是具有以下格式的 pem 文件:

Bag Attributes
    friendlyName: <private key>
    localKeyID: ****
Key Attributes: <No Attributes>
-----BEGIN RSA PRIVATE KEY-----
<Hash goes here>
-----END RSA PRIVATE KEY-----
Bag Attributes
    friendlyName: <bottom certificate>
    2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
subject=/C=****/ST=****/L=****/O=**** PLC/OU=****/CN=****
issuer=/O=****/OU=<Intermediate CA>/CN=<Intermediate CA>
-----BEGIN CERTIFICATE-----
<Hash goes here>
-----END CERTIFICATE-----
Bag Attributes
    friendlyName: intermediate
    2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
subject=/O=****/OU=<Intermediate CA>/CN=<Intermediate CA>
issuer=/O=****/OU=<Root CA>/CN=<Root CA>
-----BEGIN CERTIFICATE-----
<Hash goes here>
-----END CERTIFICATE-----
Bag Attributes
    friendlyName: root
    2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
subject=/O=****/OU=<Root CA>/CN=<Root CA>
issuer=/O=****/OU=<Root CA>/CN=<Root CA>
-----BEGIN CERTIFICATE-----
<Hash goes here>
-----END CERTIFICATE-----

尽管最终的 pem 文件包含所有证书,但最终我得到的根证书仍不受信任。在我的整个过程中,我是否遗漏了什么或做错了什么?

更新:我能够使用 Chrome 提取根证书,并将其添加到我的本地证书存储中。当我之前安装它时,安装设置为自动搜索存储,因此很可能没有选择正确的票证。证书信息现在显示证书没有问题。但是,安全选项卡仍然报告:

Certificate - missing
This site is missing a valid, trusted certificate (net::ERR_CERT_AUTHORITY_INVALID).

更新 2:删除了文件末尾的自签名证书。我不确定它是如何进入请求的。

更新 3:删除 pem 文件末尾的自签名证书后,我不再收到来自 chrome 的警告,说证书无效。但是,当我与同事一起测试时,我们发现他们仍然收到错误。我现在的主要理论是他们需要在本地信任存储中下载并安装证书。我目前正在研究当没有人拥有证书时新网站如何处理这个问题。

答案1

请删除“Bag 属性”,因为它们是从 pfx 文件中获取的,而 pfx 是基于 Windows 的属性。它应该看起来像这样。

-----BEGIN RSA PRIVATE KEY-----
ENCRYPTED TEXT
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
ENCRYPTED TEXT
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
ENCRYPTED TEXT
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
ENCRYPTED TEXT
-----END CERTIFICATE-----

顺序应该像下面这样

  1. 私钥
  2. 服务器证书
  3. 中级证书
  4. 根证书(可选)

相关内容