将 Satis 与 HTTPS(内部 CA)结合使用时,Composer 失败

Composer fails when using Satis with HTTPS (internal CA)

我正在尝试设置我们的内部 Satis 服务器,它应该可以通过 HTTPS 访问(证书由内部 CA 签名)。 在 Linux 上,一旦 CA 的根证书添加到证书存储(例如 /etc/ssl/certs/ca-certificates.crt),一切都会按预期进行。 但是在我的 Mac 上,即使在将证书添加到 OS X Keychain 之后,我仍然收到 "SSL operation failed with code 1" 错误。 在命令行上卷曲并在 PHP 中使用 libcurl 可以获取 HTTPS URL 但 Composer 和 file_get_contents(由 Composer 使用)总是抛出 "SSL operation failed with code 1" 错误。

我知道我可以在我的 php.ini 中指定 "openssl.capath" 但为什么它在不指定路径的情况下与 Curl 一起工作?

我终于弄明白是怎么回事了:

Curl 使用 SecureTransport 而不是 OpenSSL,因此它直接使用 OS X Keychain,因此可以使用 public CA 以及我们的内部 CA 签名的证书(我已经添加了它之前的系统钥匙串)。

file_get_contents 正在使用 OpenSSL,它使用自己位于 /usr/local/etc/openssl/cert.pem.

的 CA 包

由于 /usr/local/etc/openssl/cert.pem 默认仅包含 public 个 CA,我不得不将证书从我的钥匙串(系统和系统根)导出到 OpenSSL 的 cert.pem:security find-certificate -a -p /Library/Keychains/System.keychain /System/Library/Keychains/SystemRootCertificates.keychain | sudo tee /usr/local/etc/openssl/cert.pem

现在 file_get_contents() 适用于内部和外部 certificates/CAs。

但是 Composer 没有查看 /usr/local/etc/openssl/cert.pem,所以我不得不将 openssl.cafile php.ini 属性 设置为 cert.pem 的路径:

[openssl] openssl.cafile = /usr/local/etc/openssl/cert.pem