Столкнулся недавно с необходимостью получения данных по https из консоли с использованием клиентского сертификата. При этом и клиентский и серверный сертификаты не от какого-то публичного доверенного центра сертификации.
Задача: имея на "руках" p12-сертификат получить данные с некоего сервиса.
Увы, но wget отказался получать данные, да и вообще устанавливать безопасное соединение. Немного погуглив нашёл множество вопросов по теме, но все имеющиеся ответы на них проблему не решали.
Ковырясь и подбирая варианты запросов получал такие ошибки:
OpenSSL: error:14094413:SSL routines:SSL3_READ_BYTES:sslv3 alert unsupported certificate
Unable to establish SSL connection.
OpenSSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch
Disabling SSL due to encountered errors.
OpenSSL: error:0906D06C:PEM routines:PEM_read_bio:no start line
OpenSSL: error:140AD009:SSL routines:SSL_CTX_use_certificate_file:PEM lib
Disabling SSL due to encountered errors.
(попытался их воспроизвести, может быть не все варианты вспомнил)
А всё оказалось достаточно просто. Wget хочет сертификат в PEM-формате. P12 без проблем конвертируется в PEM и данные не теряются, т.е. в моём случае в p12 был и сертификат сервера и клиентский сертификат и сертификат центра сертификации - специально проверил, что pem сохраняет их все, можно потом сконвертировать pem в p12 и с итоговым сертификатом всё будет работать так же как и с исходным p12 (собственно, сертификат экспортирован из IE, где всё работает).
В общем wget'у нужен pem-сертификат, но извлечь из одного файла-сертификата все нужные данные он не может (а точнее не он, а openssl либа в linux'е). Для решения нужно из исходного одного сертификата экспортировать все сущности в три файла: центр сертификации, сертификат сервера и клиентский сертификат.
Дошёл я до этого не сразу, поэтому в history много вариантов экспорта ключей. Если не ошибаюсь, то нужные варианты сертификатов можно получить следующим способом:
$ openssl pkcs12 -nocerts -in servs.p12 -out servkey.pem -nodes
$ openssl pkcs12 -clcerts -nokeys -in servs.p12 -out servcert.pem -nodes
$ openssl pkcs12 -in servs.p12 -export -out serv.pem
После этого можно спокойно выполнять:
$ wget --ca-certificate=serv.pem --certificate=servcert.pem --private-key=servkey.pem --server-response 'https://www.nekiysite.ru/content.xml' -O -
Connecting to www.nekiysite.ru (www.nekiysite.ru)|111.222.111.222|:443... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
...
Всё работает.
Задача: имея на "руках" p12-сертификат получить данные с некоего сервиса.
Увы, но wget отказался получать данные, да и вообще устанавливать безопасное соединение. Немного погуглив нашёл множество вопросов по теме, но все имеющиеся ответы на них проблему не решали.
Ковырясь и подбирая варианты запросов получал такие ошибки:
OpenSSL: error:14094413:SSL routines:SSL3_READ_BYTES:sslv3 alert unsupported certificate
Unable to establish SSL connection.
OpenSSL: error:0B080074:x509 certificate routines:X509_check_private_key:key values mismatch
Disabling SSL due to encountered errors.
OpenSSL: error:0906D06C:PEM routines:PEM_read_bio:no start line
OpenSSL: error:140AD009:SSL routines:SSL_CTX_use_certificate_file:PEM lib
Disabling SSL due to encountered errors.
(попытался их воспроизвести, может быть не все варианты вспомнил)
А всё оказалось достаточно просто. Wget хочет сертификат в PEM-формате. P12 без проблем конвертируется в PEM и данные не теряются, т.е. в моём случае в p12 был и сертификат сервера и клиентский сертификат и сертификат центра сертификации - специально проверил, что pem сохраняет их все, можно потом сконвертировать pem в p12 и с итоговым сертификатом всё будет работать так же как и с исходным p12 (собственно, сертификат экспортирован из IE, где всё работает).
В общем wget'у нужен pem-сертификат, но извлечь из одного файла-сертификата все нужные данные он не может (а точнее не он, а openssl либа в linux'е). Для решения нужно из исходного одного сертификата экспортировать все сущности в три файла: центр сертификации, сертификат сервера и клиентский сертификат.
Дошёл я до этого не сразу, поэтому в history много вариантов экспорта ключей. Если не ошибаюсь, то нужные варианты сертификатов можно получить следующим способом:
$ openssl pkcs12 -nocerts -in servs.p12 -out servkey.pem -nodes
$ openssl pkcs12 -clcerts -nokeys -in servs.p12 -out servcert.pem -nodes
$ openssl pkcs12 -in servs.p12 -export -out serv.pem
После этого можно спокойно выполнять:
$ wget --ca-certificate=serv.pem --certificate=servcert.pem --private-key=servkey.pem --server-response 'https://www.nekiysite.ru/content.xml' -O -
Connecting to www.nekiysite.ru (www.nekiysite.ru)|111.222.111.222|:443... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
...
Всё работает.
Комментариев нет:
Отправить комментарий