【问题标题】:HTTPS connection PythonHTTPS 连接 Python
【发布时间】:2011-01-09 22:09:21
【问题描述】:

我正在尝试验证该目标是否公开了 https 网络服务。我有通过 HTTP 连接的代码,但我不确定如何通过 HTTPS 连接。我读过你使用 SSL,但我也读过它不支持证书错误。我得到的代码来自 python 文档:

import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("GET", "/index.html")
r1 = conn.getresponse()
print r1.status, r1.reason

有人知道如何连接到 HTTPS 吗?

我已经尝试过 HTTPSConenction,但它以错误代码响应,声称 httplib 没有属性 HTTPSConnection。我也没有可用的 socket.ssl。

我已经安装了 Python 2.6.4,但我认为它没有编译 SSL 支持。有没有办法将此支持集成到较新的 python 中而无需再次安装。

我已经安装了 OpenSSL 和 pyOpenSsl,并且我已经从一个答案中尝试了以下代码:

import urllib2
from OpenSSL import SSL
try: 
    response = urllib2.urlopen('https://example.com')  
    print 'response headers: "%s"' % response.info() 
except IOError, e: 
    if hasattr(e, 'code'): # HTTPError 
        print 'http error code: ', e.code 
    elif hasattr(e, 'reason'): # URLError 
        print "can't connect, reason: ", e.reason 
    else: 
        raise

我有一个错误:

    Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 87, in urlopen
    return opener.open(url)
  File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 203, in open
    return self.open_unknown(fullurl, data)
  File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 215, in open_unknown
    raise IOError, ('url error', 'unknown url type', type)
IOError: [Errno url error] unknown url type: 'https'

有谁知道如何让它工作?

-- UPDATE

我发现了问题所在,我使用的 Python 版本不支持 SSL。我目前在:http://www.webtop.com.au/compiling-python-with-ssl-support 找到了这个解决方案。

代码现在可以在这个非常好的解决方案之后运行。当我导入 ssl 和 HTTPSConnection 时,我知道不会出错。

感谢大家的帮助。

【问题讨论】:

    标签: python ssl https httplib pyopenssl


    【解决方案1】:

    Python 2.x:docs.python.org/2/library/httplib.html

    注意:HTTPS 支持仅在套接字模块使用 SSL 支持编译时可用。

    Python 3.x:docs.python.org/3/library/http.client.html

    注意 HTTPS 支持仅在 Python 编译时使用 SSL 支持(通过 ssl 模块)时可用。

    #!/usr/bin/env python
    
    import httplib
    c = httplib.HTTPSConnection("ccc.de")
    c.request("GET", "/")
    response = c.getresponse()
    print response.status, response.reason
    data = response.read()
    print data
    # => 
    # 200 OK
    # <!DOCTYPE html ....
    

    要验证是否启用了 SSL,请尝试:

    >>> import socket
    >>> socket.ssl
    <function ssl at 0x4038b0>
    

    【讨论】:

    • 请注意,这不会验证远程证书,因此您不会真正通过这种方式获得安全性(因为您并不真正知道您真正在与哪个服务器通信)。
    • 测试中的网址错误
    • 如何通过此响应检查 IP ?
    【解决方案2】:

    检查ssl support in Python 2.6+

    try:
        import ssl
    except ImportError:
        print "error: no ssl support"
    

    通过https连接:

    import urllib2
    
    try:
        response = urllib2.urlopen('https://example.com') 
        print 'response headers: "%s"' % response.info()
    except IOError, e:
        if hasattr(e, 'code'): # HTTPError
            print 'http error code: ', e.code
        elif hasattr(e, 'reason'): # URLError
            print "can't connect, reason: ", e.reason
        else:
            raise
    

    【讨论】:

      【解决方案3】:
      import requests
      r = requests.get("https://stackoverflow.com") 
      data = r.content  # Content of response
      
      print r.status_code  # Status code of response
      print data
      

      【讨论】:

      • @notilas,此代码确实有效。如果您只打印r,您将获得响应对象本身的字符串版本,而不是响应的内容,即您在上面键入的内容&lt;Resposne [200]&gt;。这只是说请求成功(200 是成功的 HTTP 代码)。尝试查看r.contentr.text(或r.json(),如果您的内容是JSON)以获取请求的实际结果。
      • @bjg222 感谢您的解释。
      【解决方案4】:

      【讨论】:

        【解决方案5】:

        如果使用 httplib.HTTPSConnection:

        请看:

        Changed in version 2.7.9:

        这个类现在执行所有必要的证书和主机名 默认检查。恢复到以前的未经验证的行为 ssl._create_unverified_context() 可以传递给上下文 范围。您可以使用:

        if hasattr(ssl, '_create_unverified_context'):
          ssl._create_default_https_context = ssl._create_unverified_context
        

        【讨论】:

          【解决方案6】:

          您为什么没有尝试过 httplib.HTTPSConnection?它不进行 SSL 验证,但这不是通过 https 连接所必需的。 您的代码适用于 https 连接:

          >>> import httplib
          >>> conn = httplib.HTTPSConnection("mail.google.com")
          >>> conn.request("GET", "/")
          >>> r1 = conn.getresponse()
          >>> print r1.status, r1.reason
          200 OK
          

          【讨论】:

            【解决方案7】:

            假设为 socket 模块启用 SSL 支持。

            connection1 = httplib.HTTPSConnection('www.somesecuresite.com')
            

            【讨论】:

              【解决方案8】:

              我有一些代码因HTTPConnection (MOVED_PERMANENTLY error) 而失败,但是当我切换到HTTPS 时,它再次完美运行,无需进行其他更改。这是一个非常简单的修复!

              【讨论】:

              • 与其他答案相比,这有什么不同?也许可以尝试详细说明。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-05-11
              • 1970-01-01
              • 2013-04-10
              • 1970-01-01
              • 2023-03-14
              • 1970-01-01
              • 2015-09-09
              相关资源
              最近更新 更多