我在统一证书验证时遇到问题。我使用.Net类HttpWebResponse来发出请求并向ServicePointManager.ServerCertificateValidationCallback提供回调函数。
证书由权威机构签名,在网络浏览器中正常工作。
验证失败,状态为:X509ChainStatusFlags.PartialChain X509ChainStatusFlags.RevocationStatusUnknown X509ChainStatusFlags.OfflineRevocation
问题,我怎么看,是空根证书存储和空CRL列表。我打开了Mono源代码,发现这些数据应该是从X509Store获得的,但不知何故它不包含任何Root证书或CRL。
我需要实现证书的正确验证,而不是通过在ServerCertificateValidationCallback中返回true或者对证书指纹进行硬编码来跳过它,为此我需要提供所有必需的数据。
假设我知道Root权限,我可以在应用程序启动时将其添加到存储。但它不适用于CRL。该平台是Android \ IOS。
问题是:如何强制统一安装Roots和CRL?
答案 0 :(得分:0)
您可以通过X509Store安装证书。安装是持久的,所以只需要调用一次。根据{{3}},从Base64或DER字节创建证书。它可以通过openssl导出:openssl x509 -inform DER -in YOUR_ROOT_CER.cer -out YOUR_BASE64_PEM.pem
。
private static void InstallCertificate(byte[] cert)
{
X509Certificate2 certificate = new X509Certificate2(cert);
X509Store store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);
store.Close();
}
注意StoreLocation.CurrentUser
指向/data/data/<your.package.name>/.mono/
,而StoreLocation.LocalMachine
是/usr/xxx/.mono
在Android上。