0

https を介して Web サーバーと通信する Qt ベースのアプリケーションを構築しています。セットアップでは、ローカル証明書と秘密鍵を使用したクライアント認証を許可する必要があります。アプリケーションは、ユーザーの操作なしで実行する必要があります。

ここで、秘密鍵ファイルがパスフレーズで保護されている場合に問題が発生します
。OpenSSL はパスワードの入力を求め、アプリケーション全体をブロックします!

openSSL API では、パスフレーズを取得するためのコールバックを渡すことができますが、Qt ラッパーからはアクセスできません。openSSL がパスワードを要求しないようにする別の方法はありますか? それとも、これを何らかの方法で中断できますか?

4

3 に答える 3

0

私は解決策を思いつきました:

OpenSSL は、デコード関数で何も指定されていない場合にのみ、パスワードの入力を求めます。Richard Moore が回答で指摘したようにQSslKey、パスフレーズを渡すことができるコンストラクターがあります。

ここで空でない文字列が渡される限り、OpenSSL はパスワードの入力を求めません。プラス: キーが保護されていない場合、パスワードは無視されます。したがって、空でない文字列が渡されることを確認するだけなので、これが私の解決策です。

// Never use empty PWD, as this blocks. (Use null-string)
// PLUS: setting a password for a non-protected key still correctly loads the key!
QByteArray thePwd = pwd.isEmpty() ? QByteArray("\0", 1) : pwd.toUtf8();

// Try all encodings
QList<QSslKey> keys = QList<QSslKey>()
    << QSslKey( theKey, QSsl::Rsa, QSsl::Pem, QSsl::PrivateKey, thePwd )
    << QSslKey( theKey, QSsl::Rsa, QSsl::Der, QSsl::PrivateKey, thePwd )
    << QSslKey( theKey, QSsl::Dsa, QSsl::Pem, QSsl::PrivateKey, thePwd )
    << QSslKey( theKey, QSsl::Dsa, QSsl::Der, QSsl::PrivateKey, thePwd );

// Find a valid encoding
foreach ( QSslKey k, keys ) {
    if ( !k.isNull() ) {
        ret = k;
        break;
    }
}
于 2013-09-30T09:35:25.907 に答える
0

QSslKey を作成するときにパスワードを指定できます。コンストラクターは、キーの復号化に使用されるパスフレーズを受け取ります。以下のリンクのドキュメントを参照してください。

http://qt-project.org/doc/qt-4.8/qsslkey.html#QSslKey-2

于 2013-09-28T09:54:38.167 に答える