防止提示输入 PEM 密码
Prevent prompting for PEM passphrase
我正在构建一个基于Qt的应用程序,它将通过https与Web服务器进行通信。安装程序应允许使用本地证书和私钥进行客户端身份验证。应用程序必须在没有任何用户交互的情况下运行。
现在,当私钥文件受密码保护时,我遇到了问题:
OpenSSL将提示输入密码,阻止整个应用程序!
openSSL API允许传递回调以获取密码,但这无法通过Qt包装器访问。有没有其他方法可以防止openSSL提示输入密码?或者这可以以某种方式中断吗?
在查看在线文档时,我在解密私钥时没有看到任何回调选项。
最简单的方法是使私钥无密码。以下是操作方法(假设您有受密码保护的 RSA 密钥):
openssl rsa -in privateKey.pem -out newPrivateKey.pem
在这里privateKey.pem
受密码保护newPrivateKey.pem
但不受密码保护。 请注意,虽然这意味着私钥不受保护,但这是进行不间断SSL通信的常用技术(例如,即使在stunnel
中使用)。假设私钥存储在具有受限权限的目录中,并受操作系统访问策略保护。
更难的方法是通过直接与OpenSSL链接而不是通过包装器来编写应用程序。这样,您就可以对密码回调进行细粒度控制。
您可以在构造 QSslKey 时指定密码。构造函数采用将用于解密密钥的密码短语,请参阅以下链接中的文档:
http://qt-project.org/doc/qt-4.8/qsslkey.html#QSslKey-2
我想出了一个解决方案:
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(" ", 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;
}
}
- 将TPM公钥序列化为DER或PEM
- c++中的oop(密码生成)
- 密码登录程序将永远循环并显示不正确的结果
- OpenSSL没有共享密码
- Cryptopp:获取密码输入的填充字符串
- 密码长度验证 (c++)
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 仿射密码解密,输出大小写不同
- 替换密码:哪一个?
- 无法使用 openssl 服务器,因为密码已过时...什么的...ERR_SSL_VERSION_OR_CIPHER_MISMATCH
- 如何使用 c++ 在 sqlite3 中打开受密码保护的数据库?
- 根据用户名和密码 Qt C++重新访问数据库值
- SSLeay 读取 PEM 文件
- C++密码问题
- 无法在 Cocos2dx 中使用受密码保护的 zip 文件
- 如何使用librdkafka设置明文协议(无SASL)的用户名和密码?
- 如何将凯撒密码的元素从字符串更改为字符串
- 使用密码将 RSA 私钥写入 PEM 文件
- 带有SSL的libWebsocks服务器不输入PEM密码短语
- 防止提示输入 PEM 密码