- Вопрос или проблема
- Экспортировать во временный pem файл
- Конвертировать pem обратно в p12
- Удалить временный сертификат
- Ответ или решение
- Как удалить пароль с закрытого ключа в контейнере PKCS#12
- Основные шаги для удаления пароля с закрытого ключа
- 1. Извлечение компонентов из PKCS#12
- 2. Удаление пароля с закрытого ключа
- 3. Создание нового PKCS#12 файла без пароля
- Завершение
- Заключение
Вопрос или проблема
- Я извлек сертификат с помощью команды SSL/export в Chrome.
- Затем я передал его как ввод в openvpn – в конфигурации для openvpn:
pkcs12 "путь/к/pkcs12_контейнеру"
- При вызове
openvpn ~/openvp_config
он запрашивает пароль для закрытого ключа (который я ввел при экспорте с помощью Chrome):
Введите пароль закрытого ключа:...
- Я хочу удалить этот запрос пароля.
Вопрос: как убрать пароль для закрытого ключа из 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. Я попробовал все ответы из этой темы, но затем наткнулся на какую-то статью в блоге, которая в итоге сработала для меня.
К сожалению, ни один из опубликованных до сих пор ответов не является правильным, так как они просто предоставляют пустой пароль вместо отсутствия пароля, что означает, что вас все равно спросят о пароле в первую очередь.
Для того, чтобы все было вместе в одном месте, я скопирую сообщение @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
. Следуя приведенным шагам, вы сможете интегрировать ваш сертификат в автоматизированные системы без необходимости в постоянном вводе пароля. Помните о важности безопасного хранения ваших ключей и сертификатов, поскольку неправильное обращение с ними может привести к угрозам безопасности.