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ファイルを作成します。

(私はすでに1年前に何らかの形でこれをすでに行っていたようですが、今ではそれを忘れていました。


次のスクリプトがこれを行います(基本的にはゼロの回答です):gist.github.com/5nizza/7ae9cff0d43f33818a33使用法:./remove_pass_from_cert.sh YourCertName YourCertPass
Ayrat 14年

回答:


48

さまざまな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ファイルの準備をします。

$ 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:これはキーのCA証明書部分です。-私は答えにタイプミスがあり、修正しています
...-

2
-nodes-export使用されている場合は無視されます。この場合は文書化されていません(opensslのマニュアルページを参照してください。PKCS -nodes#12からPEMにエクスポートする場合にのみリストされます)。最後の呼び出しでは、エクスポートパスワードの入力が求められます。そして、もしもリターンキーを押しただけなら、パスワードが空の文字列であり、パスワードのないものではないPKCS#12ファイルを取得します。その後openssl pkcs12 -in "NewPKCSWithoutPassphraseFile"、インポートパスワードの入力を求められます。Returnキーを押すだけで機能しますが、パスワードがなければプロンプトは表示されません。
メッキー

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

このアプローチにはマイナス面はありません。
マットベックマン14年

一部のツールにはパスワードが必要です。たとえばkeytool -v -list -storetype pkcs12 -keystore unprotected.p12、警告を発し、証明書をリストしません。そのため、OpenVPNで機能する可能性がありますが、他の機能では機能しません。
mivk

@mivkどういう意味ですか?一部のツールではパスワードで保護されたキーが必要ですか?
公園。

1
確かに、質問はパスワードの削除に関するものであり、パスワードの設定が必要なアプリケーションに関するものではありません。
公園。

2
このソリューションでは、パスワードなしのPKCS#12を作成するのではなく、パスワードが ""(空の文字列)で、同じではないものを作成します。
メッキー

5

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

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

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

できた

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

結果のファイルに注意することを強くお勧めします。最初にumaskを377に設定することをお勧めします(Unix以外:これは、所有者のみが作成されたファイルを読み取ることができることを意味します)。


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

2つのステップは、

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;
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.