[英]How do I disable validation of the x509 certificate used to validate a message signature?
我有一个客户端,该客户端调用签名其响应消息的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 =美国链建立失败。 使用的证书具有无法验证的信任链。 替换证书或更改certificateValidationMode。 吊销服务器处于脱机状态,因此吊销功能无法检查吊销。
该服务器存在于无法访问CRL的域中,因此我在此答案的帮助下禁用了检查:
ServicePointManager.ServerCertificateValidationCallback += ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
ServicePointManager.CheckCertificateRevocationList = false;
但是,错误仍然存在。 我猜想ServerCertificateValidationCallback
仅针对服务器证书触发,并且此证书是不同的。
如何说服服务模型允许使用此证书,而无需检查CRL或执行其他验证过程?
将certificateValidationMode设置为None以忽略证书验证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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.