Назад | Перейти на главную страницу

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

(кажется, я уже как-то так год назад делал, а сейчас забыл, черт возьми.)

Это может быть достигнуто различными 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 без парольной фразы в части закрытого ключа.

Самое простое решение я обнаружил является

Экспорт во временный файл 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

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

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

Ответьте на запрос «Импорт пароля» с паролем. Ответьте на запросы Export Passowrd с помощью <CR>

Готово.

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

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

Теперь закрытый ключ:

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

У меня ничего из этого не сработало. В конце концов я вернулся к коду 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, System.Security.Cryptography.X509Certificates.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;
    }
}