Как удалить пароль закрытого ключа из контейнера pkcs12?

Вопрос или проблема

  1. Я извлек сертификат с помощью команды SSL/export в Chrome.
  2. Затем я передал его как ввод в openvpn – в конфигурации для openvpn:
    pkcs12 "путь/к/pkcs12_контейнеру"
  3. При вызове openvpn ~/openvp_config он запрашивает пароль для закрытого ключа (который я ввел при экспорте с помощью Chrome):
    Введите пароль закрытого ключа:...
  4. Я хочу удалить этот запрос пароля.

Вопрос: как убрать пароль для закрытого ключа из pkcs12?

То есть создать файл pkcs12, который не требует пароля.

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

Это можно сделать с помощью различных вызовов openssl.

  • ПАРОЛЬ – ваш текущий пароль
  • ВашPKCSФайл – файл, который вы хотите конвертировать
  • НовыйPKCSБезПароляФайл – целевой файл для PKCS12 без пароля

Сначала извлеките сертификат:

$ openssl pkcs12 -clcerts -nokeys -legacy -in "ВашPKCSФайл" \
      -out certificate.crt -password pass:ПАРОЛЬ -passin pass:ПАРОЛЬ

Во-вторых, ключ CA:

$ openssl pkcs12 -cacerts -nokeys -legacy -in "ВашPKCSФайл" \
      -out ca-cert.ca -password pass:ПАРОЛЬ -passin pass:ПАРОЛЬ

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

$ openssl pkcs12 -nocerts -legacy -in "ВашPKCSФайл" \
      -out private.key -password pass:ПАРОЛЬ -passin pass:ПАРОЛЬ \
      -passout pass:ВременныйПароль

Теперь уберите пароль:

$ openssl rsa -legacy -in private.key -out "НовыйФайлКлюча.key" \
      -passin pass:ВременныйПароль

Соберите все вместе для нового PKCS-файла:

$ cat "НовыйФайлКлюча.key"  \
      "certificate.crt" \
      "ca-cert.ca" > PEM.pem

И создайте новый файл:

$ openssl pkcs12 -export -nodes -CAfile ca-cert.ca \
      -in PEM.pem -out "НовыйPKCSБезПароляФайл"

Теперь у вас есть новый файл ключа PKCS12 без пароля на закрытой части ключа.

Самое простое решение которое я нашел это

Экспортировать во временный pem файл

openssl pkcs12 -in protected.p12 -nodes -out temp.pem
#  -> Введите пароль

Конвертировать pem обратно в p12

openssl pkcs12 -export -in temp.pem  -out unprotected.p12
# -> Просто нажмите [return] дважды, чтобы не вводить пароль

Удалить временный сертификат

rm temp.pem

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

openssl pkcs12 -in "PKCSФайл" -nodes | openssl pkcs12 -export -out "PKCSФайл-БезПароля"

Ответьте на запрос пароля импорта паролем.
Ответьте на запрос пароля экспорта, нажав <CR>

Готово.

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

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

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

openssl pkcs12 -nocerts -in "ВашPKCSФайл" -out private.key -password pass:ПАРОЛЬ -passin pass:ПАРОЛЬ -passout pass:ВременныйПароль

Теперь удалите пароль:

openssl rsa -in private.key -out "НовыйФайлКлюча.key" -passin pass:ВременныйПароль

Эти 2 шага можно заменить на

openssl pkcs12 -nocerts -in "ВашPKCSФайл" -out private.key -nodes

Мой случай использования был в удалении пароля из файла .p12 для fastlane. Я попробовал все ответы из этой темы, но затем наткнулся на какую-то статью в блоге, которая в итоге сработала для меня.

  1. Импортируйте свой файл .p12 в Keychain Access. Вы можете сделать это просто дважды щелкнув файл. Вам будет предложен пароль для закрытого ключа. Введите его.

  2. Экспортируйте этот сертификат как в .cer, так и в .p12. Когда запросит пароль для .p12, подтвердите пустое текстовое поле.

    введите описание изображения здесь

К сожалению, ни один из опубликованных до сих пор ответов не является правильным, так как они просто предоставляют пустой пароль вместо отсутствия пароля, что означает, что вас все равно спросят о пароле в первую очередь.

Для того, чтобы все было вместе в одном месте, я скопирую сообщение @slm с небольшими изменениями;

  • ПАРОЛЬ – ваш текущий пароль
  • ВашPKCSФайл – файл, который вы хотите конвертировать
  • НовыйPKCSБезПароляФайл – целевой файл для PKCS12 без пароля

Сначала извлеките сертификат:

$ openssl pkcs12 -clcerts -nokeys -in "ВашPKCSФайл" -out certificate.crt \
    -password pass:ПАРОЛЬ -passin pass:ПАРОЛЬ

Во-вторых, сертификат CA (выдавший):

$ openssl pkcs12 -cacerts -nokeys -in "ВашPKCSФайл" -out ca-cert.ca \
    -password pass:ПАРОЛЬ -passin pass:ПАРОЛЬ

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

