如何在CustomBinding中将证书作为签名添加到SOAP Security元素
解决方法
你当前使用的TransportSecurityBindingElement仅实现传输层安全,证书仅用于HTTPS握手阶段,不会在SOAP消息头部生成你需要的wsse:Security签名结构。要实现消息级的证书签名,需要改用消息安全绑定元素,配置为仅签名、不加密的模式。
修改后的绑定代码
private System.ServiceModel.Channels.Binding GetCustomBinding() { // 配置HTTPS传输下的证书签名模式,仅消息签名,不做消息加密 var security = SecurityBindingElement.CreateCertificateOverTransportBindingElement( MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10); // 配置算法匹配预期的签名结构 security.DefaultAlgorithmSuite = SecurityAlgorithmSuite.Basic128Rsa15; security.DefaultCanonicalizationAlgorithm = "http://www.w3.org/2001/10/xml-exc-c14n#"; security.RequireSignatureConfirmation = false; // 配置SOAP1.1编码 var textMessageEncoding = new TextMessageEncodingBindingElement(); textMessageEncoding.MessageVersion = MessageVersion.Soap11; // 配置HTTPS传输 var transport = new HttpsTransportBindingElement(); transport.RequireClientCertificate = true; return new CustomBinding(security, textMessageEncoding, transport); }
客户端证书配置
你还需要为WCF客户端指定用于签名的X509证书,示例代码如下:
// 初始化WCF客户端 var serviceClient = new YourServiceClient(GetCustomBinding(), new EndpointAddress("你的服务端地址")); // 加载签名证书,此处为从本地证书存储读取,也可直接从pfx文件加载 serviceClient.ClientCredentials.ClientCertificate.SetCertificate( StoreLocation.CurrentUser, StoreName.My, X509FindType.FindByThumbprint, "你的证书指纹字符串" ); // 测试环境可临时关闭服务端证书校验,生产环境建议保留校验逻辑 serviceClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None;
效果说明
配置完成后发起调用,SOAP请求头部会自动生成你需要的wsse:Security结构,包含完整的签名信息、签名值、X509证书颁发者和序列号等字段,完全匹配你给出的预期结构。如果需要调整命名空间前缀、签名引用ID等细节,可以通过实现IClientMessageInspector接口自定义消息拦截器做微调。
内容的提问来源于stack exchange,提问作者abdullah Alzahrani
相关产品推荐
相关产品推荐

