2016-12-06 4 views
0

자체 서명 된 인증서를 통해 SSL을 사용하는 사소한 서버가 있습니다. 내가 연결을 만들 및 관련 오류와 함께 다음과 같은 스크립트를 통해 데이터를 반환하는 파이썬 3.4.2 SSL 소켓 라이브러리를 사용하는 것을 시도하고있다 : I 0으로 차단을 설정하지 않으면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) 

을 그리고, 그냥 것 다루는 법. 나는 그것이 반환 된 데이터의 크기와 관련이 있다는 것을 알기에 충분한 연구를 해왔으나, 나는 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(); 

: 상황에 대해 다음과 같이 내가 제대로 작동 펄 클라이언트가

주 검색하기 위해 파이썬 SSL 라이브러리를 사용하는 올바른 방법은 무엇

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

내 요청 된 데이터?

답변

0

답변 : 데이터 문자열 끝에 '\n' 문자가 필요합니다.