我想发送一个包装在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加密协议,您可以在下图中看到结果:
但我不知道如何以及在哪里必须在程序中设置此参数。
更新
请注意,我想在通信中提取使用过的公钥。所以请建议我一种方法,它可以提取公钥。我还想设置或查看使用过的通信和加密协议。
UPDATE2:
虽然我想手动设置cipher
和ssl_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
>>>
答案 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