我怎么能生成.pfx文件?

时间:2012-01-19 00:55:11

标签: c# digital-certificate pfx

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

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

首先,使用自签名证书签署文档是没有意义的,除非您的组织中有自定义PKI层次结构(在后一种情况下,您需要知道自己在做什么,这似乎不是这种情况) 。

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

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

答案 3 :(得分:0)

如果你读到像@David Clarke的回答所提到的关于makecert,你将看到满足你的要求,你只需要一个用.NET编写的托管makecert。

幸运的是Mono家伙很久以前就实现了这个,

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

您可以为此使用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);
    }