我在Windows Server 2012上运行了自编程API,并带有自签名SSL证书。现在我想通过HTTPS与Web服务进行通信。
通信只在本地网络,但我仍然希望连接是安全的。
有没有办法只接受我自己签名的证书?我找到了许多接受所有证书的解决方案,但我只希望我的被接受。
我已经考虑过将它添加到Windows接受的证书中,但由于使用Web服务的程序是不同PC上的几个用户的用户,而且我没有管理权限。
甚至可以按照我希望的方式建立安全连接吗?
答案 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;