【问题标题】:How to send a HTTPS packet in python?如何在 python 中发送 HTTPS 数据包?
【发布时间】:2015-07-22 06:54:42
【问题描述】:

我想发送一个 HTTPS 打包在 python 中。例如,我想向 Google 服务器发送一些东西。我写了以下程序:

import socket
import ssl

# SET VARIABLES
packet, reply = "<packet>SOME_DATA</packet>", ""
HOST, PORT = 'www.google.com', 443

# CREATE SOCKET
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(10)

# WRAP SOCKET
wrappedSocket = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_TLSv1, ciphers="ADH-AES256-SHA")

# CONNECT AND PRINT REPLY
wrappedSocket.connect((HOST, PORT))
wrappedSocket.send(packet)
print wrappedSocket.recv(1280)

# CLOSE SOCKET CONNECTION
wrappedSocket.close()

但是当我运行它时,我收到以下错误:

>>> ================================ RESTART ================================
>>> 

Traceback (most recent call last):
  File "C:/Users/Desktop/PySSL.py", line 16, in <module>
    wrappedSocket.connect((HOST, PORT))
  File "C:\Python27\lib\ssl.py", line 297, in connect
    self.do_handshake()
  File "C:\Python27\lib\ssl.py", line 281, in do_handshake
    self._sslobj.do_handshake()
SSLError: [Errno 1] _ssl.c:499: error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
>>> 

我该怎么办?

更新:

我已经检查了谷歌加密协议,你可以在下图中看到结果:

但我不知道在程序中如何以及在何处设置此参数。

更新:

请注意,我想提取通信中使用的公钥。因此,请向我建议一种可以提取公钥的方法。我还想设置或查看使用的通信和加密协议。

更新2:

虽然我想手动设置cipherssl_version,但根据答案,我尝试将其从函数调用中删除为参数,然后重试运行程序。好吧,错误改变了:

>>> ================================ RESTART ================================
>>> 
Traceback (most recent call last):
  File "C:/Users/Desktop/PySSL2.py", line 17, in <module>
    wrappedSocket.send(packet)
  File "D:\Python34\lib\ssl.py", line 679, in send
    v = self._sslobj.write(data)
TypeError: 'str' does not support the buffer interface
>>> 

【问题讨论】:

    标签: python ssl https


    【解决方案1】:

    wrappedSocket = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_TLSv1, ciphers="ADH-AES256-SHA")

    您正在尝试使用 ADH,即具有匿名身份验证的密码。这是一种不使用证书进行身份验证的密码,因此通常仅由配置错误的服务器支持。

    只需在函数调用中省略设置 ssl_version 和密码即可。在这种情况下,它将为服务器提供它可以提供的最佳协议版本和一些密码,并且服务器将从这些提供中挑选它支持的内容。

    这应该使 SSL 握手成为可能。但是,由于看起来您并没有真正尝试在套接字上与 HTTP 通信,因此在建立连接后您可能会遇到更多问题。

    【讨论】:

    • 感谢您的回答。我更改了程序,请检查我的问题中的更新部分。
    • @User1-St:请自己多努力解决问题。借助搜索引擎找出TypeError: 'str' does not support the buffer interface 的含义以及如何解决它。你会发现很多热门歌曲。
    【解决方案2】:

    为什么不使用请求?

    import requests
    requests.get('https://www.google.com', port=443)
    

    这样你将被绑定到 HTTP

    【讨论】:

    • 实际上我想提取使用公钥并设置通信协议。我可以用requests 做吗?
    【解决方案3】:

    由于您似乎正在尝试发出简单的 http 请求,因此您可以改用 requests 库,它会为您处理很多事情。

    如果没有:pip install requests

    import requests
    
    resp = requests.get("http://www.google.com")
    print resp.text
    

    【讨论】:

    • 当我回答@adif 时,我想提取公钥并设置通信协议。我可以用请求来做吗?
    • 这个问题被标记为 [https] 是有原因的(并且在标题中提到了 HTTPS)。提示:这不是因为他想发出简单的 HTTP 请求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 2021-05-04
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多