2013-09-27 4 views
0

Je crée une application basée sur Qt qui communiquera via https avec un serveur Web. L'installation doit permettre l'authentification du client avec un certificat local et une clé privée. L'application doit exécuter sans intervention de l'utilisateur.Empêcher l'invite pour la phrase secrète PEM

Maintenant, j'ai un problème lorsque le fichier clé privée est protégée par un mot de passe:
OpenSSL vous demandera un mot de passe, bloquer l'application entière!

L'API openSSL permet de passer un rappel pour obtenir la phrase secrète, mais celle-ci n'est pas accessible via le wrapper Qt. Existe-t-il un autre moyen d'empêcher openSSL de demander un mot de passe? Ou est-ce que cela peut être interrompu?

Répondre

0

je suis venu avec une solution:

OpenSSL

ne vous demandera un mot de passe, quand aucun n'est spécifié dans la fonction de décodage. Comme Richard Moore l'a souligné dans sa réponse, QSslKey a un constructeur où vous pouvez passer la phrase secrète.

Tant qu'une chaîne non vide est passée ici, OpenSSL ne demandera pas de mot de passe. Plus: Si la clé n'est pas protégée, le mot de passe est ignoré. Par conséquent, je vérifie simplement qu'une chaîne non-vide est passée, donc c'est ma solution:

// 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; 
    } 
} 
0

En regardant le online documentation, je ne vois aucune option de rappel lors du décryptage de la clé privée.

Le moyen le plus simple est de rendre la clé privée sans mot de passe. Voici comment vous pouvez le faire (en supposant que vous avez des clés RSA mot de passe protégé):

openssl rsa -in privateKey.pem -out newPrivateKey.pem

ici privateKey.pem est protégé par mot, mais newPrivateKey.pem est pas. Notez que bien que cela signifie que la clé privée n'est pas protégée, c'est une technique courante pour faire une communication SSL ininterrompue (même utilisée dans stunnel par exemple). L'hypothèse est que la clé privée est stockée dans un répertoire qui a des autorisations restreintes et est protégé par la stratégie d'accès au système d'exploitation.

Le plus difficile est d'écrire votre application en liant directement OpenSSL au lieu de passer par le wrapper. De cette façon, vous avez un contrôle précis sur les rappels de mot de passe.

+0

Oui, l'utilisation de PK non protégée résoudrait mon problème. Bien que cela soit courant pour les serveurs Web, mais mon application est du côté client et je ne peux pas imposer une exigence selon laquelle le fichier PK ne doit pas être protégé ... –

+0

Comment la solution que vous avez affichée fonctionnera-t-elle si la clé privée est effectivement protégé? Il supposera que le '' thePwd'' est le mot de passe et essaiera de décrypter la clé privée et échouera. – Karthik

+0

Il ne vous demandera pas la phrase secrète, de sorte que le processus ne sera pas bloqué. La clé ne peut pas être utilisée dans un tel cas, mais le processus peut réagir sur cette situation et continuer, même seulement pour fermer normalement.Sinon, un processus BG est toujours bloqué sur les E/S –

0

Vous pouvez spécifier le mot de passe lors de la construction de QSslKey. Le constructeur prend un mot de passe qui sera utilisé pour déchiffrer la clé, voir la documentation sur le lien ci-dessous:

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

+0

Je comprends que je peux passer le mot de passe dans le constructeur. Mais je suis confronté à des problèmes quand il n'y a pas de mot de passe configuré pour mon application, mais le fichier est protégé. Dans ce cas, il n'y a rien à passer, et l'application bloque –

Questions connexes