【问题标题】:Converting private key in windows store to PEM (for OpenSSL)将 Windows 存储中的私钥转换为 PEM(用于 OpenSSL)
【发布时间】:2013-05-27 15:04:23
【问题描述】:

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

  • 我使用 CertFindCertificateInStore() 来获取 CERT_CONTEXT(我知道它包含使用搜索参数的私钥)。
  • 接下来,我使用 CryptAcquireCertificatePrivateKey() 来获取 HCRYPTPROV(只是因为函数的名称)。
  • 现在,我使用 CryptGetUserKey() 来获取 HCRYPTKEY(只是因为它听起来不错......?!)

但现在我又卡住了。

我认为这是 Microsoft 为确保我们永远无法获得私钥所做的默默无闻的安全措施。

【问题讨论】:

    标签: c++ security openssl cryptoapi


    【解决方案1】:

    我将保持原样(毕竟没有 dbasic 我会被卡住:-)),但我还有更多要补充的:

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

    查看此示例以了解如何执行此操作: http://msdn.microsoft.com/en-us/library/windows/desktop/aa382037(v=vs.85).aspx

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

    【讨论】:

    • 此函数将存储中的证书导出为 blob。有没有办法从 blob 或证书上下文中提取私钥?
    【解决方案2】:

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

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

    你唯一能做的就是使用这样的私钥对数据进行签名。

    【讨论】:

    • 谢谢。注意该功能的支持结束是XP和server2003。应改为使用 PFXExportCertStoreEx()。
    • @doptimusprime 你提到“如果私钥被标记为不可导出,此功能将失败。”确实如此。但是现在即使“它被标记为不可导出”也可以在openssl中使用私钥,我的意思是我们可以将密钥的句柄传递给openssl api,它会自动从windows读取密钥证书存储而不实际从 Windows 存储导出密钥字节?我要求这样做的原因是因为将密钥标记为可导出允许任何人将密钥字节从存储(更安全的地方)导出到磁盘(不安全的地方)。我希望这是有道理的
    • 是的。您可以重载 RSA_METHOD 结构来定义签名函数和数据,并可以在 RSA 结构中使用它。
    猜你喜欢
    • 2016-04-07
    • 2012-06-15
    • 2012-01-07
    • 2013-06-22
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多