如何完全验证 X509 证书?
How to fully validate a X509 certificate?
我需要验证证书 (X509Certificate2),就像在将其用于通信之前进行验证一样。
在这种情况下,X509Certificate2.Verify() 将 return 为真,而证书不会颁发给安装它的服务器。
是否有任何完成的代码块可以对 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");
}
The X509Certificate2.Verify() will in this case return true while the certificate is not issued to the server it is installed on.
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;
}
Is there any finished code block to do a full validation of the X509 certificate?
如果 "full validation" 只是表示 Verify
所做的所有事情,那么是的。如果您还关心它是否可以用作 TLS 客户端证书(或 TLS 服务器证书),那么您可以使用更长的形式(直接使用 X509Chain)并在调用 chain.Build:[=17= 之前添加应用程序策略要求]
// 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
) 连接之外,没有任何内置的检查功能。
我需要验证证书 (X509Certificate2),就像在将其用于通信之前进行验证一样。
在这种情况下,X509Certificate2.Verify() 将 return 为真,而证书不会颁发给安装它的服务器。
是否有任何完成的代码块可以对 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");
}
The X509Certificate2.Verify() will in this case return true while the certificate is not issued to the server it is installed on.
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;
}
Is there any finished code block to do a full validation of the X509 certificate?
如果 "full validation" 只是表示 Verify
所做的所有事情,那么是的。如果您还关心它是否可以用作 TLS 客户端证书(或 TLS 服务器证书),那么您可以使用更长的形式(直接使用 X509Chain)并在调用 chain.Build:[=17= 之前添加应用程序策略要求]
// 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
) 连接之外,没有任何内置的检查功能。