ssl 每个连接服务器证书验证的WCF

iibxawm4  于 2023-01-21  发布在  其他
关注(0)|答案(7)|浏览(189)

我尝试只对我们自己的测试环境(多台机器)绕过https证书验证,同时对所有其他连接保持证书验证。
从网上阅读,大多数(如果不是全部)周转基金相关的建议似乎指向以下类似的东西

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

然而,这是一个全局设置,我只想将其应用于特定的连接。这甚至是可能的/支持的使用场景吗?

pengsaosao

pengsaosao1#

在使用. net 4.5时,我终于找到了一个真正的解决方案。
此代码允许您仅对特定的WCF客户端使用自定义验证程序。
它已经过使用BasicHttpSecurityMode.Transport的BasicHttpBinding测试。
ClientBase.ClientCredentials.ServiceCertificate中有一个名为SslCertificateAuthentication的新属性。
可以使用X509ServiceCertificateAuthentication初始化此属性,其中可以提供自定义X509CertificateValidator
例如:

// initialize the ssl certificate authentication
client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication()
{
   CertificateValidationMode = X509CertificateValidationMode.Custom,
   CustomCertificateValidator = new CustomValidator(serverCert)
};

// simple custom validator, only valid against a specific thumbprint
class CustomValidator : X509CertificateValidator
{
    private readonly X509Certificate2 knownCertificate;

    public CustomValidator(X509Certificate2 knownCertificate)
    {
        this.knownCertificate = knownCertificate;
    }

    public override void Validate(X509Certificate2 certificate)
    {
        if (this.knownCertificate.Thumbprint != certificate.Thumbprint)
        {
            throw new SecurityTokenValidationException("Unknown certificate");
        }
    }
}
0pizxfdo

0pizxfdo2#

在.NET 4.5中,您似乎可以执行以下操作:

var request = (HttpWebRequest)WebRequest.Create(url);
request.ServerCertificateValidationCallback += 
    (sender, certificate, chain, sslPolicyErrors) => true

我最初并没有意识到这一点,因为您实际上必须将Create方法的结果强制转换为HttpWebRequest,因为抽象WebRequest不包含此委托。

nkkqxpd9

nkkqxpd93#

大概是这样的

ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidateCert);

public static bool ValidateCert(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    string requestHost;

    if(sender is string)
    {
        requestHost = sender.ToString();
    }
    else
    {
        HttpWebRequest request = sender as HttpWebRequest;

        if(request != null)
        {
            requestHost = request.Host;
        }
    }

    if(!string.IsNullOrEmpty(requestHost) && requestHost == "my_test_machine")
        return true;

    return sslPolicyErrors == SslPolicyErrors.None;
}

注意sender参数上的documentation
传递给RemoteCertificateValidationCallback的sender参数可以是主机字符串名称,也可以是从WebRequest(例如HttpWebRequest)派生的对象,具体取决于CertificatePolicy属性
免责声明-我没有测试这个,我写它的基础上的文档。YMMV。

k3fezbri

k3fezbri4#

实际上,您可以使用以下代码禁用每个客户端/通道的SSL证书验证:

var noCertValidationAuth = new X509ServiceCertificateAuthentication() 
{ 
    CertificateValidationMode = X509CertificateValidationMode.None 
};
client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication = noCertValidationAuth;

在这个线程中,它实际上是answer的变体,所以值得称赞。

prdp8dxp

prdp8dxp5#

我想建议你一个更“犹太”的方式来做到这一点(从信息安全的Angular ):

  1. Create开发人员计算机的自签名唯一证书
  2. Add此证书到测试服务示例上的“受信任根”证书存储
    1.将证书添加到应用程序的允许列表(如果存在)
    这将允许您使用服务,而无需在代码中创建“后门”。这还将允许您仅在测试示例和生产示例上具有相同代码时限制对测试环境的测试访问。
qcbq4gxm

qcbq4gxm6#

你可以做的就是在你的web.config文件中设置一个值。
然后在您的代码中检查web.config文件中的值,然后根据该值设置证书验证。

    • 编辑**

一种选择是:

String url = "https://www.stackoverflow.com";
HttpWebRequest request = HttpWebRequest.CreateHttp(url);
request.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => { return true; };

另一个是:http://weblog.west-wind.com/posts/2011/Feb/11/HttpWebRequest-and-Ignoring-SSL-Certificate-Errors

    • 编辑2**

试试这样的方法:

ServicePointManager.ServerCertificateValidationCallback += customXertificateValidation;

private static bool customXertificateValidation(object sender, X509Certificate cert, 
X509Chain chain, SslPolicyErrors error)
{
    if (check something here)
   {
    return true;
   }
   return false;
}
yvgpqqbh

yvgpqqbh7#

我在Web.config文件中使用了一个标志来指示证书何时是自签名的,并且我们还知道我们处于开发环境中:

<add key="isSelfSignedCertificate" value="true"/>

在代码中,我们必须选中此标志以应用证书验证异常:

using System.Net;

bool isSelfSignedCertificate = Convert.ToBoolean(ConfigurationManager.AppSettings["isSelfSignedCertificate"]);

if (isSelfSignedCertificate)
{
    ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
}

相关问题