如何从pkcs12容器中删除私钥密码?


40
  1. 我使用Chrome的SSL / export命令提取了证书。
  2. 然后提供它作为openvpn的输入-在openvpn的配置中:
    pkcs12 "path/to/pkcs12_container"
  3. 调用openvpn ~/openvp_config时要求输入私钥密码(我在使用Chrome导出时输入的密码):
    Enter Private Key Password:...
  4. 我要删除此密码请求。

问题:如何从pkcs12中删除私钥的密码?

也就是说,创建不需要密码的pkcs12文件。

(似乎我一年前已经以某种方式做了,现在却忘记了。该死。)


以下脚本可以做到这一点(基本上是零答案):gist.github.com/5nizza/7ae9cff0d43f33818a33用法:./remove_pass_from_cert.sh YourCertName YourCertPass
Ayrat 2014年

Answers:


48

可以通过各种openssl调用来实现。

  • 密码是您当前的密码
  • YourPKCSFile是您要转换的文件
  • NewPKCSWithoutPassphraseFile是没有密码短语的PKCS12的目标文件

首先,提取证书:

$ openssl pkcs12 -clcerts -nokeys -in "YourPKCSFile" \
      -out certificate.crt -password pass:PASSWORD -passin pass:PASSWORD

二,CA密钥:

$ openssl pkcs12 -cacerts -nokeys -in "YourPKCSFile" \
      -out ca-cert.ca -password pass:PASSWORD -passin pass:PASSWORD

现在,私钥:

$ openssl pkcs12 -nocerts -in "YourPKCSFile" \
      -out private.key -password pass:PASSWORD -passin pass:PASSWORD \
      -passout pass:TemporaryPassword

现在删除密码:

$ openssl rsa -in private.key -out "NewKeyFile.key" \
      -passin pass:TemporaryPassword

将新的PKCS文件放在一起:

$ cat "NewKeyFile.key"  \
      "certificate.crt" \
      "ca-cert.ca" > PEM.pem

并创建新文件:

$ openssl pkcs12 -export -nodes -CAfile ca-cert.ca \
      -in PEM.pem -out "NewPKCSWithoutPassphraseFile"

现在,您有了一个新的PKCS12密钥文件,在私钥部分上没有密码短语。


很棒的答案!..是ca-cert.ca什么?
Ayrat

@Ayrat:这是密钥的CA证书部分。-我的答案有错别字,更正...-您尝试过后,可以
随意投票

2
-nodes-export使用时被忽略,在这种情况下没有记录(请参见openssl手册页,-nodes仅在从PKCS#12导出到PEM时列出)。您的最后通话仍然提示我输入导出密码。如果我只是按回车键,则会得到一个PKCS#12文件,其密码是一个空字符串,而不是没有密码的文件。当我这样做时,openssl pkcs12 -in "NewPKCSWithoutPassphraseFile"它仍然提示我输入密码。我只要按回车键就可以,但是如果没有密码,它甚至不会提示。
Mecki

35

我找到的最简单的解决方案是

导出到临时Pem文件

openssl pkcs12 -in protected.p12 -nodes -out temp.pem
#  -> Enter password

将pem转换回p12

openssl pkcs12 -export -in temp.pem  -out unprotected.p12
# -> Just press [return] twice for no password

删除临时证书

rm temp.pem

我认为这种方法没有不利之处。
Matt Beckman

有些工具需要密码。例如,keytool -v -list -storetype pkcs12 -keystore unprotected.p12将发出警告,并且不会列出证书。因此它可能适用于OpenVPN,但不适用于其他功能。
mivk 2015年

@mivk是什么意思?某些工具需要密码保护的密钥吗?
科恩

1
可以,但是问题是关于删除密码,而不是关于需要设置密码的应用程序。
科恩

2
您的解决方案不会创建带有密码的PKCS#12 w / oa密码,而不会创建密码为“”(空字符串)的PKCS#12密码。
梅基'18

5

无需临时文件,只需一步即可轻松完成:

openssl pkcs12 -in "PKCSFile" -nodes | openssl pkcs12 -export -out "PKCSFile-Nopass"

使用密码回答“导入密码”提示。用<CR>回答Export Passowrd提示

做完了

请注意,这可以处理捆绑中可能包含的任意数量的中间证书...

我强烈建议您小心生成的文件;首先将umask设置为377是一个好主意(非unix:这意味着只有所有者可以读取创建的文件。)如果您的默认umask允许,我想这是2个步骤...


2

现在,私钥:

openssl pkcs12 -nocerts -in "YourPKCSFile" -out private.key -password pass:PASSWORD -passin pass:PASSWORD -passout pass:TemporaryPassword

立即删除密码:

openssl rsa -in private.key -out "NewKeyFile.key" -passin pass:TemporaryPassword

这两个步骤可以替换为

openssl pkcs12 -nocerts -in "YourPKCSFile" -out private.key -nodes

0

这些都不对我有用。最后,我恢复了第一次工作的dotNet代码。

class Script
{
    static public void Main(string[] args)
    {
                if (args.Length < 3 || args.Contains("/?"))
                {
                    MainHelp(args);
                    return;
                }
       string _infile = args[0],
                        _outfile = args[2];
                string _password = args[1], _outpassword = (args.Length > 3) ? args[3] : "";
                Console.WriteLine(String.Format("{0} -> {1} with ({2} -> {3})", _infile, _outfile, _password, _outpassword));
                System.Security.Cryptography.X509Certificates.X509Certificate2 cert = null;
                Console.WriteLine(String.Format("Load {0} with {2}", _infile, _outfile, _password, _outpassword));
                cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(_infile, _password, X509KeyStorageFlags.Exportable);
                Console.WriteLine(String.Format("Export {1} with {3}", _infile, _outfile, _password, _outpassword));
                System.IO.File.WriteAllBytes(_outfile, cert.Export(System.Security.Cryptography.X509Certificates.X509ContentType.Pfx, _outpassword));
                Console.WriteLine(String.Format("Export complete", _infile, _outfile, _password, _outpassword));
    }

     static public void MainHelp(string[] args)
    {
            Console.WriteLine("Usage pfxremovepwd [inpfx] [inpwd] [outpfx] [optional outpwd]");
            return;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.