cURL с сертификатом PKCS#12 в bash-скрипте
Мне нужно подключиться к веб-сервису, где сертификат pkcs12 является обязательным. Идея заключалась в том, чтобы использовать curl в скрипте bash (если быть точным, в OS X).
я узнал, что одна из немногих вещей, которые curl не может сделать в общении, это обработка сертификатов pkcs12 (.p12). какие у меня варианты?
Я прочитал, что преобразование сертификата в формат PEM будет работать (с использованием openssl), однако я не знаю, как сообщить curl, что он получает PEM и должен связаться с веб-сервисом, запрашивающим сертификаты PKCS12.
преобразование pkcs12 в pem будет сделано следующим образом (например), у меня это сработало, но я не смог успешно использовать их с curl:
openssl pkcs12 -in mycert.p12 -out file.key.pem -nocerts -nodes
openssl pkcs12 -in mycert.p12 -out file.crt.pem -clcerts -nokeys
какие-нибудь намеки? или какие-нибудь альтернативы скручиванию? решение должно быть основано на командной строке.
4 ответа
Я думаю, что вы уже решили, но у меня была та же проблема. Я отвечу за поделиться своим решением.
Если у вас есть файл.p12, ваш подход правильный. Прежде всего вы должны получить сертификат и ключ отдельно от файла p12. Например, если у вас есть файл mycert.p12, выполните
openssl pkcs12 -in mycert.p12 -out file.key.pem -nocerts -nodes
openssl pkcs12 -in mycert.p12 -out file.crt.pem -clcerts -nokeys
Затем вы должны сделать звонок на ваш URL. Например, предположим, что вы хотите получить wsdl определенного веб-сервиса
curl -E ./file.crt.pem --key ./file.key.pem https://myservice.com/service?wsdl
Если файлы file.crt.pem и file.key.pem находятся в вашей рабочей папке, то "./" является обязательным.
Проверьте, есть ли у вас более новый локон. Более новые версии могут работать с PKCS12 напрямую.
curl --cert-type P12 --cert cert.p12:password https://yoursite.com
Ответ Биоффе правильный.
Он предлагал сделать:
curl --cert-type P12 --cert cert.p12:password https://yoursite.com
По какой-то причине у меня это не сработало. Я получал:
curl не смог открыть файл PKCS12
Я просто экспортировал файл без пароля и использовал следующий формат.
curl --cert-type P12 --cert cert.p12 https://yoursite.com
Вы можете легко проверить, есть ли у вас
curl
может справиться
p12
. Очень вероятно, что это так. Просто делать
man curl
и прокрутите вниз, пока не найдете
cert-type
. У меня было такое:
--cert-type <type>
(TLS) Сообщает curl, какой тип использует предоставленный сертификат клиента. PEM, DER, ENG и P12 являются признанными типами. Если не указано, предполагается PEM.
Если этот вариант используется несколько раз, будет использован последний.
(Я не верю
cmmd + F
работает с текстом, который не отображается в терминале. Так что вам нужно прокрутить вниз.
Вот выдержка из man-страницы Curl:
--cert-type
(TLS) Сообщает Curl, какой тип используется предоставленным клиентским сертификатом. PEM, DER, ENG и P12 являются признанными типами. Если не указано, предполагается PEM.
Если эта опция используется несколько раз, будет использован последний.
См. также -E, --cert и --key и --key-type.
-E, --cert <сертификат[:пароль]>
(TLS) Сообщает Curl использовать указанный файл сертификата клиента при получении файла с помощью HTTPS, FTPS или другого протокола на основе SSL. Сертификат должен быть в формате PKCS#12, если используется Secure Transport, или в формате PEM, если используется любой другой механизм. Если дополнительный пароль не указан, он будет запрошен на терминале. Обратите внимание, что этот параметр предполагает наличие файла «сертификата», который представляет собой объединенный закрытый ключ и сертификат клиента! См. -E, --cert и --key, чтобы указать их независимо.
Если Curl построен на основе библиотеки NSS SSL, тогда этот параметр может указать Curl псевдоним сертификата, который будет использоваться в базе данных NSS, определенной переменной среды SSL_DIR (или по умолчанию /etc/pki/nssdb). Если доступен модуль NSS PEM PKCS#11 (libnsspem.so), файлы PEM можно загрузить. Если вы хотите использовать файл из текущего каталога, поставьте перед ним префикс «./», чтобы избежать путаницы с ником. Если псевдоним содержит ":", ему должен предшествовать "\", чтобы он не распознавался как разделитель пароля. Если псевдоним содержит "\", его необходимо экранировать как "\\", чтобы он не распознавался как escape-символ.