$ openssl pkcs12 -nocerts -in "ВашPKCSФайл" -out private.key -password \
    pass:ПАРОЛЬ -passin pass:ПАРОЛЬ -passout pass:ВременныйПароль

Теперь удалите пароль:

$ openssl rsa -in private.key -out "НовыйФайлКлюча.key" -passin pass:ВременныйПароль

Соберите все вместе для нового PKCS-файла:

Bash:

$ cat "НовыйФайлКлюча.key" "certificate.crt" "ca-cert.ca" > PEM.pem

CMD:

$ type "НовыйФайлКлюча.key" "certificate.crt" "ca-cert.ca" > PEM.pem

И создайте новый файл:

$ openssl pkcs12 -export -nodes -CAfile ca-cert.ca -in PEM.pem
    -out "НовыйPKCSБезПароляФайл.p12" -passout pass:

Вот чистое решение на PowerShell, которое работает без OpenSSL:

Install-Module -Name 'Carbon.Cryptography'
$password = Read-Host -AsSecureString
$cert = Get-CCertificate -Path PATH -Password $password -KeyStorageFlags Exportable
[IO.File]::WriteAllBytes(OUT_PATH, $cert.Export('Pfx'))

Ни одно из этих решений не сработало для меня. В конце концов, я вернулся к коду 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} с ({2} -> {3})", _infile, _outfile, _password, _outpassword));
        System.Security.Cryptography.X509Certificates.X509Certificate2 cert = null;

        Console.WriteLine(String.Format("Загрузить {0} с {2}", _infile, _outfile, _password, _outpassword));
        cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(_infile, _password, System.Security.Cryptography.X509Certificates.X509KeyStorageFlags.Exportable);

        Console.WriteLine(String.Format("Экспорт {1} с {3}", _infile, _outfile, _password, _outpassword));
        System.IO.File.WriteAllBytes(_outfile, cert.Export(System.Security.Cryptography.X509Certificates.X509ContentType.Pfx, _outpassword));

        Console.WriteLine(String.Format("Экспорт завершен", _infile, _outfile, _password, _outpassword));
    }

    static public void MainHelp(string[] args)
    {
        Console.WriteLine("Использование pfxremovepwd [inpfx] [inpwd] [outpfx] [необязательно outpwd]");
        return;
    }
}

Ответ или решение

Как удалить пароль с закрытого ключа в контейнере PKCS#12

Одной из распространенных задач, связанных с управлением сертификатами, является необходимость удаления пароля с закрытого ключа в файле формата PKCS#12. Этот формат часто используется для хранения как сертификатов, так и закрытых ключей, но может потребоваться его использование без запроса пароля, особенно в ситуациях автоматизации, таких как использование VPN-клиентов, например OpenVPN.

Основные шаги для удаления пароля с закрытого ключа

Для выполнения этой задачи можно использовать инструмент OpenSSL. Процесс включает несколько шагов, каждый из которых имеет свое назначение.

1. Извлечение компонентов из PKCS#12

Для начала необходимо извлечь сертификат, сертификат центра сертификации (CA) и закрытый ключ из вашего файла PKCS#12. Эти шаги позволят вам получить все необходимые компоненты без пароля.

# Извлечение сертификата
openssl pkcs12 -clcerts -nokeys -in YourPKCSFile.p12 -out certificate.crt -password pass:PASSWORD -passin pass:PASSWORD

# Извлечение CA сертификата
openssl pkcs12 -cacerts -nokeys -in YourPKCSFile.p12 -out ca-cert.ca -password pass:PASSWORD -passin pass:PASSWORD

# Извлечение закрытого ключа с временным паролем
openssl pkcs12 -nocerts -in YourPKCSFile.p12 -out private.key -password pass:PASSWORD -passin pass:PASSWORD -passout pass:TemporaryPassword

2. Удаление пароля с закрытого ключа

После извлечения закрытого ключа необходимо удалить его пароль. Это можно сделать с помощью команды:

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

3. Создание нового PKCS#12 файла без пароля

После удаления пароля с закрытого ключа необходимо объединить все компоненты и создать новый файл PKCS#12. Для этого объедините все заполненные файлы в один:

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

Затем создайте новый PKCS#12 файл без пароля:

openssl pkcs12 -export -nodes -in PEM.pem -out NewPKCSWithoutPassphraseFile.p12 -passout pass:

Завершение

Теперь у вас есть новый файл PKCS#12 (NewPKCSWithoutPassphraseFile.p12), который не требует ввода пароля при использовании. Вам следует обратить внимание на безопасность этого файла:

  • Убедитесь, что файл доступен только тем пользователям, которым он необходим.
  • Переопределите права доступа с помощью команды chmod 400 NewPKCSWithoutPassphraseFile.p12 на UNIX-системах.

Заключение

Удаление пароля с закрытого ключа в файле PKCS#12 является вполне осуществимой задачей с помощью OpenSSL. Следуя приведенным шагам, вы сможете интегрировать ваш сертификат в автоматизированные системы без необходимости в постоянном вводе пароля. Помните о важности безопасного хранения ваших ключей и сертификатов, поскольку неправильное обращение с ними может привести к угрозам безопасности.

Оцените материал
Добавить комментарий

Капча загружается...