gpt4 book ai didi

c# - 使用特定的 CA 进行 SSL 连接

转载 作者:太空宇宙 更新时间:2023-11-03 13:25:46 28 4
gpt4 key购买 nike

我正在通读 Support Certificates In Your Applications With The .NET Framework 2.0尝试确定如何为 SSL 连接设置 CA。

Validating Certificates 下的文章中途左右, MSDN 提供了一些代码:

static void ValidateCert(X509Certificate2 cert)
{
X509Chain chain = new X509Chain();

// check entire chain for revocation
chain.ChainPolicy.RevocationFlag = X509RevocationFlag.EntireChain;

// check online and offline revocation lists
chain.ChainPolicy.RevocationMode = X509RevocationMode.Online |
X509RevocationMode.Offline;

// timeout for online revocation list
chain.ChainPolicy.UrlRetrievalTimeout = new TimeSpan(0, 0, 30);

// no exceptions, check all properties
chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

// modify time of verification
chain.ChainPolicy.VerificationTime = new DateTime(1999, 1, 1);

chain.Build(cert);
if (chain.ChainStatus.Length != 0)
Console.WriteLine(chain.ChainStatus[0].Status);
}

然后:

// override default certificate policy
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback(VerifyServerCertificate);

我觉得我错过了一些非常明显的东西。例如,我不想要回调 - 我只想说,“建立一个 SSL 连接,这是一个值得信任的 CA”。但是我在上面的代码中没有看到这一点。

X509Chain似乎没有用于添加 CA 或信任根的 add 方法。回调之前不应该设置CA吗?但是我在上面的代码中没有看到这一点。

在 Java 中,它会在加载您要使用的特定 CA 后使用 TrustManager(或 TrustManagerFactory)完成(例如,请参阅 Use PEM Encoded CA Cert on filesystem directly for HTTPS request?) .

问题:如何设置 CA 以用于 .Net 或 C# 中的 SSL 连接?

最佳答案

以下代码将避免 Windows 证书存储并使用文件系统上的 CA 验证链。

函数的名称无关紧要。下面,VerifyServerCertificateSslStream 类中的 RemoteCertificateValidationCallback 是相同的回调。它也可以用于 ServicePointManager 中的 ServerCertificateValidationCallback

static bool VerifyServerCertificate(object sender, X509Certificate certificate,
X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
try
{
String CA_FILE = "ca-cert.der";
X509Certificate2 ca = new X509Certificate2(CA_FILE);

X509Chain chain2 = new X509Chain();
chain2.ChainPolicy.ExtraStore.Add(ca);

// Check all properties
chain2.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;

// This setup does not have revocation information
chain2.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;

// Build the chain
chain2.Build(new X509Certificate2(certificate));

// Are there any failures from building the chain?
if (chain2.ChainStatus.Length == 0)
return false;

// If there is a status, verify the status is NoError
bool result = chain2.ChainStatus[0].Status == X509ChainStatusFlags.NoError;
Debug.Assert(result == true);

return result;
}
catch (Exception ex)
{
Console.WriteLine(ex);
}

return false;
}

没有想出如何默认使用这个链(下面的chain2),这样就不需要回调了。也就是说,将它安装在 ssl 套接字上,连接就会“正常工作”。而且我没有弄清楚如何安装它以便将其传递到回调中。也就是说,我必须为回调的每次调用构建链。我认为这些是 .Net 中的架构缺陷,但我可能遗漏了一些明显的东西。

关于c# - 使用特定的 CA 进行 SSL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22516450/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com