gpt4 book ai didi

windows - 将 Windows PRIVATEKEYBLOB 转换为 Qt 的 QSslKey

转载 作者:可可西里 更新时间:2023-11-01 10:26:53 31 4
gpt4 key购买 nike

我正在开发一个使用 SSL 加密的 Qt 应用程序(Windows 服务)。

我需要从 Windows 证书存储访问证书和关联的私钥,并使用分别接受 QSslCertificate 和 QSslKey 的 setLocalCertificate 和 setPrivateKey 将其传递到我的 QSslSocket。

我能够从商店获取证书并使用 Windows API'(CertOpenStore、CertFindCertificateInStore)将其设置为 QsslSocket。现在我有了证书,我需要提取它的私钥并设置为 ssl 套接字。我以相同的顺序使用 CryptAcquireCertificatePrivateKey、CryptGetUserKey 和 CryptExportKey Windows API,这为我提供了 Microsoft PRIVATEKEYBLOB,现在我需要将其转换为 QSslKey 可以理解的格式。

我该怎么做?

最佳答案

解决了!!想到在这里分享解决方案,这可能对某人有帮助。

// Open the certificate store to be searched.
HCERTSTORE hSystemStore = CertOpenStore((LPCSTR)(CERT_STORE_PROV_SYSTEM), 0, NULL,
CERT_SYSTEM_STORE_LOCAL_MACHINE, L"MY");

CRYPT_DATA_BLOB dataBlob = {0};
QString password("password"); // your password for the cretificate and private key goes here

if(PFXExportCertStoreEx(hSystemStore, &dataBlob, password.toStdWString().c_str(), NULL,
EXPORT_PRIVATE_KEYS | REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY | REPORT_NO_PRIVATE_KEY))
{
if (dataBlob.cbData > 0)
{
dataBlob.pbData = (BYTE*)malloc(dataBlob.cbData);
if (PFXExportCertStoreEx(hSystemStore, &dataBlob, password.toStdWString().c_str(), NULL,
EXPORT_PRIVATE_KEYS | REPORT_NOT_ABLE_TO_EXPORT_PRIVATE_KEY | REPORT_NO_PRIVATE_KEY))
{
EVP_PKEY *pkey;
X509 *cert;
STACK_OF(X509) *ca = NULL;
PKCS12 *p12;
int i;
CRYPTO_malloc_init();
OpenSSL_add_all_algorithms();
SSLeay_add_all_algorithms();
ERR_load_crypto_strings();

BIO* input = BIO_new_mem_buf((void*)dataBlob.pbData, dataBlob.cbData);
p12 = d2i_PKCS12_bio(input, NULL);

PKCS12_parse(p12, password.toStdString().c_str(), &pkey, &cert, &ca);
PKCS12_free(p12);

if (cert)
{
BIO *boCert = BIO_new( BIO_s_mem() );

PEM_write_bio_X509(boCert, cert);
if (ca && sk_X509_num(ca))
{
for (i = 0; i < sk_X509_num(ca); i++)
{
PEM_write_bio_X509(boCert, sk_X509_value(ca, i));
}
}
char *certStr;
long len = BIO_get_mem_data(boCert, &certStr);

QSslCertificate localCertificate(QByteArray::fromRawData(certStr, len));
mySslSocket->setLocalCertificate(localCertificate);

BIO_free_all(boCert);
}

if (pkey)
{
BIO *bo = BIO_new( BIO_s_mem() );
PEM_write_bio_PrivateKey(bo, pkey, NULL, (unsigned char*)(password.toStdString().c_str()), password.length(), NULL, (char*)(password.toStdString().c_str()));

char *p;
long len = BIO_get_mem_data(bo, &p);

QSslKey key(QByteArray::fromRawData(p, len), QSsl::Rsa);
mySslSocket->setPrivateKey(key);
BIO_free_all(bo);
}
free(dataBlob.pbData);
}
}
}

if(hSystemStore)
CertCloseStore(hSystemStore, 0);

关于windows - 将 Windows PRIVATEKEYBLOB 转换为 Qt 的 QSslKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13885932/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com