在.Net中创建和验证x509证书

6

关于我的企业项目(仅内部网)中,我遇到了一个与使用.net的证书验证有关的问题。使用System.Security.Cryptography.X509Certificates

步骤1:创建根证书

使用makecert创建一个根证书并将其安装到可信任的根证书颁发机构中。

makecert -r -pe -n "CN=Test Labs (CA)" -ss CA -sr CurrentUser -a sha256 -cy authority -sky signature -sv TestLabCA.pvk TestLabCA.cer
pvk2pfx -pvk TestLabCA.pvk -spc TestLabCA.cer -pfx TestLabCA.pfx

第二步:创建证书并用根证书签名

使用makecert创建证书,并用根证书签名,将其安装到受信任的发布者

makecert -pe -n "CN=Test Labs (SPC)" -a sha256 -cy end -sky signature -ic TestLabCA.cer -iv TestLabCA.pvk -sv TestLabSPC.pvk TestLabSPC.cer
pvk2pfx -pvk TestLabSPC.pvk -spc TestLabSPC.cer -pfx TestLabSPC.pfx

步骤三:在代码中验证

以下是C#代码示例,用于验证证书:

X509Certificate2 rootCertificate = new X509Certificate2("TestLabCA.cer");
X509Certificate2 certificate = new X509Certificate2("TestLabSPC.cer");

// will return true
Console.WriteLine("{0}, verified = {1}", rootCertificate.GetName(), rootCertificate.Verify());

// will return false
Console.WriteLine("{0}, verified = {1}", certificate.GetName(), certificate.Verify());

// validate the chain
var chain = new X509Chain();
chain.Build(certificate);
Console.WriteLine("{0}, verified root of chain = {1}", certificate.GetName(), chain.ChainElements[chain.ChainElements.Count-1].Certificate.Verify());

问题:

如果我想验证证书,我是否需要检查证书链并验证链中的最后一个证书,假设这是根证书?

有更好的方法吗?

答案:

是的,您需要检查证书链并验证链中的最后一个证书,以确保它是有效的根证书。

然而,也有其他方法可以验证证书,例如使用在线验证工具或使用操作系统提供的证书管理器。这些方法可以更快速和方便地验证证书。

2个回答

2
除了Maarten Bodewes的回答之外:
要轻松验证证书链是否有效,您可以使用以下代码:
X509Certificate2 Certificate = new X509Certificate2( "Certificate.pfx" );
X509Chain CertificateChain = new X509Chain();
//If you do not provide revokation information, use the following line.
CertificateChain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck;
bool IsCertificateChainValid = CertificateChain.Build( Certificate );

当证书链正确时,IsCertificateChainValid返回true。 如果返回false,则可以使用以下方法:

CertificateChain.ChainStatus

关于为什么状态无效的信息。 可能的取值包括NotTimeValid、UntrustedRoot。


2
你需要创建一条可信任的证书链。这意味着你需要追溯到一个被你信任的证书。它不一定是根证书,但通常情况下我们会信任根证书而不是中间证书。有时候你只想允许单个实体使用单个证书。只要你确信这是正确的证书,你就可以简单地信任这个单个叶子证书,这样“链”就只包含一个证书。一个例子就是有些 Web 服务使用的自签名根证书。
请注意,证书链的验证只是证书总体验证的一部分。你还需要确保证书没有被吊销,证书仍然有效(在生效日期和过期日期之间)。有时还有其他专有规则来验证证书,例如在数据库中存在证书 ID 的白名单/黑名单。

请注意,这描述的是PKI基础架构中的X509证书,它与例如PGP使用的“信任网”有所不同。 - Maarten Bodewes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接