Почему openssl s_client и gnutls-cli предоставляют разные сертификаты (собственный сервер)
На моем сервере у меня есть несколько виртуальных хостов с apache2. Некоторые с доменом *.example-one.org, а некоторые с *.example-two.org. Каждый домен имеет свой собственный подстановочный сертификат.
Когда я получаю сертификат через openssl s_client
вывод что-то вроде этого:
$ openssl s_client -connect sub.example-one.org:443
CONNECTED(00000003)
[...] CN = *.example-two.org, emailAddress [...]
verify error:num=18:self signed certificate
verify return:1
[...] CN = *.example-two.org, emailAddress [...]
verify return:1
---
[...]
Verify return code: 18 (self signed certificate)
---
И с gnutls-cli
$ gnutls-cli -p 443 sub.example-one.org
Processed 164 CA certificate(s).
Resolving 'sub.example-one.org'...
Connecting to '14x.xxx.xxx.xxx:443'...
- Certificate type: X.509
- Got a certificate list of 1 certificates.
- Certificate[0] info:
- subject `[...]CN=*.example-one.org[...]', RSA key 2048 bits, signed using RSA-SHA1, activated `2013-07-11 12:30:31 UTC', expires `2015-07-11 12:30:31 UTC', SHA-1 fingerprint `94ddfd0d74e0352521af511c1d08c71e5314fae4'
[...]
- Status: The certificate is NOT trusted. The certificate issuer is unknown.
*** Verifying server certificate failed...
*** Fatal error: Error in the certificate.
*** Handshake has failed
GnuTLS error: Error in the certificate.
(Я сократил вывод "[...]")
Firefox извлекает (как gnutls) правильный сертификат...
Почему есть различия?
1 ответ
Решение
Если вы используете несколько сертификатов за одним и тем же IP-адресом, вы должны использовать SNI (указание имени сервера). Хотя браузеры делают это по умолчанию и, возможно, тоже gnutls, s_client этого не делает, и вы должны использовать openssl s_client -servername sub.example.org -connect ...