【问题标题】:pyinstaller compiled file has ssl issue, error: 185090050pyinstaller 编译的文件有 ssl 问题,错误:185090050
【发布时间】:2013-01-07 08:10:26
【问题描述】:

我有一些 python 代码在 python ide 和 cmd 提示符下成功运行在我的 windows 机器上。

在我使用 pyinstaller 编译(到一个文件中)后,我收到以下错误:

Traceback <most recent call last>:
    File "<string>", line 51, in <module>
    File "build\bdist.win32\egg\oauth2\__init__.py", line 682, in request
    ... ((traceback through httplib2 and then ssl))
ssl.SSLError: [Errno 185090050] _ssl.c:340: error:0B084002:x509 certificates routines:X509_load_cert_crl_file:system lib

导致错误的代码子集如下:

     import oauth2 as oauth
     import httplib2
     import urlparse

     #consumer inputs
     consumer_key    =   'blah'
     consumer_secret =   'blah'
     consumer = oauth.Consumer(consumer_key, consumer_secret)

     #other inputs
     request_token_url = 'https://api.linkedin.com/uas/oauth/requestToken?scope=r_network'
     access_token_url =  'https://api.linkedin.com/uas/oauth/accessToken'
     authorize_url =     'https://api.linkedin.com/uas/oauth/authorize'

     #instantiate consumer object
     client = oauth.Client(consumer)
     resp, content = client.request(request_token_url, "POST", )

应该是一个简单的api请求!我已经查看了所有内容并尝试在代码开头使用以下内容:

    httplib2.Http(ca_certs = 'cacert.pem')

...那没用。

我还用新的 cacert.pem(重命名为 cacerts.txt)替换了我在 httplib2 文件夹中的 cacerts.txt 文件……但这没有用。

我试过用这个来禁用 ssl:

    httplib2.Http(disable_ssl_certificate_validation=True)

...但那没有用。

如何使用 pyinstaller 编译我的 python 脚本,而不是搞砸?

【问题讨论】:

  • 代码中的哪一行导致错误?解决这个问题的最简单方法是尝试删除大部分代码(这有助于使其成为可重现的最小示例)。
  • 这是造成麻烦的请求行。我已经隔离了那么多。 resp, content = client.request(request_token_url, "POST", ) 我认为 pyinstaller 没有打包正确的证书文件,但我不知道如何做到这一点。

标签: python ssl python-requests pyinstaller httplib2


【解决方案1】:

当我尝试使用 OAuth 2.0 连接到谷歌驱动器时,我遇到了同样的问题。我已经搜索,发现解决方案在 init.py 这一行中的 httplib2 中发生了变化

CA_CERTS = os.path.join(
    os.path.dirname(os.path.abspath(__file__ )), "cacerts.txt")

这个别人

CA_CERTS = os.path.join(os.path.dirname(sys.executable), "cacerts.txt")

然后构建 .exe 并将“cacerts.txt”文件放在 .exe 的同一文件夹中。

它对我有用,我希望它也对你有用!

【讨论】:

  • 谢谢,我将文件 cacerts.txt 从 C:\Python27\Lib\site-packages\boto\cacerts 复制到我的项目中,然后 conn = boto.connect_s3(AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) 将 self. ca_certificates_file = os.path.join(os.path.dirname(sys.executable), "cacerts.txt") # for .exe #self.ca_certificates_file = os.path.join(os.path.dirname(_ file_), "cacerts.txt") #用于开发模式
【解决方案2】:

解决了我自己的问题!在我的代码中的每一行之后:

    client = oauth.Client(consumer)

我添加了这一行:

    client.ca_certs = os.path.join(os.path.dirname(__file__),'cacert.pem')

然后我只是将“cacert.pem”文件与我的 exe 一起保存。超级简单。

【讨论】:

    【解决方案3】:

    您必须在您的系统中找到 cacerts.txt 文件并确保您具有读取它的权限。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2011-03-16
      • 2021-11-28
      • 1970-01-01
      • 2021-08-25
      • 1970-01-01
      相关资源
      最近更新 更多