我们使用第三方服务 - 当通过浏览器访问时 - 会产生此错误:
好的 - 我们应该给他们打电话,并告诉他们在他们身边解决这个问题 但是 -
问题:
查看这个简单的C#代码 - 为什么我没有看到关于此警告的任何异常,或者换句话说 - 如何让C#反映此警告或不安全的访问?
NB我已经知道我可以使用更高级的webrequest类使用其他类 - 但这对于这个问题并不重要。 (IMHO)。
void Main()
{
Console.WriteLine(CreatePost("https://------", "dummy")); // No exception/warning here
}
private string CreatePost(string uri, string data)
{
HttpWebRequest request = (HttpWebRequest)
WebRequest.Create(uri); request.KeepAlive = false;
request.ProtocolVersion = HttpVersion.Version10;
request.Method = "POST";
byte[] postBytes = Encoding.GetEncoding("UTF-8").GetBytes(data);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postBytes.Length;
Stream requestStream = request.GetRequestStream();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
// now send it
requestStream.Write(postBytes, 0, postBytes.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
return new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("UTF-8")).ReadToEnd();
}
另外 - 我知道浏览器网址是使用GET(与C#post动词不同) - 但我不认为他们已将此操作重定向为沉默警告)
答案 0 :(得分:2)
通过C#访问时,您看不到任何警告,因为Google Chrome正在检查SSL的设置方式,并以警告的方式尝试保护您(以及所述服务的用户)。当您从C#访问它时,它从不接触Chrome,因此您不会收到警告。
您会在其他几个浏览器中收到类似的警告,但这不是对您所做请求的响应的一部分 - 只是浏览器试图让您安全。
您可以手动检查代码中的签名算法,如果不是您认为的“安全”,则抛出异常。
编辑:您可以通过向ServicePointManager
添加自定义验证回调来检查签名算法,如下所示:
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(
(sender, certificate, chain, errors) => {
var insecureAlgorithms = new List<String> { "SHA1" };
var sslCertificate = (X509Certificate2) certificate;
var signingAlgorithm = sslCertificate.SignatureAlgorithm;
if (insecureAlgorithms.Contains(signingAlgorithm.FriendlyName))
{
return false;
}
// do some other checks here...
return true;
}
);