.Net编程:在SSL自签名证书上验证什么

tel*_*re4 5 .net ssl-certificate

我无法让用户为他们的服务器创建真正的证书,但我想做一些安全检查.因此,以下内容太轻,因为在我阅读时,没有检查证书.

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
Run Code Online (Sandbox Code Playgroud)

您建议我让客户检查x509证书?鉴于我使用的是.NET语言(c#/ f#).

MyI*_*hin 5

如果您使用自签名证书,那么您应该期望的唯一错误是根(证书颁发者)上的链错误.我会建议像这样的东西,专门捕获链错误,并让所有其他错误落空.

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(
    ValidateRemoteCertificate
);

private static bool ValidateRemoteCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors )
{
    string trustedIssuer = "CN=www.domain.com";
    string trustedDomain = "CN=www.domain.com";
    bool policyErr = false;

    switch (policyErrors)
    {
        case SslPolicyErrors.None:
            policyErr |= false;
            break;
        case SslPolicyErrors.RemoteCertificateChainErrors:
            bool chainErr = false;
            foreach (X509ChainStatus status in chain.ChainStatus)
            {
                switch (status.Status)
                {
                    case X509ChainStatusFlags.NoError:
                        chainErr |= false;
                        break;
                    case X509ChainStatusFlags.UntrustedRoot:
                        if (certificate.Subject != trustedDomain || certificate.Issuer != trustedIssuer)
                            chainErr |= true;
                        else
                            chainErr |= false;
                        break;
                    default:
                        chainErr |= true;
                        break;
                }                    
            }
            policyErr |= chainErr;
            break;
        default:
            policyErr |= true;
            break;
    }

    return !policyErr;
}
Run Code Online (Sandbox Code Playgroud)


Spe*_*ort 4

如果您无法让客户端创建真正的证书,您至少应该尝试让他们使用您的服务器创建证书。然后您可以检查证书是否有效或至少来自您的 CA,因为您会知道您的 CA 是否已被泄露。如果您信任任何或所有 CA,那么实际上没有什么值得检查的。