Я пытаюсь настроить наш внутренний сервер Satis, который должен быть доступен через HTTPS (сертификат подписан внутренним центром сертификации).
В Linux все работает как положено, когда корневой сертификат CA добавлен в хранилище сертификатов (например, /etc/ssl/certs/ca-certificates.crt).
Но на моем Mac я получаю сообщение об ошибке «Сбой операции SSL с кодом 1» даже после добавления сертификата в цепочку ключей OS X.
Скручивание в командной строке и использование libcurl в PHP может извлечь URL HTTPS, но Composer и file_get_contents (который используется Composer) всегда выдают ошибку «Ошибка операции SSL с кодом 1».
Я знаю, что могу указать «openssl.capath» в моем php.ini, но почему он работает с Curl без указания пути?
Я наконец понял, что не так:
Curl использует SecureTransport вместо OpenSSL, поэтому он напрямую использует цепочку ключей OS X и поэтому работает с сертификатами, подписанными общедоступными CA, а также нашим внутренним CA (я уже добавлял его в системную цепочку ключей ранее).
file_get_contents использует OpenSSL, который использует свой собственный пакет CA, расположенный в /usr/local/etc/openssl/cert.pem
,
Поскольку /usr/local/etc/openssl/cert.pem по умолчанию содержит только общедоступные центры сертификации, мне пришлось экспортировать сертификаты из цепочки для ключей (системные и системные корни) в cert.pem OpenSSL: 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()
работает как для внутренних, так и для внешних сертификатов / CA.
Но Composer не смотрит в /usr/local/etc/openssl/cert.pem
поэтому мне пришлось установить свойство php.ini в openssl.cafile на путь cert.pem
:
[openssl]
openssl.cafile = /usr/local/etc/openssl/cert.pem
Других решений пока нет …