pycurl не работает, но curl (из bash) работает в Ubuntu - PullRequest
3 голосов
/ 20 февраля 2009

Я использую curl и pycurl для подключения к безопасному стороннему API, и когда я использую pycurl, я получаю ошибки аутентификации с сервера, но когда я использую curl в командной строке и делаю то же самое, это работает , Я установил оба в подробный режим и вижу некоторые различия в запросе, но я не могу понять, что это за ошибка.

Кажется, они используют разные методы шифрования, возможно, в этом проблема? Если у кого-то есть идеи по поводу различных вариантов, чтобы попробовать Pycurl, или предложения по перекомпиляции Pycurl для работы как curl, это было бы здорово. Спасибо.

Вот мои настройки Pycurl, к вашему сведению:

    buffer = cStringIO.StringIO()

    curl = pycurl.Curl()
    curl.setopt(pycurl.VERBOSE,1) 
    curl.setopt(pycurl.POST, 1)
    curl.setopt(pycurl.POSTFIELDS, post_data)
    curl.setopt(pycurl.TIMEOUT_MS, self.HTTP_TIMEOUT)
    curl.setopt(pycurl.URL, url)
    curl.setopt(pycurl.FOLLOWLOCATION, self.HTTP_FOLLOW_REDIRECTS)
    curl.setopt(pycurl.MAXREDIRS, self.HTTP_MAX_REDIRECTS)
    curl.setopt(pycurl.WRITEFUNCTION, buffer.write)
    curl.setopt(pycurl.NOSIGNAL, 1)
    curl.setopt(pycurl.SSLCERT, self.path_to_ssl_cert)

    curl.setopt(pycurl.SSL_VERIFYPEER, 0)

    # 1/0

    try:
        curl.perform()

...

О, последнее: тот же скрипт Python, который я использую, работает на моем ноутбуке Mac, но не работает на сервере Ubuntu, который я пытаюсь настроить.

python test.py 
18:09:13,299 root INFO fetching: https://secure.....
* About to connect() to secure.... 1129 (#0)
*   Trying 216....... * connected
* Connected to secure.... port 1129 (#0)
* found 102 certificates in /etc/ssl/certs/ca-certificates.crt
*        server certificate verification OK
*        common name: secure.... (matched)
*        server certificate expiration date OK
*        server certificate activation date OK
*        certificate public key: RSA
*        certificate version: #3
*        subject: .......
*        start date: Sat, 14 Feb 2009 22:45:27 GMT
*        expire date: Mon, 15 Feb 2010 22:45:27 GMT
*        issuer: ...
*        compression: NULL
*        cipher: AES 128 CBC
*        MAC: SHA
User-Agent: PycURL/7.16.4
Host: secure....
Accept: */*
Content-Length: 387
Content-Type: application/x-www-form-urlencoded

< HTTP/1.1 200 OK
< Content-Length: 291
< 
* Connection #0 to host secure.... left intact
* Closing connection #0


 curl -v -d '...' --cert cert.pem  https://secure....
* About to connect() to secure.... port 1129 (#0)
*   Trying 216....... connected
* Connected to secure.... port 1129 (#0)
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: none
* SSLv2, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Request CERT (13):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS handshake, CERT verify (15):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using AES256-SHA
* Server certificate:
*        subject: .......
*        start date: 2009-02-14 22:45:27 GMT
*        expire date: 2010-02-15 22:45:27 GMT
*        common name: secure.... (matched)
*        issuer: ... Certificate Authority
* SSL certificate verify ok.
> User-Agent: curl/7.16.4 (i486-pc-linux-gnu) libcurl/7.16.4 OpenSSL/0.9.8e zlib/1.2.3.3 libidn/1.0
> Host: secure....:1129
> Accept: */*
> Content-Length: 387
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 200 OK
< Content-Length: 342

Ответы [ 2 ]

3 голосов
/ 18 сентября 2009

Ubuntu pycurl использует GnuTLS, в то время как командная строка ubuntu curl использует OpenSSL. Есть различия, например в поддерживаемых форматах сертификатов.

Я, например, не могу понять это решение, принятое разработчиками / упаковщиками Ubuntu. Я однажды наткнулся на это и не смог обойти его, к счастью, есть и другие дистрибутивы, кроме ubuntu:

Вы всегда можете попытаться пожаловаться "человечеству на других".

1 голос
/ 02 марта 2009

У меня небольшая проблема с пониманием фрагментов кода / вывода, которые вы разместили. Включено ли фактическое сообщение об ошибке?

Проблемы с SSL / TLS часто возникают из-за инфраструктуры сертификатов X.509. Существуют «Центры сертификации» (CA), такие как Verisign, RapidSSL и т. Д., Которые в цифровой форме «подписывают» сертификаты серверов. Чтобы проверить эти подписи, вам нужен так называемый «корневой сертификат» ЦС, который подписал сертификат сервера («эмитента»), к которому вы подключаетесь.

Обычно операционные системы поставляются с достаточным количеством предварительно установленных сертификатов. И часто Браузеры, ОС и некоторые библиотеки имеют собственный список сертификатов. На Mac вы можете увидеть их, если вы запустите программу «Keychain Access» и откроете «System Roots» keychain.

Поэтому я предлагаю вам проверить, отсутствует ли сертификат в Ubuntu и, если да, добавить его туда. (Может быть, все это сохранено в / etc / ssl / certs /)

...