[英]Use a particular CA for a SSL connection
我正在使用.NET Framework 2.0阅读您的应用程序中的支持证书,试图确定如何为SSL连接设置CA。
在“ 验证证书”下的文章的大约一半处,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
)完成(例如,请参阅直接对HTTPS请求在文件系统上使用PEM编码的CA Cert? )。
问题 :如何设置CA用于.Net或C#中的SSL连接?
以下代码将避免Windows证书存储,并使用文件系统上的CA来验证链。
函数的名称无关紧要。 下面, VerifyServerCertificate
是与SslStream
类中的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中的体系结构缺陷,但我可能缺少明显的东西。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.