为了创建一个使用 WCF 来使用实现 WS-SECURTY 的 Web 服务的 .Net 客户端,我创建了一个 CustomBinding,并向其中添加了三个元素:
使用此 CustomBinding 和 EndpointAddress,我实例化了客户端,然后使用以下代码建立了客户端和服务器证书:
MyClient.ClientCredentials.ClientCertificate.Certificate = myCertificate MyClient.ClientCredentials.ServiceCertificate.DefaultCertificate = serverCertificate
我现在遇到的问题是,我需要使用属于具有 90 多个端点的网络一部分的服务,每个端点都有自己的证书,因此提前知道服务证书是不可能的,或者是不切实际的。这种方法缺乏安全性不会成为问题,因为服务使用的证书必须符合某些规则,并且会在客户端上进行验证,但 WCF 总是向我抛出错误,因为我没有设置服务器证书。
如果事先不知道服务证书的公钥,是否无法使用 WS-SECURTY 和 WCF 来使用 Web 服务?
谢谢您的回答。
我尝试使用以下代码将服务器证书验证模式设置为“无”,但没有成功:
MyClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None
我还尝试使用以下代码设置 CustomCertificateValidator,但它仍然要求服务器证书:
MyClient.ClientCredentials.ServiceCertificate.Authentication.CustomCertificateValidator = New CustomCertificateValidator
我还尝试为服务器设置任何证书并验证 CustomCertificateValidator 中的实际证书,但我在验证器中收到的证书与我配置的证书相同,而不是来自服务器的实际证书。
我想知道是否有任何方法,使用WCF,在不知道服务证书的情况下使用此类服务。
您可以使用 X509CertificateValidator 指定如何将 X.509 证书视为有效。这可以通过从 X509CertificateValidator 派生一个类并重写 Validate 方法来完成。
这是相关的MSDN文档:
您似乎在问题中提到使用此方法,但您没有发布相关类的代码。我想你可以试试我的代码。
但同时,这也涉及到一个问题,如何判断你的网络超过90个服务的证书如何判断。所以我在这里假设你可以通过发行人来判断。
public class CustomCertificateValidator : X509CertificateValidator
{
public override void Validate(X509Certificate2 certificate)
{
if (certificate == null)
{
throw new ArgumentNullException("certificate");
}
if (certificate.Issuer != "CN=QiYOU")
{
throw new SecurityTokenValidationException("Not trusted.");
}
}
}
MyClient.ClientCredentials.ServiceCertificate.Authentication.CustomCertificateValidator = new CustomCertificateValidator();
您也可以尝试:
MyClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.PeerOrChainTrust;
如果证书位于受信任的人员存储中,或者该链构建到受信任的根存储中的证书颁发机构,则该证书有效。