我以标准用户权限运行我的程序,并且我假设 API
ValidateServerCertificate
使用本地用户证书存储中的根证书来验证 SSL 证书。
C# 的代码示例。
// The following method is invoked by the RemoteCertificateValidationDelegate.
public static bool ValidateServerCertificate(
object sender,
X509Certificate certificate,
X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
Console.WriteLine("Certificate error: {0}", sslPolicyErrors);
// Do not allow this client to communicate with unauthenticated servers.
return false;
}
要求:我需要基于本地计算机证书存储中存在的根证书进行 SSL 证书验证。
我想出了一个逻辑,将提供的根 - SSL 证书的指纹与本地计算机证书存储中存在的指纹进行比较。
X509Store store = new X509Store("Root", StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509ChainElement rootElement = chain.ChainElements[chain.ChainElements.Count - 1]; //To get the root of the chain
X509Certificate2 rootCert = rootElement.Certificate;
foreach (X509Certificate2 cert in store.Certificates)
{
// Compare the thumbprint of each certificate
if (cert.Thumbprint.Equals(rootCert.GetCertHashString(), StringComparison.OrdinalIgnoreCase))
{
// Certificate found
return true;
}
}
return false;
但是有更好的方法来执行此操作吗?我正在使用 .NET-FW 版本 4。
您可以尝试其他方法:
以 .pfx 格式(带密码)导出您的证书(私钥)并将其保存在某个文件夹位置。
要导出证书,您还可以使用 DigiCert Utility,可以从以下链接下载:
var cert_Path = "D:\YourFolderLocation\YourCertificate.pfx";
var cert = new X509Certificate2(cert_Path, "Certificate_Password", X509KeyStorageFlags.MachineKeySet);
现在,用这个尝试你的代码。