Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中打开SSL套接字连接_Python_Sockets_Ssl - Fatal编程技术网

在Python中打开SSL套接字连接

在Python中打开SSL套接字连接,python,sockets,ssl,Python,Sockets,Ssl,我正在尝试用Python建立一个安全的套接字连接,但我对其中的SSL部分感到很难。我发现了一些关于如何与SSL建立连接的代码示例,但它们都涉及到关键文件。我尝试连接的服务器不需要接收任何密钥或证书。我的问题是如何用SSL包装python套接字连接。我知道一个事实,我假设使用的密码是ADH-AES256-SHA,协议是TLSv1。这就是我一直在尝试的: import socket import ssl # SET VARIABLES packet, reply = "<packet>

我正在尝试用Python建立一个安全的套接字连接,但我对其中的SSL部分感到很难。我发现了一些关于如何与SSL建立连接的代码示例,但它们都涉及到关键文件。我尝试连接的服务器不需要接收任何密钥或证书。我的问题是如何用SSL包装python套接字连接。我知道一个事实,我假设使用的密码是
ADH-AES256-SHA
,协议是
TLSv1
。这就是我一直在尝试的:

import socket
import ssl

# SET VARIABLES
packet, reply = "<packet>SOME_DATA</packet>", ""
HOST, PORT = 'XX.XX.XX.XX', 4434

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

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

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

# CLOSE SOCKET CONNECTION
sock.close()
导入套接字
导入ssl
#设置变量
数据包,reply=“一些数据”
主机,端口='XX.XX.XX.XX',4434
#创建套接字
sock=socket.socket(socket.AF\u INET,socket.sock\u流)
sock.settimeout(10)
#包裹插座???
ssl.wrap_套接字(sock,ssl_version=“TLSv1”,ciphers=“ADH-AES256-SHA”)
#连接并打印回复
sock.connect((主机、端口))
发送(数据包)
打印袜子记录(1280)
#闭合插座连接
sock.close()

当我运行这段代码时,我没有得到任何错误,但得到一个空白响应。当试图在命令行中调试此代码时,通过在终端中键入
python
并逐行粘贴代码,我在运行
sock.send(packet)
时会得到一个状态代码。我得到的整数响应是
26
。如果有人知道这意味着什么,或者能够提供帮助,我们将不胜感激。提前谢谢

好吧,我知道怎么回事了。我有点傻。我的代码有两个问题。我的第一个错误是在指定
ssl\u版本时,我在
TLSv1
中输入了
ssl.PROTOCOL\u TLSv1
。第二个错误是我没有引用包装好的套接字,而是调用了我创建的原始套接字。下面的代码似乎适合我

import socket
import ssl

# SET VARIABLES
packet, reply = "<packet>SOME_DATA</packet>", ""
HOST, PORT = 'XX.XX.XX.XX', 4434

# 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()
导入套接字
导入ssl
#设置变量
数据包,reply=“一些数据”
主机,端口='XX.XX.XX.XX',4434
#创建套接字
sock=socket.socket(socket.AF\u INET,socket.sock\u流)
sock.settimeout(10)
#包套
wrappedSocket=ssl.wrap_套接字(sock,ssl_version=ssl.PROTOCOL_TLSv1,ciphers=“ADH-AES256-SHA”)
#连接并打印回复
wrappedSocket.connect((主机、端口))
wrappedSocket.发送(数据包)
打印wrappedSocket.recv(1280)
#闭合插座连接
wrappedSocket.close()

希望这能帮助别人

解决这些问题有很多乐趣,但对我来说,我发现python ssl的底层基础设施是openssl。尝试使用openssl验证您的证书,并在尝试让python使用相同的堆栈之前进行验证

在验证叶证书之前,我需要将根证书导入openssl

这很有帮助。

另一件有趣的事情是,同一版本python在不同主机上的两个不同版本有不同的方法。一个有
ssl.get\u default\u verify\u path()
,另一个根本没有。这里的教训是python ssl是基于openssl构建的。不同的底层库为您提供了不同的python


Python SSL是基于openssl构建的,因此首先在openssl中解决证书问题。

您不应该设置
协议\u TLSv1
(或
TLSv1
)。这将限制仅连接到
TLS
v1.0。相反,您需要支持库支持的所有版本的
PROTOCOL\u TLS
(或弃用的
PROTOCOL\u SSLv23


您使用的是匿名密码,因为出于某种原因,您认为不需要证书或密钥。这意味着没有服务器的认证,并且你很容易受到中间人攻击。除非您真的知道自己在做什么,否则我建议您不要使用匿名密码(如
ADH-AES256-SHA
)。

我正在寻找一个工作良好的ssl套接字,该套接字使用https包启动连接。这对我帮助很大,但有点过时,所以这里是python3的代码:

导入套接字
导入ssl
package=“GET/ws/LiveWebcastUpdate/22000557 HTTP/1.1\r\n主机:
www.website_name.com\r\n用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64;
rv:80.0)Gecko/20100101 Firefox/80.0\r\n概念:*/*\r\n概念语言:nl,en-
美国;q=0.7,欧洲;q=0.3\r\nSec WebSocket版本:13\r\n原文:
https://www.website_name.com\r\nSec WebSocket键:
NU/EsJMICjSociJ751l0Xw==\r\n连接:保持活动状态,升级\r\n标签:否-
缓存\r\n缓存控件:无缓存\r\n升级:websocket\r\n\r\n“
主机名='www.website_name.com'
端口=443
context=ssl.create\u default\u context()
使用socket.create_连接((主机名,端口))作为sock:
使用context.wrap_socket(sock,server_hostname=hostname)作为ssock:
打印(ssock.version())
ssock.send(package.encode())
尽管如此:
数据=ssock.recv(2048)
如果(len(数据)<1):
打破
打印(数据)
这是尽可能简单,如需更多信息,请访问

亲切问候,


Okido(Niek Tuytel)

我遇到了这个错误:
ssl.SSLError:[ssl:SSLV3警报握手失败]SSLV3警报握手失败
有什么想法吗?仅从输出很难判断。您是否使用了上面的代码段?如果没有,我会提出一个新问题,并发布您正在使用的代码:)[SSL:Error\u VERSION\u NUMBER]Error VERSION NUMBER(_SSL.c:590)。在GNU/Linux(ubuntu16.04)@Kostanos上,您可以尝试使用不同的密码。即用
AES256-SHA
替换
ADH-AES256-SHA
。如果不起作用,请尝试将
TLSv1.2
AES256-SHA256
一起使用。很可能服务器不支持密码或协议。您认为您可以提供如何实现证书或密钥的示例,而不只是说不使用匿名密码吗?