2011-09-21 8 views
2

로컬 인증서 (.crt 파일)가 필요한 서버와 데이터를 교환해야합니다. 나는이 시도 :ssl 로컬 인증서가있는 QNetworkRequest

이 코드는 내가 Wireshark는에 다음과 같은 메시지가 실행
loginRequest = QNetworkRequest(QUrl("https://somesite.com/login")); 

QSslConfiguration sslConf = loginRequest.sslConfiguration(); 
QList<QSslCertificate> certs = QSslCertificate::fromPath(Preferences::certificatePath()); 
qDebug() << certs.first().issuerInfo(QSslCertificate::Organization); // prints name 
sslConf.setLocalCertificate(certs.first()); 
qDebug() << "is valid " << sslConf.localCertificate().isValid(); // true 
qDebug() << "is null " << sslConf.localCertificate().isNull(); // false 
qDebug() << "protocol " << sslConf.protocol(); // 0 
sslConf.setProtocol(QSsl::SslV3); // i also tried Qssl::AnyProtocol 
qDebug() << "protocol " << sslConf.protocol(); // 0 

// if i uncomment these i expect everithing to work 
//QSslConfiguration::setDefaultConfiguration(sslConf); 
//QSslSocket::addDefaultCaCertificate(certs.first()); 
//loginRequest.setSslConfiguration(sslConf); 

QObject::connect(connectionManager, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), this, SLOT(printSslErrors2(QNetworkReply*,QList<QSslError>))); 

m_reply = connectionManager->get(loginRequest); 
QObject::connect(m_reply, SIGNAL(readyRead()), this, SLOT(getCookie())); 
QObject::connect(m_reply, SIGNAL(sslErrors(QList<QSslError>)), this, SLOT(printSslErrors(QList<QSslError>))); 

(필터 : TCP & & SSL & & ip.addr == my_addr가) :이 예상되는

Client Hello 
ServerHello, Certificate 
Server Key Exchange, Certificate request, Server Hello Done 
Alert (level: Warning, Description: no certificate), client key exchange, change cipher spec, encrypted handshake message 
Alert (level: Fatal, Description: Handshake failure) 

- 인증서를 적용하는 코드는 주석 처리되었지만 이상한 점은 - QNetworkAccessManager 및 QNetworkReply (슬롯 printSslErrors 및 printSslErrors2)에서 ssl 오류가 발생하지 않습니다.

나는이 3 개 라인의 주석을 제거하는 경우 :

//QSslConfiguration::setDefaultConfiguration(sslConf); 
//QSslSocket::addDefaultCaCertificate(certs.first()); 
//loginRequest.setSslConfiguration(sslConf); 

내가 와이어 샤크의 경우 Nothing (몇 SYN, ACK 및 FIN TCP 메시지,하지만 http 또는 SSL 트래픽)을 얻을 수 없습니다. 또한 QNetworkAccessManager 및 QNetworkReply에는 오류가 없으므로 idia가 잘못되었습니다.

Qt가 내 로컬 인증서를 수락 할 수있는 기회가 있습니까? 아니면 나를 도와 줄 3D 파티 Qt 지향적 인 lib가있을 수 있습니까?

피씨 : btw-ssl 및 https는 며칠 전 클라이언트 측 인증서가 필요하도록 서버가 변경되기 전에 정상적으로 작동했습니다.

P.P.S : 인증서에는 차이가있을 경우 자체 서명됩니다. 또한 시스템에 p12 파일을 '설치'하려고했는데 Chrome과 IE7 모두이를 사용하고 서버와 통신 할 수 있습니다.

답변

0

솔루션, I 부 : 내가 대부분이 (연결의 부족) 해결, 둘 이유가 있었다 여기] [1]), 개인 키 추가 방법 :

QFile x(Preferences::certificateKeyPath()); 
x.open(QIODevice::ReadOnly); 
pKey = QSslKey(x.readAll(),QSsl::Rsa); 
QSslError error1(QSslError::SelfSignedCertificate, certs.first()); 
QSslError error2(QSslError::CertificateUntrusted, certs.first()); 
QList<QSslError> expectedSslErrors; 
expectedSslErrors.append(error1); 
expectedSslErrors.append(error2); 

2d - 내가 갖고있는 인증서는별로 좋지 않았습니다. 나는 그것이 실제로 무엇을 의미하는지 또는 그것이 작동하지 않는 이유를 모른다. 그러나 나는 서버 관리자로부터 새로운 인증서를 받았고 개인 키를 추가 할 때 핸드 셰이크가 성공했다. 마지막 해결

: 나는 아직도 (자신의 인증서가 작동하지 않는 사용자를 보여 예를 들어) sslErrors를 잡는 방법을 잘 모릅니다하지만

솔루션, 파트 II 좋은 시작이다

질문의 일부 (kina a woraround).QNetworkReply가 SslErrors를 방출하지 않는 것 같습니다 (또는 적어도 모든 시간 또는 모든 웹 사이트에서 작동하지 않습니다), [Qt 버그 추적기에서] 발견했습니다 [2]. 그리고 거기에서의 해결 방법 : SslErrors를 얻을 수없는 죄는, 다른 시도를해야합니다 - [오류] [3]. 실제로 일어났던 것에 대한 자세한 정보는 제공하지 않지만 아무것도 제공하지 않습니다. 나를 위해 오류 코드 6 - "SSL/TLS 핸드 셰이크가 실패하고 암호화 된 채널을 설정할 수 없습니다 .slErrors() 신호가 방출되었습니다." 완벽한 (난 아무것도에 대한 치료를 해달라고) :

QObject::connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(handleSslErrors(QNetworkReply::NetworkError))); 

중요한 부분 : 사용자가 잘못된 인증서 및/또는 키가있는 경우 - 신호가 emited된다. 그러나 인증서와 키가 맞으면 역시 출력됩니다. 인증이 아직 완전하지는 않은 것 같지만 쉽게 종료 할 수 있습니다.

QObject :: connect (m_reply, SIGNAL (sslErrors (QList)), this, SLOT (printSslErrors (QList)));

결론는 그들이 Qt는 4.8에서 SSL 버그를 많이 해결 한 것 같다, 이렇게 빨리

이것은 QMainWindow, 그것은 로그인 버튼의 신호를 (얻을 수있다
1

어둠 속에서 완벽한 촬영을하고 Qt가 실제로 오류를보고하지만 신호를받지 못한다는 가정하에 진행됩니다. 당신이 this의 헤더에 Q_OBJECT 매크로를 포함했다

당신은 당신의 connectionManagerthis에 신호를 연결하는?

Qt가 신호/슬롯을 연결하는 문제를보고 할 수 있으므로 응용 프로그램을 실행할 때 출력을 검사하십시오. 아파치 서버는 실제로 어떤 알 수없는 이유에 대한 개인 키를 (필요, 그것을 발견 [-

가 1 :

+0

1.이 사람이 로그인이 시작 나는 릴리스 될 것입니다 희망 시퀀스) 그래서 나는 왜 다른 신호가 무시 될지 모르겠다. 2. 신호/슬롯에는 오류가 없다. Tbh 내가 아는 유일한 오류 (응용 프로그램 출력 창에서보고되는) 신호 및 슬롯에 대한 것입니다 또는 존재하지 않거나 잘못된 매개 변수가 – DarkWalker

+0

QMainWindow 클래스로 다른 신호를 얻는다면 좋습니다. Q_OBJECT 매크로를 확인하는 것은 내가 경험 문제 일 때 제일 먼저하는 일입니다. 실제 문제를 추적 할 수 있기를 바랍니다. – Matthew