Димон
Новичок
Curl и сертификаты
Приветствую всех!
Парюсь над одной проблемой. Есть сайт с которым мне нужно построить автоматизированную систему запросов. Сайт использует https-протокол.
При обращении к сайту он посылает сертификат, удостоверящий "личность" сервера (сайта) и ставит сессионную куку. Дальше можно залогиниться и начать работу с ресурсом.
Получаемый сертификат имеет только открытый ключ.
Теперь, те же шаги я воспроизвожу через curl (предварительно экспортирую сертификат в формате PEM (для curl) в файл my.crt).
Но авторизоваться не получается. Пишет ошибку curl: unable to set private key file.
Т.е. нужен закрытый ключ, которого у меня нет, и который не предоставляется самим сайтом. Это значит, что шифруются только исходящие сообщения, а расшифровываются только на сервере с помощью закрытого ключа.
Опции сертификатов curl, которые я указываю:
CURLOPT_SSL_VERIFYPEER 0 // отключаю проверку соответствия сертификата доверенным сертификационным центрам (т.к. сертификат подписан другим серт.центром)
CURLOPT_SSLCERT my.crt
Перегуглил уже пол интернета и походу дело в том, что curl не отправляет запрос без наличия закрытого ключа. Но ключа нет. Если, блин, браузер отправляет запрос, значит и курл должен это уметь сделать!
Может кто сталкивался с такой фигней?
-~{}~ 29.12.09 14:00:
Ну и заипца в курлу подсунули. Смотрю сорсы либы и там:
if(SSL_CTX_use_PrivateKey_file(ctx, key_file, file_type) != 1) {
failf(data, "unable to set private key file: '%s' type %s",
key_file, key_type?key_type:"PEM");
Значит предположение было верным. Теперь надо искать, как это добро "по-хорошему" отключить.
-~{}~ 31.12.09 16:13:
Епты!!! Я наипал этот курл! Сорри за эмоции, но я убил на это туеву хучу времени, тщетно обшарил пол-интернета в поисках ответа, на ипонском и китайском, наверное, только не читал страницы.. Проблема редкая, но не единичная. Но решения так никто, почему-то и не предложил. Походу забили все просто.
Короче, сделал так:
Используя тулзу "OpenSSL" вытащил из сертификата публичный (открытый) ключ. С помощью этого ключа и openssl зашифровал данные, которые должны поститься на сервер. Далее для fsockopen сформировал строку пост-запроса с заголовками и зашифрованной строкой данных. Отправил все это добро и получил долгожданный ответ, о том что авторизация прошла успешно!
Я пошел пить и отмечать новый год
Как оклемаюсь после праздников и оформлю все это в виде нормального, юзабельного класса, то выложу на форум.
Всех с наступающим!
П.С. Много не пейте, позы меняйте
))
Приветствую всех!
Парюсь над одной проблемой. Есть сайт с которым мне нужно построить автоматизированную систему запросов. Сайт использует https-протокол.
При обращении к сайту он посылает сертификат, удостоверящий "личность" сервера (сайта) и ставит сессионную куку. Дальше можно залогиниться и начать работу с ресурсом.
Получаемый сертификат имеет только открытый ключ.
Теперь, те же шаги я воспроизвожу через curl (предварительно экспортирую сертификат в формате PEM (для curl) в файл my.crt).
Но авторизоваться не получается. Пишет ошибку curl: unable to set private key file.
Т.е. нужен закрытый ключ, которого у меня нет, и который не предоставляется самим сайтом. Это значит, что шифруются только исходящие сообщения, а расшифровываются только на сервере с помощью закрытого ключа.
Опции сертификатов curl, которые я указываю:
CURLOPT_SSL_VERIFYPEER 0 // отключаю проверку соответствия сертификата доверенным сертификационным центрам (т.к. сертификат подписан другим серт.центром)
CURLOPT_SSLCERT my.crt
Перегуглил уже пол интернета и походу дело в том, что curl не отправляет запрос без наличия закрытого ключа. Но ключа нет. Если, блин, браузер отправляет запрос, значит и курл должен это уметь сделать!
Может кто сталкивался с такой фигней?
-~{}~ 29.12.09 14:00:
Ну и заипца в курлу подсунули. Смотрю сорсы либы и там:
if(SSL_CTX_use_PrivateKey_file(ctx, key_file, file_type) != 1) {
failf(data, "unable to set private key file: '%s' type %s",
key_file, key_type?key_type:"PEM");
Значит предположение было верным. Теперь надо искать, как это добро "по-хорошему" отключить.
-~{}~ 31.12.09 16:13:
Епты!!! Я наипал этот курл! Сорри за эмоции, но я убил на это туеву хучу времени, тщетно обшарил пол-интернета в поисках ответа, на ипонском и китайском, наверное, только не читал страницы.. Проблема редкая, но не единичная. Но решения так никто, почему-то и не предложил. Походу забили все просто.
Короче, сделал так:
Используя тулзу "OpenSSL" вытащил из сертификата публичный (открытый) ключ. С помощью этого ключа и openssl зашифровал данные, которые должны поститься на сервер. Далее для fsockopen сформировал строку пост-запроса с заголовками и зашифрованной строкой данных. Отправил все это добро и получил долгожданный ответ, о том что авторизация прошла успешно!
Я пошел пить и отмечать новый год

Всех с наступающим!
П.С. Много не пейте, позы меняйте
