如何在不知道服务器证书的情况下使用 WS-SECURITY 通过 WCF 使用 Web 服务

问题描述 投票:0回答:1

为了创建一个使用 WCF 来使用实现 WS-SECURTY 的 Web 服务的 .Net 客户端,我创建了一个 CustomBinding,并向其中添加了三个元素:

  1. 非对称安全绑定元素
  2. TextMessageEncodingBindingElement
  3. HttpsTransportBindingElement

使用此 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,在不知道服务证书的情况下使用此类服务。

.net wcf x509certificate ws-security
1个回答
0
投票

您可以使用 X509CertificateValidator 指定如何将 X.509 证书视为有效。这可以通过从 X509CertificateValidator 派生一个类并重写 Validate 方法来完成。

这是相关的MSDN文档:

X509CertificateValidator 类

您似乎在问题中提到使用此方法,但您没有发布相关类的代码。我想你可以试试我的代码。

但同时,这也涉及到一个问题,如何判断你的网络超过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;

如果证书位于受信任的人员存储中,或者该链构建到受信任的根存储中的证书颁发机构,则该证书有效。

这是相关的MSDN文档:

© www.soinside.com 2019 - 2024. All rights reserved.