当X509Certificate被撤销时,我如何以编程方式获取?如果证书被吊销,我可以获得信息,但我需要获得何时被吊销,我认为CRL列表包含该信息,但有人能告诉我如何读取该信息吗?
发布于 2012-01-31 14:09:54
通过(a)获得CRL列表并检查证书是否在其中列出,以及(b)向服务器发送OCSP请求以检查该证书,来检查撤销状态。
.NET不允许你这样做。CryptoAPI可能有一些方法来实现这些操作,但最简单的方法是使用第三方库来执行.NET。BouncyCastle声称支持OCSP和CRL,我们的SecureBlackbox提供了对OCSP和CRL的完整支持(客户端和服务器组件都可用),我们还提供了一个组件,它可以通过一个方法调用执行完整的证书验证(包括所有CRL和OCSP检查以及HTTP和LDAP通信。
发布于 2016-12-01 01:40:39
CRL存储为X509Certificate对象的extensions属性中的OID。OID FriendlyName和值是“CRL分发点”和“2.5.29.31”。在证书的扩展中搜索值为2.5.29.31的OID,然后可以解析原始数据并获得分发点。
我找到了以下代码示例here。我在公开签名证书和内部Microsoft CA证书上对它进行了测试;它返回URL或LDAP连接字符串。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace System.Security.Cryptography.X509Certificates
{
public static class X509Certificate2Extensions
{
/// <summary>
/// Returns an array of CRL distribution points for X509Certificate2 object.
/// </summary>
/// <param name="certificate">X509Certificate2 object.</param>
/// <returns>Array of CRL distribution points.</returns>
public static string[] GetCrlDistributionPoints(this X509Certificate2 certificate)
{
X509Extension ext = certificate.Extensions.Cast<X509Extension>().FirstOrDefault(
e => e.Oid.Value == "2.5.29.31");
if (ext == null || ext.RawData == null || ext.RawData.Length < 11)
return EmptyStrings;
int prev = -2;
List<string> items = new List<string>();
while (prev != -1 && ext.RawData.Length > prev + 1)
{
int next = IndexOf(ext.RawData, 0x86, prev == -2 ? 8 : prev + 1);
if (next == -1)
{
if (prev >= 0)
{
string item = Encoding.UTF8.GetString(ext.RawData, prev + 2, ext.RawData.Length - (prev + 2));
items.Add(item);
}
break;
}
if (prev >= 0 && next > prev)
{
string item = Encoding.UTF8.GetString(ext.RawData, prev + 2, next - (prev + 2));
items.Add(item);
}
prev = next;
}
return items.ToArray();
}
static int IndexOf(byte[] instance, byte item, int start)
{
for (int i = start, l = instance.Length; i < l; i++)
if (instance[i] == item)
return i;
return -1;
}
static string[] EmptyStrings = new string[0];
}
}发布于 2012-05-09 18:17:36
使用x509.h文件中的此API使用openssl 1.0 /或更高版本
X509_CRL_get0_by_cert(X509_CRL *crl,X509_REVOKED **ret,X509 *x);
要检查的证书中的X;
Ret是撤销结构的地址,其中存储了撤销的原因和所有内容
crl就是CRL。
https://stackoverflow.com/questions/9070083
复制相似问题