Bagaimana cara menghapus Private Key Password dari wadah pkcs12?

40
  1. Saya mengekstraksi sertifikat menggunakan perintah SSL / ekspor Chrome.
  2. Kemudian berikan itu sebagai input ke openvpn - dalam konfigurasi untuk openvpn:
    pkcs12 "path/to/pkcs12_container"
  3. Saat memanggilnya openvpn ~/openvp_configmeminta kata sandi untuk kunci pribadi (yang saya masukkan saat mengekspor menggunakan Chrome):
    Enter Private Key Password:...
  4. Saya ingin menghapus permintaan kata sandi ini.

Pertanyaannya: bagaimana cara menghapus kata sandi untuk kunci privat dari pkcs12?

Artinya, buat file pkcs12 yang tidak memerlukan kata sandi.

(Sepertinya saya sudah melakukan ini setahun yang lalu, dan sekarang melupakannya. Sial.)

Ayrat
sumber
skrip berikut melakukan ini (pada dasarnya jawabannya nol0): gist.github.com/5nizza/7ae9cff0d43f33818a33 penggunaan:./remove_pass_from_cert.sh YourCertName YourCertPass
Ayrat

Jawaban:

48

Itu bisa dicapai dengan berbagai opensslpanggilan.

  • PASSWORD adalah kata sandi Anda saat ini
  • YourPKCSFile adalah file yang ingin Anda konversi
  • NewPKCSWithoutPassphraseFile adalah file target untuk PKCS12 tanpa passphrase

Pertama, ekstrak sertifikat:

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

Kedua, kunci CA:

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

Sekarang, kunci pribadi:

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

Sekarang hapus frasa sandi:

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

Menyatukan semuanya untuk File-PKCS baru:

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

Dan buat file baru:

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

Sekarang Anda memiliki file kunci PKCS12 baru tanpa frasa sandi di bagian kunci pribadi.

nol0
sumber
jawaban yang luar biasa! ..apa itu ca-cert.ca?
Ayrat
@ Ayrat: Ini adalah bagian sertifikat CA dari kunci Anda. - Saya memiliki kesalahan ketik dalam jawaban, mengoreksi ...
Jangan
2
-nodesdiabaikan ketika -exportdigunakan, tidak didokumentasikan untuk kasus ini (lihat halaman man openssl, -nodeshanya terdaftar saat mengekspor dari PKCS # 12 ke PEM). Panggilan terakhir Anda masih meminta saya untuk kata sandi ekspor. Dan jika saya tekan kembali, saya mendapatkan file PKCS # 12 yang kata sandinya adalah string kosong dan bukan file tanpa kata sandi. Ketika saya melakukannya openssl pkcs12 -in "NewPKCSWithoutPassphraseFile"masih meminta saya untuk kata sandi impor. Saya hanya bisa menekan kembali dan itu berfungsi tetapi jika tidak ada kata sandi, itu bahkan tidak akan meminta.
Mecki
35

Solusi paling sederhana yang saya temukan adalah

Ekspor ke file pem sementara

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

Ubah pem kembali ke p12

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

Hapus sertifikat sementara

rm temp.pem
Koen.
sumber
Saya tidak melihat kelemahan dari pendekatan ini.
Matt Beckman
Beberapa alat memerlukan kata sandi. Misalnya keytool -v -list -storetype pkcs12 -keystore unprotected.p12akan memancarkan peringatan dan TIDAK akan mencantumkan sertifikat. Jadi itu mungkin bekerja untuk OpenVPN, tetapi tidak untuk hal lain.
mivk
@mivk apa maksudmu? Bahwa beberapa alat memerlukan kunci yang dilindungi kata sandi?
Koen.
1
Tentu, tetapi pertanyaannya adalah tentang menghapus kata sandi, bukan tentang aplikasi yang memerlukan kata sandi untuk ditetapkan.
Koen.
2
Solusi Anda tidak membuat kata sandi PKCS # 12 dengan kata sandi "" (string emtpy), yang tidak sama.
Mecki
5

Ini dapat dengan mudah dilakukan dalam satu langkah tanpa file sementara:

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

Jawab prompt Impor Kata Sandi dengan kata sandi. Jawab permintaan Passowrd Ekspor dengan <CR>

Selesai

Perhatikan bahwa ini menangani sejumlah sertifikat menengah yang mungkin ada dalam bundel ...

Saya sangat menyarankan untuk berhati-hati dengan file yang dihasilkan; itu akan menjadi ide yang baik untuk mengatur umask ke 377 pertama (non-unix: ini berarti hanya pemilik yang dapat membaca file yang dibuat.) Saya kira itu 2 langkah, jika umask default Anda permisif ...

Tackhackque
sumber
2

Sekarang, kunci pribadi:

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

Hapus sekarang frasa sandi:

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

2 langkah dapat diganti dengan

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

Tak satu pun dari ini bekerja untuk saya. Pada akhirnya saya kembali ke kode dotNet yang berfungsi pertama kali.

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;
    }
}
Nick van Esch
sumber