我正在使用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
返回。
我没有找到太多关于此的文档,所以我不确定这是我应该做的。谁能指出我做错了什么?
答案 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
};
扩展名。