У меня клиент-серверная настройка.
Клиент создает прокси для связи с сервером. Когда протоколом связи является HTTPS, прокси-сервер прослушивает событие проверки сертификата SSL через следующую строку:
ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate);
Метод ValidateRemoteCertificate работает с исключениями сертификатов.
В клиенте пользователь может выбрать один из 3 уровней безопасности: низкий, средний и высокий.
На низком уровне метод ValidateRemoteCertificate игнорирует любые ошибки и всегда возвращает true.
На среднем уровне метод ValidateRemoteCertificate запускает событие, уведомляющее клиента о проблеме. На этом этапе пользователю появляется сообщение, информирующее его о том, что сертификат проблематичен, и позволяет пользователю выбрать, следует ли продолжить и принять соединение с сервером или отклонить.
На высоком уровне метод ValidateRemoteCertificate отклоняет соединение для любой ошибки.
Пока все хорошо.
Сценарий таков:
- Клиент загружается с предопределенным уровнем безопасности Medium, который уже был принят пользователем, и соединение с сервером устанавливается без распространения каких-либо проблем с сертификатом.
- Пользователь отключает клиента от сервера (специальной кнопкой).
- Пользователь пытается повторно подключить клиента. На этом этапе клиент имеет возможность проверить соединение с помощью кнопки тестирования. Метод test возвращает успех, хотя для проверки соединения был создан новый прокси-сервер, и все методы ValidateRemoteCertificate были очищены из ServerCertificateValidationCallback (определенного типа прокси-сервера). Кроме того, для проблемного сертификата не генерируется событие, и метод ValidateRemoteCertificate не вызывается.
Поведение, которого я пытаюсь добиться, заключается в том, что при выполнении теста ServerCertificateValidationCallback будет вести себя так, как если бы это был первый вызов к нему после запуска клиента и вступления в действие ValidateRemoteCertificate.
Я пытался найти любой метод, который очищает любые делегаты / события в ServicePointManager, но я не смог найти ни одного.
Есть ли здесь кеш, который можно очистить?
Надеюсь, сценарий достаточно ясен.