Я пытаюсь использовать PHPMailer для отправки писем по SMTP через TLS.
Я обнаружил, что когда PHPMailer пытается подключиться к SMTP-серверу и вызывается STARTTLS, соединение сразу завершается неудачей - если только яустановите переменную контекста PHP SSL verify_peer_name => false
при открытии SMTP-соединения.
SMTP-сервер, к которому я подключаюсь, - prefix.myredactedcompany.mailguard.com.au:2525
.Глядя на логи SMTP, я вижу, что когда я прошу подключиться к prefix.myredactedcompany.mailguard.com.au:2525
, я на самом деле подключаюсь к someotherhost.mailguard.com.au
.Я предполагаю, что это результат балансировки нагрузки или другой кластерной установки.
Когда я следую руководству по устранению неполадок PHPMailer, чтобы проверить соединение OpenSSL вне PHP , выполнив команду echo QUIT | .\openssl.exe s_client -starttls smtp -crlf -connect prefix.myredactedcompany.mailguard.com.au:2525
,Я получаю следующие результаты:
CONNECTED(000001E0)
---
Certificate chain
0 s:/C=AU/postalCode=3006/ST=VIC/L=SOUTHBANK/street=198 NORMANBY RD/O=MailGuard Pty Ltd/OU=Netops/OU=PremiumSSL Wildcard/CN=*.mailguard.com.au
i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
1 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
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
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIF0jCCBLqgAwIBAgIQI1raes2jQvcAbHxOBIAtqTANBgkqhkiG9w0BAQsFADCB
... snip ...
pYwh4eDZtcm4tZQfc71R1KhA9ci5A0G9ewPLmZUYoDlguNdlNlVf07aus54EV6XI
1wHfJ/xs
-----END CERTIFICATE-----
subject=/C=AU/postalCode=3006/ST=VIC/L=SOUTHBANK/street=198 NORMANBY RD/O=MailGuard Pty Ltd/OU=Netops/OU=PremiumSSL Wildcard/CN=*.mailguard.com.au
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 5395 bytes and written 468 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
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: redacted
Session-ID-ctx:
Master-Key: redacted
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 7200 (seconds)
TLS session ticket:
0000 - 18 ad e7 c2 c9 46 ab 96-5f 58 03 81 fc 48 3c 18 .....F.._X...H<.
... snip ...
0090 - 41 47 9b f2 60 c4 41 5f-0d fc ea 2b 40 0c 25 3b AG..`.A_...+@.%;
Start Time: 1549441609
Timeout : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
---
В руководстве по устранению неполадок PHPMailer сказано, что в этом контексте
verify error:num=20:unable to get local issuer certificate
не является проблемой.
Это похоже на действительный подстановочный сертификат для всех поддоменов mailguard.com.au
для меня.Почему PHPMailer / OpenSSL отклоняет его, если я не отключаю проверку имени партнера?Это потому, что фактическое имя хоста SMTP не совпадает с DNS-именем, которое я использовал при установлении исходящего соединения?
Если я оставлю проверку имени равноправного узла отключенной, какие угрозы безопасности это подвергает меня?
Версии:
- PHP 7.1.7
- PHPMailer 6.0.6
- OpenSSL 1.0.2l
- Запуск в Windows через XAMPP 7.1.7, если это имеет значение
Комментатор спросил, каковы результаты соединения openssl при подключении напрямую к одному из хостов в пуле.Это очень похоже:
CONNECTED(000001F8)
---
Certificate chain
0 s:/C=AU/postalCode=3006/ST=VIC/L=SOUTHBANK/street=198 NORMANBY RD/O=MailGuard Pty Ltd/OU=Netops/OU=PremiumSSL Wildcard/CN=*.mailguard.com.au
i:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
1 s:/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
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
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIF0jCCBLqgAwIBAgIQI1raes2jQvcAbHxOBIAtqTANBgkqhkiG9w0BAQsFADCB
...snip...
pYwh4eDZtcm4tZQfc71R1KhA9ci5A0G9ewPLmZUYoDlguNdlNlVf07aus54EV6XI
1wHfJ/xs
-----END CERTIFICATE-----
subject=/C=AU/postalCode=3006/ST=VIC/L=SOUTHBANK/street=198 NORMANBY RD/O=MailGuard Pty Ltd/OU=Netops/OU=PremiumSSL Wildcard/CN=*.mailguard.com.au
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
---
No client certificate CA names sent
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 5399 bytes and written 468 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
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES256-GCM-SHA384
Session-ID: redacted
Session-ID-ctx:
Master-Key: redacted
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 7200 (seconds)
TLS session ticket:
0000 - 6d bd 68 e7 44 29 72 ea-99 00 c8 84 a6 cc 45 76 m.h.D)r.......Ev
... snip ...
0090 - 28 73 65 a4 a1 24 fd c6-18 ad fb 13 26 ec 6f b9 (se..$......&.o.
Start Time: 1549519771
Timeout : 300 (sec)
Verify return code: 20 (unable to get local issuer certificate)
---
Хорошо, поэтому комментарии в php.ini
говорят, что пустой параметр openssl.cafile
заставит PHP использовать управляемое ОС хранилище сертификатов.В Windows это не соответствует действительности, поскольку OpenSSL не имеет встроенной поддержки хранилища сертификатов Windows.Итак, я следовал инструкциям в PHP - ошибка сертификата SSL: невозможно получить сертификат локального эмитента для настройки локального корневого CA-пакета.Кажется, сейчас это работает.Когда я запускаю тестовую команду OpenSSL, приведенную выше, и добавляю -CAfile C:\xampp\extras\cacert.pem
, конечный результат теперь равен Verify return code: 0 (ok)
вместо Verify return code: 20 (unable to get local issuer certificate)
.
Я перезапустил Apache и проверил значение openssl.cafile
в phpinfo() это хорошо.Но PHPMailer по-прежнему не будет успешно STARTTLS.Симптомы те же, что и раньше - если я установил для переменной контекста SSL verify_peer_name
значение false, PHPMailer успешно подключится.Если я оставлю verify_peer_name
включенным, соединение не будет установлено во время STARTTLS.
Мне все еще интересно узнать:
- Каковы последствия для безопасности при отключении
verify_peer_name
?Я предполагаю, что это облегчило бы MITM соединение. - Как я могу дополнительно диагностировать точную причину сбоев STARTTLS, особенно теперь, когда сертификат проходит проверку OpenSSL?