Назад | Перейти на главную страницу

Проблемы SMTP из-за CN против SNI в сертификате?

У меня есть сценарий, в котором я использую общий почтовый сервер (cPanel) для SMTP на нескольких доменах для нескольких клиентов. Я столкнулся с проблемой, когда библиотека OpenSSL Ruby жалуется, что hostname "smtp.domain2.tld" does not match the server certificate.

В этом случае я думаю, что проблема в том, что основным CN для сертификата является «domain2.tld», и хотя «mail.domain2.tld» является принятым DNS SAN, это не основной CN, и если не запрашивается SNI, он не работает. ...

Например: если я подключаюсь к openssl без директивы «servername» сертификаты, которые я получаю, предназначены для самого сервера: server.main-domain.tld:

$ openssl s_client -connect mail.domain2.tld:587 -starttls smtp -showcerts | grep CN=

depth=2 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority
verify error:num=20:unable to get local issuer certificate
verify return:0
250 HELP
0 s:/OU=Domain Control Validated/OU=PositiveSSL/CN=server.main-domain.tld
i:/C=US/ST=TX/L=Houston/O=cPanel, Inc./CN=cPanel, Inc. Certification Authority
1 s:/C=US/ST=TX/L=Houston/O=cPanel, Inc./CN=cPanel, Inc. Certification Authority
i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
2 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
subject=/OU=Domain Control Validated/OU=PositiveSSL/CN=server.main-domain.tld
issuer=/C=US/ST=TX/L=Houston/O=cPanel, Inc./CN=cPanel, Inc. Certification Authority

Обратите внимание, что сертификат предназначен для server.main-domain.tld вместо того domain2.tld или mail.domain2.tld.

Однако, если мы укажем имя SNI с -servername:

$ openssl s_client -connect server.main-domain.tld:587 -servername mail.domain2.tld -starttls smtp -showcerts | grep CN=

depth=2 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority
verify error:num=20:unable to get local issuer certificate
verify return:0
250 HELP
0 s:/CN=domain2.tld
i:/C=US/ST=TX/L=Houston/O=cPanel, Inc./CN=cPanel, Inc. Certification Authority
1 s:/C=US/ST=TX/L=Houston/O=cPanel, Inc./CN=cPanel, Inc. Certification Authority
i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
2 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
i:/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Root
subject=/CN=domain2.tld
issuer=/C=US/ST=TX/L=Houston/O=cPanel, Inc./CN=cPanel, Inc. Certification Authority

Похоже, что некоторые тесты (например, swaks) не заставляет искать SNI (и, следовательно, он отлично отправляет электронные письма через SMTP), но, возможно, библиотека OpenSSL Ruby обрабатывает это немного по-другому ...

Что мне делать, чтобы правильно настроить сертификаты или сервер, чтобы не создавать этой проблемы?

Похоже, что некоторые тесты (например, swaks) не вызывают поиск SNI ...

Нет никакого "поиска SNI". Клиент либо использует SNI в рукопожатии TLS, чтобы указать имя целевого хоста через server_name расширение или нет. Но в целом использование SNI с SMTP не очень распространено, и поддержка неоднородна. Сюда входят почтовые серверы, которые обычно не поддерживают несколько сертификатов на одном IP-адресе, а также почтовые клиенты, в которых одни используют SNI, а другие нет.

Лучше не полагаться на SNI для SMTP, по крайней мере, на данный момент. Это означает либо наличие одного сертификата, охватывающего все возможные имена с помощью альтернативных имен субъектов, либо разных IP-адресов для разных сертификатов.