Asp Mvc 提示带有私钥的客户端证书

Asp Mvc prompt client certificate with private key

我想创建一个 web 应用程序,其中服务器创建一个 pdf 文档,然后用户使用一些个人数字证书对其进行签名,(eID、身份证、nif 等)

问题是,当我在本地(调试)尝试它时它有效,因为我在本地机器上安装了证书,但是当我发布时,证书的私钥不在证书中,所以,我无法签署 pdf。

public ActionResult Index()
{
    HttpClientCertificate cert = Request.ClientCertificate;
    X509Certificate2 x509cert2 = new X509Certificate2(cert.Certificate);
}

在调试中,因此,在本地机器中 x509cert2.PrivateKey 不是空的,但是如果我发布,x509cert2.PrivateKey 是空的,所以,当我尝试时:

        byte[] contentPdfUnsigned = System.IO.File.ReadAllBytes(path + name + ".pdf");
        ContentInfo objContent = new ContentInfo(contentPdfUnsigned);
        SignedCms objSignedData = new SignedCms(objContent);
        CmsSigner objSigner = new CmsSigner(x509cert2);
        objSignedData.ComputeSignature(objSigner, false);
        byte[] bytSigned = objSignedData.Encode();

在"objSignedData.ComputeSignature(objSigner, false);"行抛出异常:

System.Security.Cryptography.CryptographicException: 密钥不存在。

有什么方法可以让用户把私钥传给我吗?

本地执行时x509cert2.PrivateKey.ToXMLString(true);

提示此消息:

英语:

有没有办法提示此消息(或其他消息)以允许用户传递私钥?

在大多数情况下,用户无法或不应该将私钥传递给您 - 这在技术上是不可能的,并且会破坏私钥的概念(将其传递给您会使隐私无效)。您需要创建一个客户端模块来进行实际签名,或者使用一些预先创建的模块。 In this answer 我描述了我们提供的解决方案,您也可以创建自己的客户端模块。