haproxy - 无法从 PEM 文件加载 SSL 私钥

haproxy - unable to load SSL private key from PEM file

haproxy 不再启动,显示错误

bind <ip>:443' : unable to load SSL private key from PEM file ...

我们没有对证书或配置进行任何更改。自上次启动以来,我们只对系统进行了正常更新。

为了找到错误,我生成了一个全新的证书(自签名),但错误仍然存​​在。

这是 PEM 文件的结构:

-----BEGIN CERTIFICATE-----
MIIDXjCCAkY...
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKC....
-----END RSA PRIVATE KEY-----

我也试过用

转换私钥
openssl pkcs8 -topk8 -inform pem -in server.key -outform pem -nocrypt -out server_new.key

但 haproxy 仍然显示相同的错误。

我已经尝试了几个小时,但找不到原因。请帮忙!谢谢!

更新:

问题与文件访问有关。 PEM 文件存储在 /data/ssl/domainname/domainname.pem。文件权限没问题。当我将 PEM 文件移动到 /etc/haproxy 时,一切正常。

证书和密钥文件在 pem 中的显示顺序很重要。使用以下命令创建 pem 文件。

cat example.com.crt example.com.key > example.com.pem

我的问题是密钥开头有一个奇怪的字符。

当我 cat 编辑文件时,这个字符没有出现,因为该字符是 <feff>,也称为 UTF-8 BOM (Byte Order Mark)。它只在我打开 vim.

中的文件时出现

我不认为这会很常见,但希望它能减轻一些人的头痛。

我 运行 在 CentOS 遇到的问题是 SELinux 妨碍了我。要测试 SELinux 是否是问题所在,请以 root 身份执行以下命令:setenforce 0,然后尝试重新启动 haproxy。如果成功,则存在 SELinux 问题。 (您现在可以重新启用 SELinux 并尝试使用命令 setenforce 1 修复潜在问题)。

因为我在文件夹 /etc/haproxy/certificates 中有证书,所以以下命令可以获取对文件 restorecon -v -R /etc/haproxy 的正确权限(取决于您的 OS 和 SELinux 配置,这可能或可能无法工作)。

我也遇到了这个错误。在开始扯头发之前,您可能想尝试从私钥中删除密码。它为我解决了问题。我认为 HAProxy 应该在重新启动时询问您密码,但在我的情况下它没有使用 'sudo /etc/init.d/haproxy restart

要删除密码,请尝试 'openssl rsa -in [PRIVATE_KEY_FILE] -out nopassphrase.key'

是否需要密码?下面的 link 中有讨论。 https://security.stackexchange.com/questions/70495/ssl-certificate-is-passphrase-necessary-and-how-does-apache-know-it

对我来说,问题是由组合 PEM 文件中的这一行引起的:

-----END CERTIFICATE----------BEGIN RSA PRIVATE KEY-----

拆分后我可以启动 HaProxy 并加载它 OK:

-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----

仅供参考,在我的例子中,我在“-----BEGIN RSA PRIVATE KEY-----”序列前面有 space 个字符,这破坏了 pem 文件。

您是否将证书的私钥附加到文件末尾?

HAProxy 需要 "full chain" - 证书、中间机构(如果有的话),然后是私钥。例如:

cat cert.pem cert.key > /haproxy/certs/fullchain.pem

对于最新版本的 letsencrypt certbot,fullchain.pem 和 privkey.pem 文件将在 /etc/letsencrypt/live/example.com 文件夹中为您生成。它们需要结合起来才能让 HAProxy 正确读取。

cat fullchain.pem privkey.pem > example.com.pem

在 HAProxy 配置中 /etc/haproxy/haproxy.cfg

bind *:443 ssl crt /etc/letsencrypt/live/example.com/example.com.pem

我想补充一点,对于加入这里并遇到同样问题的人,你也必须将你的中间证书保存在链中...... 因此,如果您有一个包含多个层的链,不仅要将 rootca 还要将中间证书放入您的 pem 文件中

SElinux 也是我的问题。 HAProxy 报告由于权限原因无法读取文件,即使权限与文件夹中的其他 pem 文件相匹配。我们的流程是自动化的,这可能是涉及 SELinux 的原因。到目前为止似乎对我有用的解决方案(离开 SELinux 运行)是:

#!/bin/sh

if [ "" == "add" ]; then
  sudo touch /etc/haproxy/ssl/
  sudo cat  > /etc/haproxy/ssl/
  sudo chmod 644 /etc/haproxy/ssl/
fi
if [ "" == "delete" ]; then
  sudo rm /etc/haproxy/ssl/
fi

echo "performed  on ";