【问题标题】:How can I generate a .pfx file?如何生成 .pfx 文件?
【发布时间】:2012-01-19 00:55:11
【问题描述】:

有没有办法创建 .pfx 文件来签署文件, 我找到了一个名为 x509 Certificate Generate 的程序,但我想知道它是否可以使用 c# 在代码中生成。

【问题讨论】:

  • 是什么让你觉得你需要一个 pfx 文件?
  • 我在一个 asp.net 项目中工作,现在我需要这样做才能对文档进行数字签名
  • 您是否使用相同的证书签署每个文档?
  • 不,我需要知道如何生成 pfx 证书,每个用户都有自己的证书

标签: c# digital-certificate pfx


【解决方案1】:

有一个 Microsoft 命令行工具makecert 可用于生成证书。它是 Windows SDK 的一部分。在我的机器上有六个版本,例如在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64。然后在您的代码中,您可以启动一个进程以使用适当的参数运行可执行文件。

【讨论】:

    【解决方案2】:

    您可以查看Bouncy Castle API,它可用于使用 C# 生成证书。

    【讨论】:

    • 有没有 BC API 的示例?
    【解决方案3】:

    首先,除非您的组织中有自定义 PKI 层次结构,否则使用自签名证书签署文档是没有意义的(在后一种情况下,您需要清楚自己在做什么,但似乎并非如此) .

    PFX 是一个包含一个或多个具有相关私钥的证书的容器。所以你不会生成“PFX 文件”。您生成一个密钥对并创建一个证书,然后可以将其导出为 PFX 文件或其他格式。

    如上所述,BouncyCastle 可以生成证书,我们的 SecureBlackbox 库还可以生成证书并将其保存到/从许多不同的格式中加载。

    【讨论】:

    • 如果您是一名开发人员并且想要创建和测试一些可与 .pfx 文件一起使用的代码,这将是非常有意义的。
    • @Gangnus 在评论之前,请阅读主题。 OP不想测试任何东西。他想为用户签署文件(阅读问题的 OP 的 cmets)。请务必在问题的上下文中阅读答案,而不是抽象。
    【解决方案4】:

    如果您像 @David Clarke 的回答那样阅读有关 makecert 的信息,您会发现满足您的要求,您只需要一个用 .NET 编写的托管 makecert。

    幸运的是,Mono 人很久以前就实现了这一点,

    https://github.com/mono/mono/blob/master/mcs/tools/security/makecert.cs

    【讨论】:

      【解决方案5】:

      您可以使用adobe reader进行数字签名

      如果您使用的是 adobe x - 然后从左边转到第三个选项 - 这里你可以看到签名设置 - 打开这个并去添加ID - 只需输入您的详细信息,您就可以完成 .pfx 文件,无论您在哪里浏览它...... -有效期为6年

      【讨论】:

        【解决方案6】:

        您可以为此使用OpenSSL.NET 库。

        下面是代码示例:

            public X509Certificate2 GeneratePfxCertificate(string certificatePath, string privateKeyPath,
                string certificatePfxPath, string rootCertificatePath, string pkcs12Password)
            {
                string keyFileContent = File.ReadAllText(privateKeyPath);
                string certFileContent = File.ReadAllText(certificatePath);
                string rootCertFileContent = File.ReadAllText(rootCertificatePath);
        
                var certBio = new BIO(certFileContent);
                var rootCertBio = new BIO(rootCertFileContent);
        
                CryptoKey cryptoKey = CryptoKey.FromPrivateKey(keyFileContent, string.Empty);
                var certificate = new OpenSSL.X509.X509Certificate(certBio);
                var rootCertificate = new OpenSSL.X509.X509Certificate(rootCertBio);
        
                using (var certChain = new Stack<OpenSSL.X509.X509Certificate> { rootCertificate })
                using (var p12 = new PKCS12(pkcs12Password, cryptoKey, certificate, certChain))
                using (var pfxBio = BIO.MemoryBuffer())
                {
                    p12.Write(pfxBio);
                    var pfxFileByteArrayContent =
                        pfxBio.ReadBytes((int)pfxBio.BytesPending).Array;
        
                    File.WriteAllBytes(certificatePfxPath, pfxFileByteArrayContent);
                }
        
                return new X509Certificate2(certificatePfxPath, pkcs12Password);
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-08-16
          • 2020-03-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多