У меня есть клиент, который вызывает 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 или выполнения других процедур проверки?