我需要使用与证书进行通信之前相同的方法来验证证书(X509Certificate2)。
在这种情况下,当未将证书颁发给安装它的服务器时,X509Certificate2.Verify()将返回true。
是否有完成的代码块可以对X509证书进行完全验证?
问候
编辑:这是我尝试过的代码:
var certificate = GetServerCertificate(CertificateStore,CertificateLocation,Thumbprint);
if(certificate != null)
{
if(certificate.Verify())
_logger.Log(NLog.LogLevel.Info, $"Yes");
else
_logger.Log(NLog.LogLevel.Info, $"No");
}
在这种情况下,当未将证书颁发给安装它的服务器时,X509Certificate2.Verify()将返回true。
Verify
方法不检查有关主机名的任何内容。它验证
完全等于
using (X509Chain chain = new X509Chain())
{
// Use the default vales of chain.ChainPolicy including:
// RevocationMode = X509RevocationMode.Online
// RevocationFlag = X509RevocationFlag.ExcludeRoot
// VerificationFlags = X509VerificationFlags.NoFlag
// VerificationTime = DateTime.Now
// UrlRetrievalTimeout = new TimeSpan(0, 0, 0)
bool verified = chain.Build(cert);
for (int i = 0; i < chain.ChainElements.Count; i++)
{
chain.ChainElements[i].Certificate.Dispose();
}
return verified;
}
是否有完成的代码块可以对X509证书进行完全验证?
如果“完全验证”仅表示Verify
所做的所有事情,则为是。如果您还关心它可以用作TLS客户端证书(或TLS服务器证书)有效,则可以使用较长的格式(直接使用X509Chain)并在调用chain.Build之前添加应用程序策略要求。
// See if it's valid as a TLS server chain.ChainPolicy.ApplicationPolicy.Add(new Oid("1.3.6.1.5.5.7.3.1")); // Alternatively, if it's valid as a TLS client chain.ChainPolicy.ApplicationPolicy.Add(new Oid("1.3.6.1.5.5.7.3.2"));
主机名要难得多。客户端证书没有可验证的名称,这取决于服务器使用的名称。服务器证书的主机名与SAN / Subject-CN匹配,但是没有内置的功能可以进行检查,而不仅仅是与TLS(
SslStream
)连接。