2011-03-05 11 views
2

クライアントサーバーアプリケーションを作成しようとしていますが、クライアントはC++とQTで書かれていて、サーバーはjavaで作成されていますが、ssl暗号化の作業に苦労しています。
ハンドシェイクレベルでプロセスが失敗すると思います。私がなぜそれが動作していないのか把握しようとするのが苦労しているのは、プロセスが失敗しても、クライアントまたはサーバーのいずれにもエラーが報告されていないからです。QSslSocket問題

this->_uCertificate.fromPath(_DC::DEFAULT_CERT_MAIN_PATH + _DC::DEFAULT_MAIN_CERT_FILE); 
    this->_socket->addCaCertificate(this->_uCertificate); 

    //begin connection 
    this->_socket->connectToHostEncrypted(this->_uServerAdress, this->_uServerPort); 

    //wait until connection has completed 
    if(!this->_socket->waitForConnected(_CM::TIMEOUT)) 
    { 
     this->_lastError = this->_socket->errorString(); 
     return false; 
    } 

    //wait for handshake 
    if (!this->_socket->waitForEncrypted(_CM::TIMEOUT)) { 
     this->_lastError = this->_socket->errorString(); //the error is "No Error" 
     //return false; 
    } 

"waitForEncrypted"を呼び出すと失敗します。クライアント側では、休止状態を使用します。この関数はfalseを返すので、プロセスは失敗しましたが、エラー文字列は "No Error"です。ソケットからのエラー信号を処理するためのスロットも追加しましたが、決して呼び出されません。サーバー側では、私は以下を使用します:

SSLSocket _sock = (SSLSocket) this._ssocket.accept(); 
_sock.startHandshake(); 
........................................ 
if(this._inputBuffered.read(this._messageBuffer) < 0) 
       throw new Exception("Error while reading from client"); 

この場合も、例外はスローされませんが、readコマンドでは失敗します。しかし、サーバー側では、接続/ハンドシェイクが失敗した場合に例外がスローされるかどうかはわかりません。何らかの理由で手動でエラーをチェックする必要があります。
一般的な名前がホストと一致しないというエラーが表示されたときに、クライアントで問題が発生していました。少なくとも接続が多少なりとも分かっています。正しい共通名を含むように証明書を修正した後は、これに既存のエラーはありません。なぜ誰かがこの方法で失敗するか、少なくともより良いデバッグ方法を考えているのでしょうか?

私はopenSSLを使用して接続しようとしましたが、動作します。ハンドシェイクは成功し、サーバーからパケットを送受信できます。だから問題はクライアントにあるようです。

+0

あなたはこのような不可解なネットワークの問題をデバッグするWiresharkのを使用する必要があります。私は接続が単にタイムアウトしていると思っています。ウェブブラウザやopenssl s_clientコマンドのような他のツールを使ってサーバとSSL接続できますか? –

+0

私の場合、QSslSocketはQAbstractSocket :: error()シグナルを発しています。 – ironic

答えて

1

ファイルから証明書をロードする方法に問題があるようでした。メソッド "fromPath"は実際には証明書をファイルからロードせず、証明書のリストを返します。このリストをソケットに追加すると、それは正常に動作します。私はちょっと良心に苦しんで、私が文書を正しく読まなかった。

編集に失敗しましたが、シグナルがスローされなかった理由は、ソケットに有効な証明書がないためです。この - > _ uCertificate.fromPath(..)を呼び出すと、メソッドはそのパスで見つかった証明書のリストを返していましたが、オブジェクト自体は変更されませんでした。それでも、無効な空の証明書が残りました。そこで私のソケットに空の証明書を追加したとき、ハンドシェイクに達した唯一の証明書は、操作のための有効な証明書がありませんでした。この時点では失敗しますが、エラーはスローされません。

しかし、.fromPath()メタンによって返されたオブジェクトがソケットに追加されると、ハンドシェイクは有効な空のカートンと非空のカートンを持っているので、通常通り続きます。

+1

あなたが良心を持っているなら、あなたはこのサイトの珍しい質問者です。 –

+0

sslErrors信号がまだ発せられていないという問題が残っています。これのためのテストケースを書くことができますか? –

1

空の証明書データベースがあるときにエラーを与えることができないの問題は今QtのバグですQTBUG-17550