从 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 文件的设置上。
我使用以下命令创建证书:
- 创建密钥库
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
- 创建 CSR
keytool -keystore test.jks -alias localhost -certreq -file cert-file -storepass changeit -sigalg SHA256withRSA -keysize 2048 -keyalg RSA
将根证书、中间证书和服务证书下载到服务器
将证书导入 jks 文件
keytool -importcert -file $CERT -alias $ALIAS -keystore test.jks
- 将jks转换为p12文件
keytool -importkeystore -srckeystore test.jks -destkeystore test.p12 -srcstoretype jks -deststoretype pkcs12
- 提取私钥,无需密码:
openssl pkcs12 -in test.p12 -nodes -nocerts -out key.pem
- 将私钥转换为rsa密钥:
openssl rsa -in key.pem -check -out rsa.pem
- 提取证书,无需密码:
openssl pkcs12 -in test.p12 -nokeys -out cert.pem
- 将 rsa 和 cert 文件合并为一个 pem 文件。
cat rsa.pem cert.pem > certrsa.pem
- 文件的 rsa 部分的正确格式。这是:
RSA key ok
-----BEGIN RSA PRIVATE KEY-----
应该变成这样(请告诉我如何正确地做到这一点:
Bag Attributes
friendlyName: *****
localKeyID: *****
Key Attributes: <No Attributes>
-----BEGIN RSA PRIVATE KEY-----
- 检查生成的 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-----
顺序应该像下面这样
- 私钥
- 服务器证书
- 中级证书
- 根证书(可选)