【问题标题】:Asp Mvc prompt client certificate with private key带有私钥的 Asp Mvc 提示客户端证书
【发布时间】:2016-09-13 21:17:00
【问题描述】:

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

问题是,当我在本地尝试(调试)时它可以工作,因为我在本地机器上安装了证书,但是当我发布时,证书的私钥不在证书中,所以,我可以不要在 pdf 上签名。

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

在Debug中,所以,在本地机器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);

提示此消息:

英文:

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

【问题讨论】:

    标签: asp.net-mvc digital-signature x509certificate digital-certificate


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这不是我想要的解决方案,但这是我应得的解决方案。不想用小程序,以后浏览器都不支持了,我会尝试寻找不同的解决方案。
    • @AlbertCortada 目前没有其他可用的解决方案,也不太可能有,因为 WebCrypto 标准开发人员似乎不了解统一访问存储在客户端系统。如果特定桌面浏览器不支持小程序,您可以通过 Java Web Start 运行 Java 小程序,如果用户安装了 Java,这将起作用。对于移动应用,情况会更糟。
    猜你喜欢
    • 2022-08-19
    • 2011-04-02
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 2019-06-01
    • 2011-12-10
    相关资源
    最近更新 更多