Каково обоснование того, что ServicePointManager.ServerCertificateValidationCallback разработан таким образом?
ServicePointManager.ServerCertificateValidationCallback
это глобальное статическое свойство, которое может быть перезаписано любым фрагментом кода в вашем приложении, просто выполнив:
ServicePointManager.ServerCertificateValidationCallback
= (sender, cert, chain, sslPolicyErrors) => true;
Почему они решили реализовать это таким образом? Конечно, это должно быть свойство на WebRequest
объект, и у вас должна быть очень веская причина, по которой вы игнорируете сертификат.
1 ответ
Другой код, который может установить это свойство, не является проблемой безопасности, поскольку для установки свойства требуется SecurityPermissionFlag.Infrastructure
разрешение, которое вам не нужно предоставлять коду, которому вы не доверяете.
С другой стороны, я согласен, что это плохой дизайн, так как это глобальное изменяемое состояние, и этого следует избегать. В частности, это делает излишне трудным использование разных политик проверки в разных частях программы. Общий конфигурационный файл, как вы предлагаете, был бы еще хуже IMO.
Правильный выбор был бы свойством экземпляра для обратного вызова, так же, как простой SslStream
класс использует. Я не достаточно знаком с этой частью структуры, чтобы сказать, существует ли это свойство, и, следовательно, ServicePointManager.ServerCertificateValidationCallback
только по умолчанию, или если эта глобальная переменная является единственным способом повлиять на проверку сертификата.