У меня странная проблема. Обновил мою машину LAMP dev (Debian) до PHP 7. После этого я больше не могу подключаться к определенному зашифрованному TLS API через Curl.
Соответствующий сертификат SSL подписан thawte.
curl https://example.com
дает мне
curl: (60) SSL certificate problem: unable to get local issuer certificate
в то время как
curl https://thawte.com
который, конечно же, также подписан Thawte works.
Я могу получить доступ к сайту API через HTTPS на других машинах, например мой рабочий стол через curl и в браузере. Таким образом, сертификат действителен. Рейтинг SSL Labs - A.
Любые другие запросы Curl с моей машины разработчика на другие сайты с шифрованием SSL работают. Мои корневые сертификаты обновлены. Чтобы проверить, я побежал update-ca-certificates
. Я даже скачал http://curl.haxx.se/ca/cacert.pem в / etc / ssl / certs и запустил c_rehash
.
Все та же ошибка.
Есть ли способ отладить процесс проверки и посмотреть, какой сертификат локального эмитента curl (или openssl) ищет, но не находит, то есть имя файла?
ОБНОВИТЬ
curl -vs https://example.com
сообщает мне (IP + домен анонимный)
* Hostname was NOT found in DNS cache
* Trying 192.0.2.1...
* Connected to example.com (192.0.2.1) port 443 (#0)
* successfully set certificate verify locations:
* CAfile: none
CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS alert, Server hello (2):
* SSL certificate problem: unable to get local issuer certificate
* Closing connection 0
И
echo | openssl s_client -connect example.com:443
дает
CONNECTED(00000003)
depth=2 C = US, O = "thawte, Inc.", OU = Certification Services Division, OU = "(c) 2006 thawte, Inc. - For authorized use only", CN = thawte Primary Root CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/C=DE/ST=XYZ/CN=*.example.com
i:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
1 s:/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
2 s:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2006 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA
i:/C=ZA/ST=Western Cape/L=Cape Town/O=Thawte Consulting cc/OU=Certification Services Division/CN=Thawte Premium Server CA/emailAddress=premium-server@thawte.com
---
Server certificate
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
subject=/C=DE/ST=XYZ/CN=*.example.com
issuer=/C=US/O=thawte, Inc./CN=thawte SSL CA - G2
---
No client certificate CA names sent
---
SSL handshake has read 4214 bytes and written 421 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: [...]
Session-ID-ctx:
Master-Key: [...]
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 300 (seconds)
TLS session ticket:
0000 - 5a 95 df 40 2c c9 6b d5-4a 50 75 c5 a3 80 0a 2d Z..@,.k.JPu....-
[...]
00b0 - d5 b9 e8 25 00 c5 c7 da-ce 73 fb f2 c5 46 c4 24 ...%.....s...F.$
Start Time: 1455111516
Timeout : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
---
DONE
С помощью openssl s_client -connect thawte.com:443
показывает:
---
Certificate chain
0 s:/1.3.6.1.4.1.311.60.2.1.3=US/1.3.6.1.4.1.311.60.2.1.2=Delaware/O=Thawte, Inc./C=US/ST=California/L=Mountain View/businessCategory=Private Organization/serialNumber=3898261/OU=Infrastructure Operations/CN=www.thawte.com
i:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
1 s:/C=US/O=thawte, Inc./CN=thawte Extended Validation SHA256 SSL CA
i:/C=US/O=thawte, Inc./OU=Certification Services Division/OU=(c) 2008 thawte, Inc. - For authorized use only/CN=thawte Primary Root CA - G3
---
Последнее «i» показывает выдающий самоподписанный корневой центр сертификации. Я предполагаю, что именно этот Корневой центр сертификации Thawte, _i.e. в Основной корневой центр сертификации - G3 сертификат, нет в вашем /etc/ssl/certs
каталог (как указано в curl
вывод; openssl s_client
не имеет пути CA по умолчанию и должен указывать его явно, например -CApath /etc/ssl/certs
).
Явное добавление этого сертификата в ваш /etc/ssl/certs
каталог (и перезапуск c_rehash
) уж точно не повредит. И если это сработает, например как подтверждено с использованием openssl s_client -connect example.com:443 -CApath /etc/ssl/certs
, тогда вы знаете, что update-ca-certificates
команде может потребоваться некоторое исследование / отладка, чтобы понять, почему она не получила этот корневой ЦС.
Возможно, указанный выше корневой ЦС уже находится в вашем /etc/ssl/certs
каталог, и вышеуказанные шаги не повлияли. В этом случае есть два других выдающих сертификата ЦС для проверки (по крайней мере, в цепочке сертификатов, предлагаемой thawte.com:443
): Основной корневой центр сертификации thawte, и Thawte SSL CA - G2. Повторяя вышеуказанные шаги, чтобы установить эти сертификаты в ваш /etc/ssl/certs
каталог (и перезапуск c_rehash
) может работать. Поскольку эти два являются промежуточными центрами сертификации, а не корневыми центрами сертификации, отсутствие одного из них объяснит ваши результаты, и может ожидаться, что сертификаты будут упущены из виду. update-ca-certificates
.
Надеюсь это поможет!
Это могло быть вызвано неправильным порядком размещения, выдачи, промежуточного и корневого сертификатов в файле сертификата открытого ключа сайта.
Браузер отображает сертификаты в обратном направлении сверху вниз (корневой, промежуточный, выдающий, сайт), но сертификат должен быть в направлении снизу вверх (сайт, выпуск, промежуточный, корневой).