【问题标题】:OpenSSL with PHP 5.6 and Composer - Certificate verify failed带有 PHP 5.6 和 Composer 的 OpenSSL - 证书验证失败
【发布时间】:2015-12-11 22:09:34
【问题描述】:

我在 Linux Ubuntu 15.04 VM 上运行 Apache2。我创建了一个自签名的 openssl 证书。因此,我有以下文件夹结构: “usr/local/openssl”,而该目录包含以下主要文件夹:bin;证书;库;私人的; openssl.conf; ...

在 certs 文件夹中,我创建了一个“zertifikat-pub.pem”文件,并在私有文件夹中创建了一个“zertifikat-key.pem”文件。当尝试运行“composer update”以连接到在 apache2 上运行的存储库时,我不断收到以下错误:

错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败 无法启用加密 无法打开流:操作失败

运行“var_dump(openssl_get_cert_locations());”时,我得到以下信息:

根据我的阅读,default_cert_file 和 default_cert_dir 似乎有很大的错误,但我不知道如何更改它。

在 php ini 文件中,我添加了以下两行:

openssl.cafile=/usr/local/openssl/certs/ca.crt
openssl.capath=/usr/local/openssl/certs

此外,我将变量“SSL_CERT_FILE”和“SSL_CERT_DIR”更改为与 php.ini 中相同的路径。

在 openssl.conf 文件中,我设置了:

dir = /usr/local/openssl

在 apache2 虚拟主机文件(它在端口 443 上托管存储库,作曲家试图连接),我添加了:

# ssl
    SSLEngine on
    SSLCertificateFile      /usr/local/openssl/certs/ca.crt
    SSLCertificateKeyFile  /usr/local/openssl/private/ca.key

重新启动 apache 和计算机等并不能解决错误。总是获得相同的证书失败错误。

我做错了什么? 奇怪的行为是我可以在浏览器中访问该站点,但不能通过 composer..

我是否需要将一些文件复制到我的 Windows 客户端,例如导入证书?目前,ca.crt 和 ca.key 位于 linux 服务器上。我也尝试将ca.crt复制到windows并添加到windows上项目的composer.json文件中:

"options": {
            "ssl": {
                "local_cert": "C:/Users/Pb/Documents/ca.crt"
            }
        }

【问题讨论】:

    标签: php apache openssl ssl-certificate composer-php


    【解决方案1】:

    当您创建自签名证书时。它们将由“证书颁发机构”证书签名。这也将在您的本地计算机上。

    您的问题没有具体说明您是如何创建自签名证书的,但如果使用 openssl,它可能有如下命令:

    openssl ca -in apache.csr -cert /path/to/ca.crt -keyfile /path/to/ca.key -out apache.crt
    

    在您的 php.ini 中,cafile 需要指向 ca 证书而不是 apache:

    openssl.cafile=/path/to/ca.crt
    

    在 ssl 协商期间发生的情况是,Web 服务器将向客户端(composer)发送 apache.crt 内容的变体,其中包括证书如何签名的详细信息 - 在本例中是 ca.crt。客户端将其与由 openssl.cafile 设置的信任的证书列表进行比较。如果存在匹配并且各种加密校验和相加,则验证完成。如果没有匹配,则不匹配。

    ....... 在您回答后更新:

    设置 SSL 托管时,您需要做一些事情。

    1. 证书颁发机构 - 密钥和证书。这是客户端和服务器都必须信任的。通常这些是通过网络浏览器等中的预共享公共列表预先设置供公众使用的。但您可以创建和使用您自己的,就像您正在做的那样。
    2. 特定于站点的证书。这必须由证书颁发机构签名并在服务器上配置。虚拟主机时,证书的公用名必须与服务器的主机名匹配才能被视为有效。

    Apache 配置:

    SSLCACertificateFile /path/to/ca.crt
    SSLCertificateKeyFile /path/to/zertifikat-key
    SSLCertificateFile /path/to/zertifikat-pub.pem
    

    php 配置:

    openssl.cafile=/path/to/ca.crt
    

    如果文件的内容是正确的,那么我希望这可以工作。您还可以使用 curl 测试服务器配置:

    curl https://yoursite.com/ --cacert /path/to/ca.crt
    

    【讨论】:

    • 我编辑了我的问题并澄清了情况。也许你可以重读,我保证你现在会完全理解我的问题:)