Як видалити пароль приватного ключа з контейнера pkcs12?


40
  1. Я витягнув сертифікат за допомогою команди SSL / експорту Chrome.
  2. Потім надано його як вхід до openvpn - у конфігурації для openvpn:
    pkcs12 "path/to/pkcs12_container"
  3. Під час дзвінка openvpn ~/openvp_configзапитує пароль для приватного ключа (який я вводив під час експорту за допомогою Chrome):
    Enter Private Key Password:...
  4. Я хочу видалити цей запит на пароль.

Питання: як видалити пароль для приватного ключа з pkcs12?

Тобто створити файл pkcs12, який не потребує пароля.

(здається, я вже якось це робив рік тому, а тепер забув це. чорт.)


такий сценарій робить це (по суті, це відповідь нуля 0): gist.github.com/5nizza/7ae9cff0d43f33818a33 використання:./remove_pass_from_cert.sh YourCertName YourCertPass
Айрат

Відповіді:


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 вашого ключа. - У мене є друкарська помилка у відповіді, виправляючи ... - сміливо заявляйте та приймайте відповідь після того, як ви її спробували :-)
нуль0

2
-nodesігнорується при -exportвикористанні, це не задокументовано для цього випадку (див. сторінку відкритих сторінок, -nodesперераховано лише під час експорту з PKCS №12 до PEM). Ваш останній дзвінок все ще вимагає отримати експортний пароль. І якщо я просто натиснув return, я отримаю файл 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

Я не бачу недоліків у цьому підході.
Метт Бекман

Для деяких інструментів потрібен пароль. Наприклад, keytool -v -list -storetype pkcs12 -keystore unprotected.p12він надсилатиме попередження і НЕ перелічить сертифікат. Тож це може працювати для OpenVPN, але не для чогось іншого.
mivk

@mivk, що ти маєш на увазі? Що для деяких інструментів потрібен ключ, захищений паролем?
Коен.

1
Звичайно, але питання полягає у видаленні пароля, а не в програмах, які потребують встановлення пароля.
Коен.

2
Ваше рішення створює не PKCS # 12 w / oa пароль, а пароль із паролем, який є "" (emtpy string), що не є тим самим.
Мецький

5

Це легко зробити за один крок без тимчасового файлу:

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

Відповідь на запит імпорту пароля. Відповідайте на підказки "Експортувати Пассоурд" за допомогою <CR>

Зроблено.

Зауважте, що це обробляє будь-яку кількість проміжних сертифікатів, які можуть бути в комплекті ...

Настійно рекомендую подбати про отриманий файл; було б непогано встановити спочатку umask на 377 (non-unix: це означає, що тільки власник може читати створений файл.) Я вважаю, що це 2 кроки, якщо ваш umask за замовчуванням дозволений ...


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;
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.