仅接受自签名SSL证书C#

时间:2017-05-04 12:59:48

标签: c# https ssl-certificate self-signed

我在Windows Server 2012上运行了自编程API,并带有自签名SSL证书。现在我想通过HTTPS与Web服务进行通信。

通信只在本地网络,但我仍然希望连接是安全的。

有没有办法只接受我自己签名的证书?我找到了许多接受所有证书的解决方案,但我只希望我的被接受。

我已经考虑过将它添加到Windows接受的证书中,但由于使用Web服务的程序是不同PC上的几个用户的用户,而且我没有管理权限。

甚至可以按照我希望的方式建立安全连接吗?

1 个答案:

答案 0 :(得分:1)

是的,正如古斯曼建议的那样,你应该为ServerCertificateValidationCallback实现自己的方法。您可以比较证书的指纹以验证它是否是您想要信任的那个。这样的事情应该有效:

public static class CertificateValidator
{
    public static string TrustedThumbprint { get; set; }

    public static bool ValidateSslCertificate(
        object sender,
        X509Certificate certificate,
        X509Chain chain,
        SslPolicyErrors errors)
    {
        // Wrap certificate to access thumbprint.
        var certificate2 = new X509Certificate2(certificate);

        // Only accept certificate with trusted thumbprint.
        if (certificate2.Thumbprint.Equals(
             TrustedThumbprint, StringComparison.OrdinalIgnoreCase))
        {
            return true;
        }

        // In all other cases, don't trust the certificate.
        return false;
    }
}

在您的启动代码中,请包含以下内容以进行连接:

// Read your trusted thumbprint from some secure storage.
// Don't check it into source control! ;-)
CertificateValidator.TrustedThumbprint = SomeSecureConfig.Get["TrustedApiThumbprint"];

// Set the callback used to validate certificates.
ServicePointManager.ServerCertificateValidationCallback += CertificateValidator.ValidateSslCertificate;