弱签名算法是由浏览器警告但不是通过C#警告?

时间:2017-08-25 10:44:07

标签: c# certificate httpwebrequest tls1.2

我们使用第三方服务 - 当通过浏览器访问时 - 会产生此错误:

enter image description here

好的 - 我们应该给他们打电话,并告诉他们在他们身边解决这个问题 但是 -

问题:

查看这个简单的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动词不同) - 但我不认为他们已将此操作重定向为沉默警告)

1 个答案:

答案 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;

        }
    );