2014-08-31 2 views
1

Qt를 사용하여 ssl 프록시 서버를 작성하고 있습니다. 다음은 코드 샘플입니다.Qt 5.2.1로 작성된 SSL 서버에서 SSL 핸드 셰이크가 실패했습니다.

개인 키로 CA 자체 서명 인증서를 생성하고 CA 인증서로 서명 한 특정 도메인에 대해 다른 인증서를 생성했습니다. CA 인증서를 /usr/local/share/ca-certificates에 복사 한 후 sudo update-ca-certificates을 실행하십시오. 내 서버가 HTTPS 프록시로 사용 타사 응용 프로그램을 사용하여 프록시 서버에 연결하려고 할 때하지만 다음 출력 QAbstractSocket :: SslHandshakeFailedError 오류가 :

Listening port 8888 
incomingConnection 
onModeChanged(2) 
onError(13) 
"Error during SSL handshake: error:1407609B:SSL routines:SSL23_GET_CLIENT_HELLO:https proxy request" 
onStateChanged(0) 

그래서 심지어 onReadyRead 슬롯에 들어 가지 않는다 . openssl 명령을 사용하여 서버를 테스트하려고하면 : openssl s_client -connect 127.0.0.1:8888 -debug - 내 서버에 성공적으로 연결됩니다.

verify error:num=19:self signed certificate in certificate chain 
verify return:0 
No client certificate CA names sent 
--- 
SSL handshake has read 2667 bytes and written 439 bytes 
Verify return code: 19 (self signed certificate in certificate chain) 
--- 

하지만 내 onReadyRead 슬롯에 원시 값을 내 서버에 데이터를 전송하고 볼 수 있습니다 출력 다음 줄이 포함되어 있습니다.

내 ENV에 대한 몇 가지 정보 : OS : 우분투 12.04 x86_64의 Qt는 : 5.2.1 (GCC 4.6.1, 64 비트) 사전에

감사합니다,

답변

2

... when I try to connect to my proxy server using 3rd-party app, where my server used as https proxy

... When I try to test my server using openssl command: openssl s_client -connect 127.0.0.1:8888 -debug - it is successfully connected to my server.

이 다른 일이 있습니다 . openssl 명령을 사용하여 즉시 SSL로 업그레이드하는 TCP 연결을 설정합니다. 그러나 https 프록시는 다르게 작동합니다. 먼저 TCP 연결을 설정 한 다음 HTTP CONNECT 명령을 실행하고 프록시에서 성공적인 응답을 얻으면 SSL에 연결을 업그레이드합니다 (예 :

- client to server 
> CONNECT ip:port HTTP/1.0\r\n 
> \r\n 
- followed by server to client 
< HTTP/1.0 200 connection established\r\n 
< \r\n 
... SSL handshake ... 

그리고

가해야처럼 클라이언트가 HTTPS 프록시 요청을 전송하지만 당신은 (즉, 당신이의 ClientHello 메시지를 기대하는 것입니다)이 실패 SSL 핸드 셰이크의 즉각적인 시작을 기대하기 때문에 :

"Error during SSL handshake: error:1407609B:SSL routines:SSL23_GET_CLIENT_HELLO:https proxy request"

+1

매우 가치있는 대답! – c1tru55

관련 문제