Python SSL套接字错误:SSL.SSLWANTREADERROR:操作未完成(读)



我有一个琐碎的服务器,该服务器通过自签名证书使用SSL。我正在尝试使用Python 3.4.2 SSL套接字库来创建连接并通过以下脚本返回数据,并带有关联的错误:

import socket, ssl
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ssl_socket = ssl.wrap_socket(s, keyfile="/path/to/server.pem", certfile="/path/to/client.pem", cert_reqs=ssl.CERT_REQUIRED, ssl_version=ssl.PROTOCOL_TLSv1_2, ca_certs="/path/to/client.pem")
ssl_socket.connect(('hostname', port))
ssl_socket.send("data_string".encode())
# returns '4' (number of returned bytes)
ssl_socket.setblocking(0) # turn off blocking
ssl_socket.recv(4096)
# error: ssl.SSLWantReadError: The operation did not complete (read) (_ssl.c:1960)

,如果我不将阻塞设置为0,它将悬挂。我已经做了足够的研究,以查看它与返回数据的大小有关,但是我的返回值为4个字节,我致电ssl_socket.send(),所以我不确定我缺少什么。p>请注意,我有一个perl客户端,该客户端正常工作如下:

#!/usr/bin/env perl
use IO::Socket::INET;
use IO::Socket::SSL;
# auto-flush on socket
$| = 1;
# create a connecting socket
my $socket = new IO::Socket::SSL (
    PeerHost => 'hostname',
    PeerPort => '12345',
    Proto => 'tcp',
    SSL_cert_file => $ENV{'HOME'} . '/path/to/client.pem',
    SSL_key_file => $ENV{'HOME'} . '/path/to/server.pem',
);
die "cannot connect to the server $!n" unless $socket;
print "connected to the servern";
# data to send to a server
my $req = 'data';
print $socket "$reqn";
my @r = ( <$socket> ) ;
print "@r";
$socket->close();

输出:

connected to the server
{
   "password": "passwd",
   "username": "username"
}

使用Python SSL库检索我请求的数据的正确方法是什么?

答案:在我的数据字符串末尾需要一个'n'字符。

最新更新