Что именно происходит в Indy, когда простой HTTPS-запрос из браузера приводит к тому, что отладчик ломается с этой ошибкой:
Проект PMS_COM.exe вызвал класс исключения EIdOSSLUnderlyingCryptoError с сообщением «Ошибка принятия соединения с SSL.
ошибка: 14094416: подпрограммы SSL: ssl3_read_bytes: сертификат оповещения sslv3 неизвестен».
Некоторые в интернете говорят, что это ошибка сертификата клиента, а сертификата клиента нет! Есть только серверный сертификат.
Но если я неправильно понял и это ошибка на стороне клиента, то почему это вызывает исключение на стороне сервера?
Кроме того, я не понимаю, как перехватывать такие ошибки. EIdOSSLUnderlyingCryptoError
кажется, происходит где-то в Indy, и у меня нет возможности поймать это в моем коде.
EIdOSSLUnderlyingCryptoError
— это исключение Indy, обертывающее сообщение об ошибке OpenSSL.
Согласно Сертификат оповещения SSLv3 неизвестен (4279556):
Библиотека SSL отправляет в систему предупреждение о том, что цепочка сертификатов недействительна.
Раздел сообщения, в котором говорится, что «сертификат предупреждения sslv3 неизвестен», обычно относится к промежуточному сертификату в цепочке сертификатов. Срок действия этого сертификата истек, он недействителен или ему не доверяют одна или несколько систем, участвующих в соединении SSL/TLS.
В этом случае клиент (браузер) отправляет на ваш сервер предупреждение о прекращении рукопожатия TLS, поскольку сертификат вашего сервера недействителен. Это предупреждение вызывает исключение EIdOSSLUnderlyingCryptoError
в коде сервера. Сервер обработает ошибку за вас, закрыв свой конец TCP-соединения, в котором не удалось выполнить рукопожатие, и завершит/перезапустит рабочий поток, которому принадлежит этот TCP-сокет.
Если вы хотите отловить ошибку, вы можете использовать серверное событие OnException
, которое запускается в том же потоке, которому принадлежит TCP-соединение, в котором не удалось выполнить рукопожатие TLS.
Спасибо за объяснение внутренних процессов!