2014-03-06 68 views
0

我使用CertCreateSelfSignCertificate創建自簽名證書。這有效,我可以使用它加密/簽名/解密/驗證數據。限制新創建的自簽名證書的預期用途

我想限制證書的預期用途,但我總是以「<所有>」爲目的啓用的證書結束。這是我使用準備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

我還沒有找到太多的文件,所以我不確定這是我應該做的。任何人都可以指出我做錯了什麼?

回答

1

我猜你的證書的擴展密鑰用法是beeing build empty,這意味着所有的目的都是允許的,如果你想限制這些,你需要定義它們,包括每個的具體OID,例如,能夠證書只測:

Smartcardlogon,數字簽名和不可抵賴性

將有擴展密鑰用法場充滿

1.3.6.1.4.1.311.20.2.2 
2.5.29.37.3 
2.5.29.37 

^h它可以幫助

+0

那麼這將是'szOID_ENHANCED_KEY_USAGE'?我記得我看過,但'szOID_KEY_USAGE_RESTRICTION'似乎更合適。我今晚會試試這個...... – Fozi

+0

它是如何在@Fozi – srbob

+0

是的,這個工作,但有更多的它。我會就我所做的事發表一個答案,但是你把我推向了正確的方向,所以我很樂意給你獎勵。 – Fozi

0

根據srbob的回答調查szOID_ENHANCED_KEY_USAGE後,我設法改變密鑰使用領域。

這裏是我使用創造證書上的擴展(簡化)代碼,再次,這是我使用準備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 
}; 

請注意,上面的代碼仍然會添加szOID_KEY_USAGE_RESTRICTION擴展名。