编辑:
我最终确定 IClientMessageInspector 似乎没有反映消息签名,所以当我实际上在我的请求中获得签名时,我并不知道。所以现在我的新问题,真正的问题......
如何配置 WCF 客户端以提供 SSL 客户端证书并签署 SOAP 标头?
var myBinding = new BasicHttpBinding();
myBinding.Security.Mode = BasicHttpSecurityMode.TransportWithMessageCredential;
myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
myBinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.Certificate;
这将导致标头具有已签名的时间戳。但是,不再提供客户端证书,并且我没有通过 SSL。如果我将第二行更改为:
myBinding.Security.Mode = BasicHttpSecurityMode.Transport;
然后我通过了 SSL,但我的 SOAP 标头不再具有签名块。
有什么办法可以让我获得 HttpWebRequest 以便我可以像这样手动附加 SSL 客户端证书?
webRequest.ClientCertificates.Add(certLoader.Load(@"c:\somecert.pfx"));
原始问题
我正在开发一个 WCF 客户端,该客户端需要与第三方提供的服务互操作,该第三方使用 Forum Sentry 网络设备来保护访问。它们需要 SSL 和传输级别的客户端证书,以及 o:Security 元素,其签名使用标头中的证书。我可以通过标准绑定实现其中一个或另一个,但我似乎无法同时实现两者。理想情况下,他们希望使用与 SSL 客户端证书不同的证书对消息进行签名,但他们说我们可以使用相同的证书进行 SSL 客户端身份验证和对消息进行签名。
在这一点上,我愿意做任何事情来完成这项工作,包括在必要时使用 CustomBinding。
我可以使用以下命令使 SSL 部分正常工作:
var myBinding = new BasicHttpBinding();
myBinding.Security.Mode = BasicHttpSecurityMode.Transport;
myBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
var url = "https://blah.com/services/somservice";
EndpointAddress ea = new EndpointAddress(url);
var client = new SoapClient(myBinding, ea);
var certLoader = new CertificateLoader("password");
client.ClientCredentials.ClientCertificate.Certificate = certLoader.Load(@"c:\somecert.pfx");
var resp = client.somemethod(ref profile, new RequestType { version = RequestTypeVersion.Item100 });