使用Visual Studio 2005 - C#2.0,System.Net.WebClient.UploadData(Uri address, byte[] data)
Windows Server 2003
所以这是代码的精简版本:
static string SO_method(String fullRequestString)
{
string theUriStringToUse = @"https://10.10.10.10:443"; // populated with real endpoint IP:port
string proxyAddressAndPort = @"http://10.10.10.10:80/"; // populated with a real proxy IP:port
Byte[] utf8EncodedResponse; // for the return data in utf8
string responseString; // for the return data in utf16
WebClient myWebClient = new WebClient(); // instantiate a web client
WebProxy proxyObject = new WebProxy(proxyAddressAndPort, true);// instantiate & popuylate a web proxy
myWebClient.Proxy = proxyObject; // add the proxy to the client
myWebClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); // stick some stuff in the header
UTF8Encoding utf8Encoding = new UTF8Encoding(false);// create a utf8 encoding
Byte[] utf8EncodedRequest = HttpUtility.UrlEncodeToBytes(fullRequestString, utf8Encoding); // convert the request data to a utf8 byte array
try
{
utf8EncodedResponse = myWebClient.UploadData(theUriStringToUse, "POST", utf8EncodedRequest); // pass the utf8-encoded byte array
responseString = utf8Encoding.GetString(utf8EncodedResponse); // get a useable string out of the response
}
catch (Exception e)
{
// some other error handling
responseString = "<CommError><![CDATA[" + e.ToString() + "]]></CommError>";// show the basics of the problem
}
return responseString;// return whatever ya got
}
这是我得到的错误:
基础连接已关闭:无法为SSL / TLS安全通道建立信任关系。
我没有太多控制权来看看请求结束时发生了什么。我被告知它到达了正确的目的地并且出现了“证书错误”。这可能是因为我的请求中的IP地址与其解析的URL之间存在字面上的不匹配。我有多个IP,我应该循环使用,因此指定URL将无法正常工作。我没有附上证书 - 我也不应该根据端点所有者的说法。根据“他们”,证书错误是“正常的,我应该忽略它。”
有问题的证书应该是我们服务器上“就在那里”的众多verisign证书之一。我看到的忽略证书错误的例子似乎都暗示请求者附加了一个特定的x509证书(我不是)。
我查看.net WebService, bypass ssl validation!哪种方式描述了我的问题 - 除了它还有点 - 因为我不知道我应该参考哪个证书(如果有的话)。
有没有办法让我忽略错误而不知道/关心什么证书导致问题?
请 - 戴上手套,小字和“傻瓜”代码,因为我不是一个沉重的击球手。
此流量通过专线发送 - 因此我的理解是忽略证书错误并不像开放互联网流量那么大。
答案 0 :(得分:54)
SSL证书用于机器建立信任关系。如果您键入一个IP地址,并最终与另一个IP地址通话,这听起来与DNS劫持安全性故障相同,那就是SSL打算帮助您避免的事情 - 也许您不想忍受的事情来自“他们”。
如果您可能最终谈论的不仅仅是机器(理想情况下它们会让它看起来像是一个),您需要为每个可能的机器提供证书以启动信任。
要忽略信任(我只需要在开发方案中暂时执行此操作),以下代码段可能适用于您,但我强烈建议您在使用之前考虑忽略信任的影响:
public static void InitiateSSLTrust()
{
try
{
//Change SSL checks so that all checks pass
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(
delegate
{ return true; }
);
}
catch (Exception ex)
{
ActivityLog.InsertSyncActivity(ex);
}
}
答案 1 :(得分:10)
我意识到这是一篇很老的帖子,但我只是想表明有更简洁的方法(使用.NET 3.5+及更高版本)。
也许这只是我的OCD,但我想尽可能地减少这些代码。这似乎是最简单的方法,但我还列出了一些更长的等价物:
// 79 Characters (72 without spaces)
ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true;
.NET 2.0中的最短路径(问题是专门询问的)
// 84 Characters
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
不幸的是,lambda方式要求您定义参数,否则它可能更短。
如果你需要更长的路,这里有一些额外的选择:
ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, errors) => true;
ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { return true; };
// 255 characters - lots of code!
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(
delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
{
return true;
});
答案 2 :(得分:8)
此代码比您预期的要广泛得多。这是整个过程。该进程可能是此计算机上的exe,IIS,甚至DLLHost.exe。调用它之后,有一个finally块,通过删除总是返回true的委托来恢复正常。
答案 3 :(得分:8)
这有点像我们正在使用的代码(还没有打磨 - 我认为我没有正确的错误处理设置,但它应该是关闭的)基于托马斯的建议(这是.NET 4.0代码,但是) :
var sslFailureCallback = new RemoteCertificateValidationCallback(delegate { return true; });
try
{
if (ignoreSslErrors)
{
ServicePointManager.ServerCertificateValidationCallback += sslFailureCallback;
}
response = webClient.UploadData(Options.Address, "POST", Encoding.ASCII.GetBytes(Options.PostData));
}
catch (Exception err)
{
PageSource = "POST Failed:\r\n\r\n" + err;
return PageSource;
}
finally
{
if (ignoreSslErrors)
{
ServicePointManager.ServerCertificateValidationCallback -= sslFailureCallback;
}
}
答案 4 :(得分:1)
我想禁用特定域的SSL验证,而不是全局停用它,因为可能还有其他请求正在运行而不会受到影响,所以我提出了这个解决方案(请注意,uri是类中的变量:< / p>
BluetoothLEAdvertisementWatcher
答案 5 :(得分:1)
这是使WebClient忽略SSL证书的VB.net代码。
Net.ServicePointManager.ServerCertificateValidationCallback = New Net.Security.RemoteCertificateValidationCallback(Function() True)