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

弱签名算法由浏览器发出警告,但不是通过C#?,c#,certificate,httpwebrequest,tls1.2,C#,Certificate,Httpwebrequest,Tls1.2,我们使用第三方服务,当通过浏览器访问时,会产生以下错误: 好的-我们应该打电话给他们,可能会告诉他们在他们身边解决这个问题。 但— 问题: 看看这个简单的C代码——为什么我没有看到关于这个警告的任何异常,或者换句话说——我如何使C反映这个警告或不安全的访问 注意:我已经知道我可以使用其他类使用更高级的webrequest类,但这与这个问题无关。(imho) 此外-我知道浏览器url地址正在使用GET(与C#post动词不同)-但我不认为他们已将此操作重定向到静默警告)在通过C#访问时,您不会看

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

好的-我们应该打电话给他们,可能会告诉他们在他们身边解决这个问题。
但—

问题:

看看这个简单的C代码——为什么我没有看到关于这个警告的任何异常,或者换句话说——我如何使C反映这个警告或不安全的访问

注意:我已经知道我可以使用其他类使用更高级的webrequest类,但这与这个问题无关。(imho)


此外-我知道浏览器url地址正在使用GET(与C#post动词不同)-但我不认为他们已将此操作重定向到静默警告)

在通过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;

        }
    );
ServicePointManager.ServerCertificateValidationCallback=
新的RemoteCertificateValidationCallback(
(发件人、证书、链、错误)=>{
var unsecurealgorithms=新列表{“SHA1”};
var sslCertificate=(X509Certificate2)证书;
var信号算法=sslCertificate.SignatureAlgorithm;
if(unsecureAlgorithms.Contains(signingAlgorithm.FriendlyName))
{
返回false;
}
//在这里做一些其他检查。。。
返回true;
}
);

我不同意你的看法。如果是无效证书(或者超过一次),C#会抛出一个异常,我可以通过返回true的回调删除这个警告。我不认为C#不支持SSL/TLS,如果浏览器警告我,那么没有理由(我很乐意看到代码)C#不会/绝对不会,C#会抛出一个完全无效的证书(比如它已经过期,或者是针对另一个域);但在这里,证书是有效的,只是没有使用强签名散列。哦,所以有一些级别会抛出/不抛出异常。如果是这样的话——就像我问的那样——我怎么还能发出C#当我调用请求时告诉我算法很弱?(就像浏览器那样)——(我猜你不希望我手动检查每个更新的算法):-)@RoyiNamir有人在Chrome中编程了什么应该被视为“弱”算法。如果你想在自己的代码中使用相同的功能,请将其编码:)@RoyiNamir,不幸的是,你必须决定你认为什么是“弱”签名算法,但是更新了答案以显示一种检查方法。
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;

        }
    );