Python pycurl失败,但是curl(来自bash)在ubuntu中工作

Python pycurl失败,但是curl(来自bash)在ubuntu中工作,python,ssl,curl,https,pycurl,Python,Ssl,Curl,Https,Pycurl,我使用curl和pycurl连接到一个安全的第三方api,当我使用pycurl时,我会从服务器返回身份验证错误,但是当我在命令行上使用curl并做同样的事情时,它会工作。我将两者都设置为详细模式,并看到请求中存在一些差异,但我似乎无法找出错误是什么 他们似乎在使用不同的加密方法,也许这就是问题所在?如果有人对pycurl有不同的想法,或者有人建议重新编译pycurl,使其像curl一样工作,那就太棒了。谢谢 以下是我的pycurl设置,仅供参考: buffer = cStringIO.S

我使用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
python test.py
18:09:13299根信息获取:https://secure.....
*即将连接()以保护。。。。1129 (#0)
*尝试216……*有联系的
*已连接到安全。。。。端口1129(0)
*在/etc/ssl/certs/ca-certificates.crt中找到102个证书
*服务器证书验证正常
*通用名称:安全。。。。(匹配)
*服务器证书到期日期确定
*服务器证书激活日期确定
*证书公钥:RSA
*证书版本:#3
*主题:。。。。。。。
*开始日期:2009年2月14日星期六22:45:27 GMT
*到期日期:2010年2月15日星期一格林威治标准时间22:45:27
*发行人:。。。
*压缩:空
*密码:AES 128 CBC
*麦克:沙
用户代理:PycURL/7.16.4
主持人:安全。。。。
接受:*/*
内容长度:387
内容类型:application/x-www-form-urlencoded
用户代理:curl/7.16.4(i486 pc linux gnu)libcurl/7.16.4 OpenSSL/0.9.8e zlib/1.2.3.3 libidn/1.0
>主机:安全…:1129
>接受:*/*
>内容长度:387
>内容类型:application/x-www-form-urlencoded
> 
我在理解您发布的代码/输出片段时有点困难。是否包含实际的错误消息

SSL/TLS的问题通常是由于X.509证书基础结构造成的。有“证书颁发机构”(CA),如Verisign、RapidSSL等,对服务器的证书进行数字“签名”。要检查这些签名,您需要CA的所谓“根证书”,该CA签署了您所连接的服务器(“颁发者”)的证书

通常操作系统预装了相当数量的证书。通常浏览器、操作系统和某些库都有自己的证书列表。在Mac电脑上,如果启动“钥匙链访问”程序并打开“系统根”钥匙链,您可以看到它们


所以我建议你检查一下Ubuntu是否缺少证书,如果是的话,把它添加到那里。(可能这些都保存在/etc/ssl/certs/中)

Ubuntu pycurl使用GnuTLS,而Ubuntu curl命令行使用OpenSSL。 存在差异,例如支持的证书格式

就我个人而言,我无法理解ubuntu开发者/包装商做出的这一决定。我有一次偶然发现了这个问题,无法解决它,幸运的是除了ubuntu还有其他发行版:-)

你可以试着向“人类对待他人”抱怨