CSP 如何找到证书的私钥进行加密操作?

Thinh Nguyen Van

我的问题是:当应用程序调用 CSP 执行加密操作时,例如签名,CSP 如何分别找到证书的私钥?
如果导入到 cert 的证书存储私钥不在本地计算机中(在 USB 令牌、外部存储设备上,例如移动设备上),它可以找到吗?

再试一次

当您将证书导入系统存储时,Windows 会创建一个 BLOB 结构,其中包含编码证书本身及其属性。BLOB 具有以下结构:

property1_id (4 bytes)
reserved = 0x00000001
property1_length (4 bytes)
property1_data[property1_length]
...
cert_property_id = 0x00000020
reserved = 0x00000001
cert_data_length (4 bytes)
cert_data[cert_data_length]

因此,如果您希望导入的证书链接到私钥,则需要设置 CERT_KEY_PROV_INFO_PROP_ID。您可以使用CRYPT_KEY_PROV_INFO结构和CertSetCertificateContextProperty函数来实现

例如:

#include <Windows.h>
#include <wincrypt.h>

void SetKeyLink()
{
    HCERTSTORE hStore = NULL;
    CRYPT_KEY_PROV_INFO key_prov_info = { 0 };
    PCCERT_CONTEXT pCertContext = nullptr;
    std::vector<BYTE> der_encoded_cert;

    hStore = CertOpenSystemStore(NULL, L"MY");
    if (!hStore)
    {
        goto Exit;
    }

    der_encoded_cert = LoadFromFile();

    pCertContext = CertCreateCertificateContext(X509_ASN_ENCODING, der_encoded_cert.data(), der_encoded_cert.size());
    if (!pCertContext)
    {
        goto Exit;
    }

    /* For legacy CSP */
    key_prov_info.dwProvType = PROV_RSA_AES; // Or YOUR_PROVIDER_TYPE
    key_prov_info.dwKeySpec = AT_SIGNATURE; // Or AT_KEYEXCHANGE
    key_prov_info.pwszContainerName = L"Your_key_name";
    key_prov_info.dwFlags = CERT_SET_KEY_PROV_HANDLE_PROP_ID;
    key_prov_info.cProvParam = 0;
    key_prov_info.pwszProvName = nullptr;
    key_prov_info.rgProvParam = 0;

    /*
    Or if you use CNG Key storage provider:

    // Or L"Your_CNG_key_storage_provider_name"
    key_prov_info.pwszProvName = L"Microsoft Software Key Storage Provider"; 
    key_prov_info.pwszContainerName = L"Your_key_name";
    key_prov_info.dwFlags = CERT_SET_KEY_PROV_HANDLE_PROP_ID;
    key_prov_info.dwProvType = 0;
    key_prov_info.dwKeySpec = 0;
    key_prov_info.cProvParam = 0;
    key_prov_info.rgProvParam = 0;
    */

    if (!CertSetCertificateContextProperty(pCertContext, CERT_KEY_PROV_INFO_PROP_ID, 0, &key_prov_info))
    {
        goto Exit;
    }

    if (!CertAddCertificateContextToStore(hStore, pCertContext, CERT_STORE_ADD_ALWAYS, NULL))
    {
        goto Exit;
    }

    std::cout << "success";

Exit:

    if (pCertContext)
    {
        CertFreeCertificateContext(pCertContext);
    }

    if (hStore)
    {
        CertCloseStore(hStore, 0);
    }
    return;
}

现在你的证书看起来像这样(抱歉不是英文):

测试证书

当 Windows 想要获取私钥时,它会调用CryptAcquireCertificatePrivateKey,然后调用CertGetCertificateContextProperty(..., CERT_KEY_PROV_INFO_PROP_ID, ...).

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用双图转换将n元CSP转换为二进制CSP

来自分类Dev

Cordova WebView是否违反CSP

来自分类Dev

Facebook登录所需的CSP规则

来自分类Dev

Java Choco CSP使用变量总和进行优化

来自分类Dev

如何在express和bodyParser中将application / csp-report接受为json?

来自分类Dev

CSP拒绝API Twitter

来自分类Dev

如何找到私钥位置

来自分类Dev

CSP和内联脚本被阻止

来自分类Dev

如何在Chrome中禁用CSP保护?

来自分类Dev

如何设置CSP以允许用React的JSS编写的内联Material-UI样式?

来自分类Dev

如何找到导致CSP错误的脚本?

来自分类Dev

在网页中设置CSP后,如何允许上传XML,JSON和CSV文件

来自分类Dev

嵌入YouTube视频的CSP

来自分类Dev

如何在yii2中添加用于Smartsupp聊天的内容安全策略(CSP)?

来自分类Dev

散列违反CSP

来自分类Dev

CSP通过在Elastic Beanstalk中部署的Jhipster App进行起诉

来自分类Dev

如何为脚本和样式标签添加随机数,以避免“不安全的内联” CSP标头字段?

来自分类Dev

CSP框架祖先-如何阻止除一页以外的整个域?

来自分类Dev

Cordova WebView是否违反CSP

来自分类Dev

如何在Chrome打包的应用中允许此代码而又不违反CSP?

来自分类Dev

Apache Cordova:CSP错误

来自分类Dev

使用underscore.js时如何纠正浏览器CSP错误

来自分类Dev

如何在不使用cpconfig util的情况下在Linux系统上显示已安装的CSP?

来自分类Dev

如何在Choco(CSP)中定义产品

来自分类Dev

CSP拒绝API Twitter

来自分类Dev

如何在Windows中找到证书的私钥

来自分类Dev

如何将CSP限制为Chrome中的file:///网址?

来自分类Dev

CSP是否要求“严格使用”

来自分类Dev

Quantcast的CSP设置

Related 相关文章

热门标签

归档