2016-12-06 15 views
0

自己署名証明書でSSLを使用する簡単なサーバーがあります。Python SSLソケットエラー:ssl.SSLWantReadError:操作が完了しませんでした(読み取り)

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にブロッキングを設定しない場合、それだけでは以下となります。私は、接続を作成し、関連するエラーで次のスクリプトを介してデータを返すためにはPython 3.4.2 SSLソケットライブラリを使用しようとしていますハング。私はそれが返されたデータのサイズと関係があることを知るために十分な調査をしましたが、私はssl_socket.send()と呼んで4バイトの戻り値を得ています。出力で

#!/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 server\n"; 

# data to send to a server 
my $req = 'data'; 
print $socket "$req\n"; 
my @r = (<$socket>) ; 
print "@r"; 

$socket->close(); 

::私は、コンテキストのために、以下のように正常に動作するperlのクライアントを持って

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

私を取得するために、PythonのSSLライブラリを使用する適切な方法は何ですか要求されたデータ?

答えて

0

回答:データ文字列の末尾に'\n'文字が必要です。

関連する問題