如何在python中发送HTTPS数据包?

时间:2015-07-22 06:54:43

标签: python ssl https

我想发送一个包装在Python中的HTTPS。例如,我想向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
>>> 

我该怎么做才能处理它?<​​/ p>

更新

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

enter image description here

但我不知道如何以及在哪里必须在程序中设置此参数。

更新

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

UPDATE2:

虽然我想手动设置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
>>> 

3 个答案:

答案 0 :(得分:1)

  

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

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

从函数调用中省略设置ssl_version和ciphers。在这种情况下,它将为服务器提供最佳的协议版本,并且许多密码和服务器将从这些提供的产品中选择它所支持的内容。

然后应该使SSL握手成为可能。但是,由于看起来你真的不想在套接字上讨论HTTP,所以在建立连接后你可能会遇到更多问题。

答案 1 :(得分:0)

为什么不使用请求?

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

这样你就会被绑定到HTTP

答案 2 :(得分:0)

由于看起来您正在尝试制作简单的http请求,因此您可以使用requests库,它可以为您处理很多内容。

如果您没有:pip install requests

import requests

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