php - 带有 PHP 5.6 和 Composer 的 OpenSSL - 证书验证失败

标签 php apache openssl ssl-certificate composer-php

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

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

error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed Failed to enable crypto failed to open stream: operation failed

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

dump

根据我的阅读,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 虚拟主机文件(在 composer 尝试连接的端口 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"
            }
        }

最佳答案

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

你的问题没有具体说明你是如何创建自签名证书的,但是如果使用 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 协商期间发生的事情是网络服务器将 apache.crt 内容的变体发送到客户端(编写器),其中包括证书如何签名的详细信息 - 在本例中为 ca.crt。客户端将其与它信任的由 openssl.cafile 设置的证书列表进行比较。如果匹配且各种加密校验和相加,则验证完成。如果没有匹配项,则不会。

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

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

  1. 证书颁发机构 - key 和证书。这是客户端和服务器都必须信任的。通常这些都是通过网络浏览器等中的预共享公共(public)列表预先设置为供公众使用。但也可以创建和使用您自己的列表,这就是您正在做的事情。
  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

关于php - 带有 PHP 5.6 和 Composer 的 OpenSSL - 证书验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34233351/

相关文章:

javascript - 在文件下载完成之前、同时或之后发送 JavaScript 警报

php - 如何显示 Joomla 组件列表中的默认类别?

apache - 使用 Apache 服务器和 Elastic Load Balancer 在 Windows EC2 实例上使用 AWS 证书

apache - cgi-bin 目录中的基础设施标准

java - 我可以调试由 Tomcat 运行的 GWT-RPC 程序和由 Apache Web 服务器运行的静态内容吗(使用 IntelliJ)

ssl - SOAPUi 和 keystore

php - 在父 Controller 上调用方法?

php - 没有 Composer 的狂欢

ssl - Paypal SSL 证书更改 : Testing Verisign G5 Certificate

ios - 找不到 lcrypto 的库