我尝试只对我们自己的测试环境(多台机器)绕过https证书验证,同时对所有其他连接保持证书验证。从网上阅读,大多数(如果不是全部)周转基金相关的建议似乎指向以下类似的东西
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
然而,这是一个全局设置,我只想将其应用于特定的连接。这甚至是可能的/支持的使用场景吗?
pengsaosao1#
在使用. net 4.5时,我终于找到了一个真正的解决方案。此代码允许您仅对特定的WCF客户端使用自定义验证程序。它已经过使用BasicHttpSecurityMode.Transport的BasicHttpBinding测试。ClientBase.ClientCredentials.ServiceCertificate中有一个名为SslCertificateAuthentication的新属性。可以使用X509ServiceCertificateAuthentication初始化此属性,其中可以提供自定义X509CertificateValidator。例如:
BasicHttpSecurityMode.Transport
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"); } } }
0pizxfdo2#
在.NET 4.5中,您似乎可以执行以下操作:
var request = (HttpWebRequest)WebRequest.Create(url); request.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true
我最初并没有意识到这一点,因为您实际上必须将Create方法的结果强制转换为HttpWebRequest,因为抽象WebRequest不包含此委托。
Create
HttpWebRequest
WebRequest
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。
sender
k3fezbri4#
实际上,您可以使用以下代码禁用每个客户端/通道的SSL证书验证:
var noCertValidationAuth = new X509ServiceCertificateAuthentication() { CertificateValidationMode = X509CertificateValidationMode.None }; client.ClientCredentials.ServiceCertificate.SslCertificateAuthentication = noCertValidationAuth;
在这个线程中,它实际上是answer的变体,所以值得称赞。
prdp8dxp5#
我想建议你一个更“犹太”的方式来做到这一点(从信息安全的Angular ):
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
试试这样的方法:
ServicePointManager.ServerCertificateValidationCallback += customXertificateValidation; private static bool customXertificateValidation(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error) { if (check something here) { return true; } return false; }
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; }; }
7条答案
按热度按时间pengsaosao1#
在使用. net 4.5时,我终于找到了一个真正的解决方案。
此代码允许您仅对特定的WCF客户端使用自定义验证程序。
它已经过使用
BasicHttpSecurityMode.Transport
的BasicHttpBinding测试。ClientBase.ClientCredentials.ServiceCertificate
中有一个名为SslCertificateAuthentication
的新属性。可以使用
X509ServiceCertificateAuthentication
初始化此属性,其中可以提供自定义X509CertificateValidator
。例如:
0pizxfdo2#
在.NET 4.5中,您似乎可以执行以下操作:
我最初并没有意识到这一点,因为您实际上必须将
Create
方法的结果强制转换为HttpWebRequest
,因为抽象WebRequest
不包含此委托。nkkqxpd93#
大概是这样的
注意
sender
参数上的documentation:传递给RemoteCertificateValidationCallback的sender参数可以是主机字符串名称,也可以是从WebRequest(例如HttpWebRequest)派生的对象,具体取决于CertificatePolicy属性
免责声明-我没有测试这个,我写它的基础上的文档。YMMV。
k3fezbri4#
实际上,您可以使用以下代码禁用每个客户端/通道的SSL证书验证:
在这个线程中,它实际上是answer的变体,所以值得称赞。
prdp8dxp5#
我想建议你一个更“犹太”的方式来做到这一点(从信息安全的Angular ):
1.将证书添加到应用程序的允许列表(如果存在)
这将允许您使用服务,而无需在代码中创建“后门”。这还将允许您仅在测试示例和生产示例上具有相同代码时限制对测试环境的测试访问。
qcbq4gxm6#
你可以做的就是在你的web.config文件中设置一个值。
然后在您的代码中检查web.config文件中的值,然后根据该值设置证书验证。
一种选择是:
另一个是:http://weblog.west-wind.com/posts/2011/Feb/11/HttpWebRequest-and-Ignoring-SSL-Certificate-Errors
试试这样的方法:
yvgpqqbh7#
我在Web.config文件中使用了一个标志来指示证书何时是自签名的,并且我们还知道我们处于开发环境中:
在代码中,我们必须选中此标志以应用证书验证异常: