C# X509Certificate.CreateFromSignedFile仅检索叶证书

C# X509Certificate.CreateFromSignedFile仅检索叶证书,c#,.net,x509certificate2,C#,.net,X509certificate2,我有一个使用signtool.exe签名的exe文件。如果我使用Windows查看签名(右键单击->属性->数字签名->详细信息->查看证书->路径),该链如预期的那样如下所示: Verisign | ---赛门铁克3级SHA256代码签名CA | ---我 但是,如果我使用.NET APIX509Certificate.CreateFromSignedFile(path)加载证书,并使用X509Certificate2UI.DisplayCertificate(cert)查看证书,我只会看到

我有一个使用signtool.exe签名的exe文件。如果我使用Windows查看签名(右键单击->属性->数字签名->详细信息->查看证书->路径),该链如预期的那样如下所示:

Verisign
|
---赛门铁克3级SHA256代码签名CA
|
---我
但是,如果我使用.NET API
X509Certificate.CreateFromSignedFile(path)
加载证书,并使用
X509Certificate2UI.DisplayCertificate(cert)
查看证书,我只会看到叶证书。当然,由于缺少链,尝试使用
X509Chain
构建链将导致失败

这是预期的行为吗?是否有任何方法可以使用托管.NET代码(读取,而不使用WinVerifyTrust p/invoke)构建整个链?

是,否

在UI工作流中,当您按下“查看证书”按钮时,您将从“文件属性”对话框切换到“CertUI”对话框。CertUI(可能)只查看叶/端实体证书,然后构建证书链本身。因此,在这一点上,关于签名文件中还有什么内容还有点争议

通过读取文件中嵌入的所有证书信息,您可以在一次调用中获得更进一步的信息。我的本地测试表明,它编写了EE证书(因为它必须)和中间CA(没有签名行),但没有编写根证书(因为您通常在传输过程中忽略根证书…另一方已经拥有它或者不信任它,所以这是浪费的字节)

因此,您可以将所有这些证书传递到
X509Chain.ChainPolicy.ExtraStore
,以防它需要帮助解析中间产物,但要确定根,仍然需要构建链

using (X509Certificate2 cert = new X509Certificate2("signedfile.exe"))
{
    X509Chain chain = new X509Chain();
    chain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreNotTimeValid;

    bool validChain = chain.Build(cert);

    if (!validChain)
    {
        // Whatever you want to do about that.

        foreach (var status in chain.ChainStatus)
        {
            // In reality you can == this, since X509Chain.ChainStatus builds
            // an object per flag, but since it's [Flags] let's play it safe.
            if ((status.Status & X509ChainStatusFlags.PartialChain) != 0)
            {
                // Incomplete chain.
            }
        }
    }

    X509Certificate2Collection chainCerts = new X509Certificate2Collection();

    foreach (var element in chain.ChainElements)
    {
        chainCerts.Add(element.Certificate);
    }

    // now chainCerts has the whole chain in order.
}
是的,也不是

在UI工作流中,当您按下“查看证书”按钮时,您将从“文件属性”对话框切换到“CertUI”对话框。CertUI(可能)只查看叶/端实体证书,然后构建证书链本身。因此,在这一点上,关于签名文件中还有什么内容还有点争议

通过读取文件中嵌入的所有证书信息,您可以在一次调用中获得更进一步的信息。我的本地测试表明,它编写了EE证书(因为它必须)和中间CA(没有签名行),但没有编写根证书(因为您通常在传输过程中忽略根证书…另一方已经拥有它或者不信任它,所以这是浪费的字节)

因此,您可以将所有这些证书传递到
X509Chain.ChainPolicy.ExtraStore
,以防它需要帮助解析中间产物,但要确定根,仍然需要构建链

using (X509Certificate2 cert = new X509Certificate2("signedfile.exe"))
{
    X509Chain chain = new X509Chain();
    chain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreNotTimeValid;

    bool validChain = chain.Build(cert);

    if (!validChain)
    {
        // Whatever you want to do about that.

        foreach (var status in chain.ChainStatus)
        {
            // In reality you can == this, since X509Chain.ChainStatus builds
            // an object per flag, but since it's [Flags] let's play it safe.
            if ((status.Status & X509ChainStatusFlags.PartialChain) != 0)
            {
                // Incomplete chain.
            }
        }
    }

    X509Certificate2Collection chainCerts = new X509Certificate2Collection();

    foreach (var element in chain.ChainElements)
    {
        chainCerts.Add(element.Certificate);
    }

    // now chainCerts has the whole chain in order.
}

我想你需要看看答案谢谢你指点我。正如所怀疑的那样,似乎仅使用X509Certificate2对象就可以得到叶节点。但是,关于这个问题的示例只讨论使用certicate文件(即pfx)导入整个链,而我需要从签名的可执行文件导入。有可能吗?好的,我明白了。根据,您应该能够从签名的可执行文件中获得的
X509Certicate2
创建
X509Certicate2
。有了它,您就可以构建一个可以验证的证书链。大致:
var cert=X509Certificate.CreateFromSignedFile(“path\to\signed_file”);var cert2=新的X509Certificate2(cert)然后
var-chain=new X509Chain();var isValid=chain.Build(cert2)抱歉,上一条评论中的链接错误。应该是的,我想你需要看看答案谢谢你给我指点。正如所怀疑的那样,似乎仅使用X509Certificate2对象就可以得到叶节点。但是,关于这个问题的示例只讨论使用certicate文件(即pfx)导入整个链,而我需要从签名的可执行文件导入。有可能吗?好的,我明白了。根据,您应该能够从签名的可执行文件中获得的
X509Certicate2
创建
X509Certicate2
。有了它,您就可以构建一个可以验证的证书链。大致:
var cert=X509Certificate.CreateFromSignedFile(“path\to\signed_file”);var cert2=新的X509Certificate2(cert)然后
var-chain=new X509Chain();var isValid=chain.Build(cert2)抱歉,上一条评论中的链接错误。应该看到这个答案。。。我需要一个答案的时间已经过去了,但出于好奇,让我下周试试这个。我刚刚看到了这个答案。。。我需要回答这个问题的时间已经过去了,但出于好奇,让我下周试试