【发布时间】: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:
虽然我想手动设置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
>>>
【问题讨论】: