web-dev-qa-db-ja.com

プライベートキーパスワードをpkcs12コンテナーから削除する方法

  1. ChromeのSSL/exportコマンドを使用して証明書を抽出しました。
  2. 次に、それをopenvpnへの入力として提供します-openvpnの構成:
    pkcs12 "path/to/pkcs12_container"
  3. openvpn ~/openvp_configを呼び出すと、秘密鍵のパスワードを要求されます(Chromeを使用してエクスポートするときに入力したものです)。
    Enter Private Key Password:...
  4. このパスワード要求を削除したい。

質問:pkcs12から秘密鍵のパスワードを削除する方法?

つまり、パスワードを必要としないpkcs12ファイルを作成します。

(私は何とかこれを1年前にすでにやったようですが、今ではそれを忘れています。

41
Ayrat

さまざまなopenssl呼び出しによって実現できます。

  • PASSWORDは現在のパスワードです
  • 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-Fileを作成します。

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

そして、新しいファイルを作成します。

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

これで、秘密鍵部分にパスフレーズのない新しいPKCS12鍵ファイルができました。

51
zero0

最も簡単な解決策 私が見つけた

一時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
38
Koen.

これは、一時ファイルなしで1つのステップで簡単に実行できます。

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

インポートパスワードプロンプトにパスワードを入力します。 <CR>でExport Passowrdプロンプトに応答します

できました。

これは、バンドルに含まれる可能性がある任意の数の中間証明書を処理することに注意してください...

結果のファイルに注意することを強くお勧めします。最初にumaskを377に設定することをお勧めします(非UNIX:これは、作成されたファイルを所有者だけが読み取ることができることを意味します。)デフォルトのumaskが許容範囲内であれば、それは2つのステップだと思います...

5
tlhackque

さて、秘密鍵:

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

2つのステップは、

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

これらのどれも私にはうまくいきませんでした。最後に、私は初めて動作する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;
    }
}
0
Nick van Esch