从字节数组创建X509Certificate2实例适用于Windows,但在Linux上使用" CryptographicException"。
static void Main(string[] args)
{
var cert = new X509Certificate2(Cert.CertBytes);
}
在Windows上:创建了有效的X509Certificate2实例 在Linux上:抛出异常:
{System.Security.Cryptography.CryptographicException: Cannot find the
original signer.
at Internal.Cryptography.Pal.PkcsFormatReader.TryReadPkcs7(SafePkcs7Handle pkcs7, Boolean single, ICertificatePal& certPal, List`1& certPals)
at Internal.Cryptography.Pal.PkcsFormatReader.TryReadPkcs7Der(Byte[] rawData, Boolean single, ICertificatePal& certPal, List`1& certPals)
at Internal.Cryptography.Pal.CertificatePal.FromBlob(Byte[] rawData, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] data)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData)
at CertTest.Program.Main(String[] args) in /home/CertTest/Program.cs:line 14}
我做错了吗?我认为证书是证书,无论解析它的操作系统如何。
你找到一个有效的X509证书,可以在Windows上解析,但不能在Linux上解析:https://gist.github.com/secana/9c13f8fa495681f8a30adb5d8754450e
我尝试了多个证书,但没有一个在Linux上运行。我不拥有一台Mac,所以我无法测试它是否适用于那里。
使用.Net Core 2.0.2进行测试 在Ubuntu 16.04,Ubuntu 17.10,OpenSuse Tumbleweed,Windows 10
答案 0 :(得分:2)
它不是X509证书,而是一些签名数据(PKCS#7格式)。 Windows可以使用证书路径中的其他证书导出PKCS#7格式的证书。这很可能是你的情况。尝试将其重命名为p7b并在Windows中打开它。
PKCS#7中有两个证书:
PKCS#7使用Microsoft Time-Stamp PCA 2010的时间戳签名。
为什么它在Windows上工作但在linux上不工作我不知道。提交问题here或尝试调试它。
答案 1 :(得分:1)
由于new X509Certficate2()
不像在Windows下那样在Linux下返回签名证书,因此您必须解析PKCS7的ASN.1结构以查找签名证书。
示例:
// Import all certificates in the structure into a collection
var collection = new X509Certificate2Collection();
collection.Import(Cert.CertBytes);
// Find the signing cert
var signingCert = collection.Cast<X509Certificate2>().FirstOrDefault(cert =>
string.Equals(cert.SerialNumber, SignerSerialNumber,
StringComparison.CurrentCultureIgnoreCase));
唯一的困难是获取签名证书的序列号。为此我已经解析了ASN.1结构。序列号位于ASN.1路径1/0/4/0/1/1
。
示例:
// Get signing cert serial number from ASN.1
var serialNumber = asn1[1][0][4][0][1][1];
作为ASN.1解析器,我使用过Mono项目中的代码,但Nuget上有几个解析器。