Временное отключение проверки сертификата

1

Мне нужно использовать веб-службу, но у нее есть сертификат, и мне нужно отключить его аутентификацию.

серверная сторона может быть фиктивным сервером, который мы используем для "имитации" результатов или реального третьего стороннего сервера, который использует защищенные заголовки мыла

я должен иметь возможность отключить проверку сертификата на сервере при вызове фиктивного сервера, но включить его при вызове реального сервера (который не является нашим)

я заметил, что способ отключить это:

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

который отлично работает.

проблема в том, что после выполнения этой строки кода я не могу "перевернуть" ее

Мне нужно что-то вроде:

if (TestMode)
{
  ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
}
else
{
  //enable certificate validation
}

Кстати, код находится в С#.

есть идеи?

Теги:
certificate

1 ответ

4
Лучший ответ

Вам необходимо отменить регистрацию обратного вызова, например:

Объявите ссылку RemoteCertificateValidationCallback.

    static RemoteCertificateValidationCallback _callbackTrue;

Затем в вашем коде инициализации назначьте его следующим образом:

    _callbackTrue = (sender, cert, chain, sslPolicyErrors) => true;

Затем вы можете зарегистрировать/удалить регистрацию обратного вызова при изменении свойства TestMode:

  // in the setter for TestMode, when set to true. 
  ServicePointManager.ServerCertificateValidationCallback += _callbackTrue;

  // in the setter for TestMode, when set to false
  ServicePointManager.ServerCertificateValidationCallback -= _callbackTrue;

Просто убедитесь, что вы регистрируете только обратный вызов, когда TestMode переходит от "false to true" и что вы только отменяете обратный вызов, когда он переходит от "true to false". Т.е. ваши регистрации/перерегистрации должны быть симметричными.

  • 0
    спасибо за ответ. 2 последующих вопроса: 1. Будет ли ServerCertificateValidationCallback выполнять все вызовы сервисов (даже для других веб-сервисов, которые я использую). 2. ** «Просто убедитесь, что вы регистрируете обратный вызов только тогда, когда TestMode переходит от« ложного к истинному », и что вы отменяете обратный вызов только тогда, когда он переходит от« истинного к ложному »» ** - что произойдет, если TestMode уже верен, и я сделаю снова: ServicePointManager.ServerCertificateValidationCallback + = _callbackTrue; (У меня нет способа узнать, когда был изменен TestMode ... я знаю только его текущий статус)
  • 0
    1 - Да, все звонки. 2. Добавьте переменную-член, чтобы отслеживать, зарегистрировали ли вы обратный вызов или нет. Зарегистрируйтесь только если еще не зарегистрированы. Только отмените регистрацию, если уже зарегистрированы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню