【问题标题】:haproxy - unable to load SSL private key from PEM filehaproxy - 无法从 PEM 文件加载 SSL 私钥
【发布时间】:2015-03-12 22:25:16
【问题描述】:

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 时,一切正常。

【问题讨论】:

    标签: haproxy


    【解决方案1】:

    证书和密钥文件出现在 pem 中的顺序很重要。使用以下内容创建 pem 文件。

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

    【讨论】:

    • 这是我的 pem 文件中的顺序,您可以在我的问题中看到...但是谢谢
    • 这个答案解决了我的问题。谢谢你同样的错误!我忘了连接文件。
    • 这可能已经改变,因为我让它使用 PEM 文件中公共证书之前的私钥。我遇到了同样的错误,但在我的情况下,这是因为我在 Docker 中运行 HAProxy,但忘记向容器添加卷,以便 HAProxy 可以看到 PEM。
    • 谢谢。当我将 server.pem 文件提供给 haproxy 时,我遇到了同样的问题
    【解决方案2】:

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

    由于我在文件夹 /etc/haproxy/certificates 中有证书,因此以下命令可用于获取文件 restorecon -v -R /etc/haproxy 的正确权限(取决于您的操作系统和 SELinux 配置,这可能会或可能不会起作用)。

    【讨论】:

      【解决方案3】:

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

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

      拆分后,我可以启动 HaProxy 并正常加载:

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

      【讨论】:

        【解决方案4】:

        对于最新版本的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
        

        【讨论】:

          【解决方案5】:

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

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

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

          【讨论】:

            【解决方案6】:

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

            HAProxy 需要一个“完整链”——证书、中间权限(如果有的话),然后是私钥。例如:

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

            【讨论】:

              【解决方案7】:

              对我来说问题是键开头有一个奇怪的字符。

              当我cated 文件时,这个字符没有出现,因为这个字符是&lt;feff&gt;,也称为UTF-8 BOM (Byte Order Mark)。它只在我在 vim 中打开文件时出现。

              我不认为这会很常见,但希望它可以避免一些人头疼。

              【讨论】:

                【解决方案8】:

                仅供参考,在我的情况下,我在“-----BEGIN RSA PRIVATE KEY-----”序列前面有空格字符,这破坏了 pem 文件。

                【讨论】:

                  【解决方案9】:

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

                  【讨论】:

                    【解决方案10】:

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

                    #!/bin/sh
                    
                    if [ "$2" == "add" ]; then
                      sudo touch /etc/haproxy/ssl/$1
                      sudo cat $1 > /etc/haproxy/ssl/$1
                      sudo chmod 644 /etc/haproxy/ssl/$1
                    fi
                    if [ "$2" == "delete" ]; then
                      sudo rm /etc/haproxy/ssl/$1
                    fi
                    
                    echo "performed $2 on $1";
                    

                    【讨论】:

                      猜你喜欢
                      • 2015-09-26
                      • 2020-06-30
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2013-04-24
                      • 2013-05-13
                      • 2021-03-14
                      相关资源
                      最近更新 更多