关于数字证书链的验证有很多文档,这里写一下我记录的文档。
我们获取到一张证书文件,如pfx,cer后缀的文件,我们如何保证我们获取的证书是正式CA机构颁发的,并且有完整证书链,直到信任的根证书呢,下面就记录下一下C#代码来查询。
在c#中有这个类型X509Certificate2,我们将用这个类型来判断证书的有效性,包括但不限于验证证书链是否完整、证书是否过期、证书是否可信任、证书是否被吊销等。
1 X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 2 store.Open(OpenFlags.ReadWrite); 3 X509Certificate2Collection storecollection = (X509Certificate2Collection)store.Certificates; 4 foreach (X509Certificate2 x509 in storecollection) 5 { 6 //120B2FCE02360A4E36F25EC 过期证书 7 //4AB398545081D3A3496DF 自签名证书 8 //4DEF9C5D328130958EA823 正常证书 9 if (x509.SerialNumber == "4AB398545081D3A3496DFA0") 10 { 11 12 bool isFullChain= x509.Verify(); 13 14 15 System.Security.Cryptography.X509Certificates.X509Certificate2 cert = x509; 16 17 System.Security.Cryptography.X509Certificates.X509Chain chain = new System.Security.Cryptography.X509Certificates.X509Chain(); 18 //chain.ChainPolicy.RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.Online; 19 //chain.ChainPolicy.RevocationFlag = System.Security.Cryptography.X509Certificates.X509RevocationFlag.EntireChain; 20 //chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag; 21 ////chain.ChainPolicy.VerificationFlags = System.Security.Cryptography.X509Certificates.X509VerificationFlags.; 22 //chain.ChainPolicy.VerificationTime = DateTime.Now; 23 24 bool sucess = chain.Build(cert); 25 26 if (!sucess) 27 { 28 string[] errors = chain.ChainStatus.Select(x => String.Format("{0} ({1})", x.StatusInformation.Trim(), x.Status)).ToArray(); 29 30 } 31 32 33 #endregion 34 } 35 }
通过sucess可以判断证书是否完整有效,如果你还需要具体点错误信息,请查看errors错误内容。
一般提示:自签名的证书(已处理证书链,但是在不受信任提供程序信任的根证书中终止。 (UntrustedRoot))
过期证书(根据当前系统时钟或签名文件中的时间戳验证时要求的证书不在有效期内。 (NotTimeValid))