пятница, 29 ноября 2013 г.

Linux, wget, SSL и самоподписной сертификат

Столкнулся недавно с необходимостью получения данных по 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


...


Всё работает.

Комментариев нет:

Отправить комментарий