限制新创建的自签名证书的预期用途

时间:2014-03-06 16:17:25

标签: windows certificate cryptoapi

我正在使用CertCreateSelfSignCertificate创建自签名证书。这有效,我可以用它加密/签名/解密/验证数据。

我想限制证书的预期用途,但我总是得到一个“< All>”的证书预期用途已启用。这是我用来为pExtensions调用准备CertCreateSelfSignCertificate参数的代码:

BYTE key_usage_value = CERT_DATA_ENCIPHERMENT_KEY_USAGE | 
    CERT_DIGITAL_SIGNATURE_KEY_USAGE;
CERT_KEY_USAGE_RESTRICTION_INFO key_usage = {
    0, NULL,
    { sizeof(key_usage_value), &key_usage_value }
};

auto key_usage_data = EncodeObject(szOID_KEY_USAGE_RESTRICTION, &key_usage);

CERT_EXTENSION extension[] = {
    { szOID_KEY_USAGE_RESTRICTION, TRUE, { 
        key_usage_data.size(), key_usage_data.data() 
    } }
};

CERT_EXTENSIONS extensions = {
    elemsof(extension),
    extension
};

EncodeObject只需调用CryptEncodeObject并将结果作为std::vector返回。

我没有找到太多关于此的文档,所以我不确定这是我应该做的。谁能指出我做错了什么?

2 个答案:

答案 0 :(得分:2)

我猜你的证书的扩展密钥用法是空的,这意味着允许所有目的,如果你想限制它们,你需要定义它们,包括每个的特定OID,例如,A证书仅适用于:

Smartcardlogon,数字签名和不可否认

扩展密钥用法字段填充

1.3.6.1.4.1.311.20.2.2
2.5.29.37.3
2.5.29.37

希望有所帮助

答案 1 :(得分:0)

根据srbob的回答查看szOID_ENHANCED_KEY_USAGE后,我设法更改了密钥使用字段。

以下是用于在证书上创建扩展程序的(简化)代码,同样,这是我用来为{{1}准备pExtensions参数的代码调用:

CertCreateSelfSignCertificate

请注意,上面的代码仍会添加BYTE key_usage_value = CERT_DATA_ENCIPHERMENT_KEY_USAGE | CERT_DIGITAL_SIGNATURE_KEY_USAGE; CERT_KEY_USAGE_RESTRICTION_INFO key_usage = { 0, NULL, { sizeof(key_usage_value), &key_usage_value } }; auto key_usage_data = EncodeObject(szOID_KEY_USAGE_RESTRICTION, &key_usage); LPSTR enh_usage_value[] = { szOID_KP_DOCUMENT_SIGNING }; CERT_ENHKEY_USAGE enh_usage = { elemsof(enh_usage_value), enh_usage_value }; auto enh_usage_data = EncodeObject(szOID_ENHANCED_KEY_USAGE, &enh_usage); CERT_EXTENSION extension[] = { { szOID_KEY_USAGE_RESTRICTION, TRUE, { key_usage_data.size(), key_usage_data.data() } }, { szOID_ENHANCED_KEY_USAGE, TRUE, { enh_usage_data.size(), enh_usage_data.data() } }, }; CERT_EXTENSIONS extensions = { elemsof(extension), extension }; 扩展名。