使用 PHP 5.6 和 Composer 的 OpenSSL - 证书验证失败
OpenSSL with PHP 5.6 and Composer - Certificate verify failed
我 运行 在 Linux Ubuntu 15.04 虚拟机上安装 Apache2。我创建了一个自签名的 openssl 证书。因此,我有以下文件夹结构:
"usr/local/openssl",而该目录由以下主要文件夹组成:bin;证书;库;私人的; openssl.conf; ...
在 certs 文件夹中,我创建了一个 "zertifikat-pub.pem" 文件,在 private 文件夹中创建了一个 "zertifikat-key.pem" 文件。当尝试 运行 "composer update" 连接到 apache2 上的存储库 运行ning 时,我不断收到以下错误:
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());"时,我得到以下信息:
根据我的阅读,default_cert_file 和 default_cert_dir 似乎有很大的错误,但我不知道如何更改它。
在phpini文件中,我添加了以下两行:
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"
}
}
创建自签名证书时。他们将由 "Certificate Authority" 证书签名。这也将在您的本地计算机上。
你的问题没有具体说明你是如何创建自签名证书的,但如果使用 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 托管时,您需要做一些事情。
- 证书颁发机构 - 密钥和证书。这是客户端和服务器都必须信任的。通常这些是预先设置的 public 通过网络浏览器等中的预共享 public 列表使用。但也可以创建和使用您自己的列表,这就是您正在做的事情。
- 站点特定证书。这必须由证书颁发机构签名并在服务器上配置。 Web 托管时,证书的公用名必须与服务器的主机名匹配才能被视为有效。
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
我 运行 在 Linux Ubuntu 15.04 虚拟机上安装 Apache2。我创建了一个自签名的 openssl 证书。因此,我有以下文件夹结构: "usr/local/openssl",而该目录由以下主要文件夹组成:bin;证书;库;私人的; openssl.conf; ...
在 certs 文件夹中,我创建了一个 "zertifikat-pub.pem" 文件,在 private 文件夹中创建了一个 "zertifikat-key.pem" 文件。当尝试 运行 "composer update" 连接到 apache2 上的存储库 运行ning 时,我不断收到以下错误:
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());"时,我得到以下信息:
根据我的阅读,default_cert_file 和 default_cert_dir 似乎有很大的错误,但我不知道如何更改它。
在phpini文件中,我添加了以下两行:
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"
}
}
创建自签名证书时。他们将由 "Certificate Authority" 证书签名。这也将在您的本地计算机上。
你的问题没有具体说明你是如何创建自签名证书的,但如果使用 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 托管时,您需要做一些事情。
- 证书颁发机构 - 密钥和证书。这是客户端和服务器都必须信任的。通常这些是预先设置的 public 通过网络浏览器等中的预共享 public 列表使用。但也可以创建和使用您自己的列表,这就是您正在做的事情。
- 站点特定证书。这必须由证书颁发机构签名并在服务器上配置。 Web 托管时,证书的公用名必须与服务器的主机名匹配才能被视为有效。
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