クライアントサーバーアプリケーションを作成しようとしていますが、クライアントは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を使用して接続しようとしましたが、動作します。ハンドシェイクは成功し、サーバーからパケットを送受信できます。だから問題はクライアントにあるようです。
あなたはこのような不可解なネットワークの問題をデバッグするWiresharkのを使用する必要があります。私は接続が単にタイムアウトしていると思っています。ウェブブラウザやopenssl s_clientコマンドのような他のツールを使ってサーバとSSL接続できますか? –
私の場合、QSslSocketはQAbstractSocket :: error()シグナルを発しています。 – ironic