Как отключить проверку сертификата x509, используемого для проверки подписи сообщения? - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть клиент, который вызывает API, который подписывает свои ответные сообщения.Для настройки проверки подписи требуется специальная привязка, которая выглядит следующим образом:

public class SignatureBinding : Binding
{
    public override BindingElementCollection CreateBindingElements()
    {
        var signingElement = new AsymmetricSecurityBindingElement
        {
            AllowInsecureTransport = false,
            RecipientTokenParameters = new X509SecurityTokenParameters(X509KeyIdentifierClauseType.IssuerSerial, SecurityTokenInclusionMode.Never),
            InitiatorTokenParameters = new X509SecurityTokenParameters(X509KeyIdentifierClauseType.IssuerSerial, SecurityTokenInclusionMode.AlwaysToRecipient),
            DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic256,
            SecurityHeaderLayout = SecurityHeaderLayout.Strict,
            MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt,
            MessageSecurityVersion = MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10,
            AllowSerializedSigningTokenOnReply = true
        };
        signingElement.SetKeyDerivation(false);

        return new BindingElementCollection
        {
            signingElement,
            new HttpsTransportBindingElement()
        };
    }
}

И в поведении ClientCredentials:

public class CredentialsBehavior : ClientCredentials 
{
    public CredentialsBehavior()
    {
        base.ServiceCertificate.DefaultCertificate = store.FindBySerialNumber(signatureCertSN);
    }

    //Code omitted
}

Я подтвердил, что приведенный выше код работает нормально при запуске из обычногокомпьютер.Сообщение отправлено, сервер обрабатывает ответ и подписывает его, оно возвращается, клиент проверяет подпись, и все в порядке.

Однако при запуске с заданного сервера возникает сбой, который не можетдоступ к сервисам CRL из-за брандмауэров.Вызов ServiceModel возвращает ошибку, когда я отправляю сообщение по каналу.Ошибка относится к сертификату, который содержит открытый ключ для проверки подписи.Ошибка:

Сертификат X.509 CN = somecert.somedomain.com, OU = CE_Operations, O = "MyCompany, Inc.", L = Город, S = Штат, C = USЦепное строительство не удалось.Используемый сертификат имеет цепочку доверия, которую невозможно проверить.Замените сертификат или измените certificateValidationMode.Функция отзыва не смогла проверить отзыв, поскольку сервер отзыва был отключен.

Сервер существует в домене, который не может получить доступ к спискам отзыва сертификатов, поэтому я отключил проверку с помощью этого ответа :

ServicePointManager.ServerCertificateValidationCallback += ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
ServicePointManager.CheckCertificateRevocationList = false;

Однако ошибка сохраняется.Я предполагаю, что ServerCertificateValidationCallback срабатывает только для сертификатов сервера, и этот сертификат отличается.

Как убедить модель службы разрешить использование этого сертификата без проверки CRL или выполнения других процедур проверки?

1 Ответ

0 голосов
/ 19 сентября 2018

Установите для CertificateValidationMode значение Нет, чтобы игнорировать проверку сертификата. X509CertificateValidationMode

Это поведение, поэтому, если вы хотите сделать это программно, вам следует привязать его как новое поведение к вашей службе:

ServiceHost host = new ServiceHost(typeof(Service));
ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), "http://...");

var endpointClientbehavior = new ClientCredentials();
endpointClientbehavior.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

endpoint.Behaviors.Add(endpointClientbehavior);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...