C++ 将windows应用商店中的私钥转换为PEM(用于OpenSSL)

C++ 将windows应用商店中的私钥转换为PEM(用于OpenSSL),c++,security,openssl,cryptoapi,C++,Security,Openssl,Cryptoapi,我想从windows应用商店获取私钥,并将其转换为PEM,以便在OpenSSL中使用它。 几个小时以来我一直在寻找一种方法来做到这一点 我使用CertFindCertificateInStore()获取CERT_上下文(我知道它包含使用搜索参数的私钥) 接下来,我使用CryptAcquireCertificatePrivateKey()获取HCRYPTPROV(只是因为函数名) 现在,我使用CryptGetUserKey()获取HCRYPTKEY(只是因为它听起来正确…?!) 但现在我又被卡

我想从windows应用商店获取私钥,并将其转换为PEM,以便在OpenSSL中使用它。 几个小时以来我一直在寻找一种方法来做到这一点

  • 我使用CertFindCertificateInStore()获取CERT_上下文(我知道它包含使用搜索参数的私钥)
  • 接下来,我使用CryptAcquireCertificatePrivateKey()获取HCRYPTPROV(只是因为函数名)
  • 现在,我使用CryptGetUserKey()获取HCRYPTKEY(只是因为它听起来正确…?!)
但现在我又被卡住了


我认为这是微软为了确保我们永远无法获得私钥而采取的隐蔽性安全措施。

前两种都可以。但是你需要使用。它将以PKCS#8 DER编码形式将私钥导出到缓冲区。从PKCS#8中,您可以将其放入OpenSSL的X509结构中(使用d2i函数和内存缓冲区作为BIO结构中的输入)

但是,如果私钥被标记为不可导出,则此功能将失败


您唯一能做的就是使用此类私钥对数据进行签名。

我保留原样(毕竟如果没有dbasic,我会被卡住:-),但我还有更多要补充的内容:

CryptExportPKCS8()的支持结束于XP/2003,因此我们必须使用PFXExportCertStoreEx(),但是此函数将导出整个存储。因此,为了只导出一个证书,您需要使用内存存储

查看此示例,了解如何做到这一点:


将所需证书插入内存存储,然后使用PFXExportCertStoreEx()导出所需的证书。

谢谢。请注意,该函数的支持结束于XP和server2003。应改用PFXExportCertStoreEx()。@doptimuprime u提到“如果私钥被标记为不可导出,则此函数将失败。”这是真的。但现在,即使在“它被标记为不可导出”的情况下,也可以在openssl中使用私钥了吗?我的意思是,有没有一种方法可以让我们将密钥的句柄传递给openssl api,它将自动从windows证书存储中读取密钥,而不从windows存储中实际导出密钥字节?我之所以要求这样做,是因为将密钥标记为可导出允许任何人将密钥字节从存储(更安全的位置)导出到磁盘(不安全的位置)。我希望这能让你的眼睛感觉良好。您可以重载RSA_方法结构来定义签名函数和数据,并可以在RSA结构中使用它。此函数将存储区中的证书作为blob导出。有没有办法从blob或证书上下文中提取私钥?