Почему 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 ...

Другие вопросы по тегам