Как удалить пароль закрытого ключа из контейнера 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, который не требует пароля.

(кажется, что я уже как-то сделал это год назад, а теперь забыл. Черт.)


следующий скрипт делает это ( в основном это zero0 ответ): gist.github.com/5nizza/7ae9cff0d43f33818a33 использование:./remove_pass_from_cert.sh YourCertName YourCertPass
Айрат

Ответы:


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: Это часть сертификата CA вашего ключа. - У меня есть опечатка в ответе, исправляющая ... - не стесняйтесь высказаться и принять ответ после того, как вы его попробовали :-)
zero0

2
-nodesигнорируется при -exportиспользовании, для этого случая не документируется (см. справочную страницу openssl, отображается -nodesтолько при экспорте из PKCS # 12 в PEM). Ваш последний звонок все еще запрашивает у меня пароль для экспорта. И если я просто нажму кнопку return, я получу файл PKCS # 12, пароль которого является пустой строкой, а не пароль без пароля. Когда я делаю openssl pkcs12 -in "NewPKCSWithoutPassphraseFile"это, он все равно запрашивает пароль для импорта. Я могу просто нажать кнопку возврата, и это работает, но если бы не было пароля, он даже не запросил бы.
Меки

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 без пароля, а пароль с паролем "" (строка emtpy), который не совпадает.
Меки

5

Это легко сделать за один шаг без временного файла:

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

Ответьте на приглашение «Импортировать пароль» с паролем. Ответьте на запросы экспорта Passowrd с помощью <CR>

Выполнено.

Обратите внимание, что это обрабатывает любое количество промежуточных сертификатов, которые могут быть в комплекте ...

Я настоятельно рекомендую позаботиться о полученном файле; было бы неплохо сначала установить umask на 377 (не-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.