2014-03-06 8 views
0

CertCreateSelfSignCertificate을 사용하여 자체 서명 인증서를 만듭니다. 이것은 작동하며 암호화/서명/해독/확인이 가능합니다.새로 만든 자체 서명 인증서의 용도를 제한하십시오.

인증서의 용도를 제한하고 싶습니다만, "<All>"의 목적을 사용할 수있는 인증서로 항상 끝납니다.

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 같은 결과를 반환 :이 내가 CertCreateSelfSignCertificate 통화에 pExtensions 매개 변수를 준비하기 위해 사용하고 코드입니다.

나는 이것에 대한 많은 문서를 찾지 못했기 때문에 나는 이것이 내가해야 할 일이라는 것을 실제로 확신하지 못한다. 아무도 내가 잘못하고있는 것을 지적 할 수 있습니까?

답변

1

인증서의 확장 된 키 용도는 비어 있습니다. 모든 목적이 허용된다는 것을 의미합니다. 제한하려는 경우 각 인스턴스의 특정 OID를 포함하여 정의해야합니다. 예를 들어, 수있는 인증서는 대해서만 :

Smartcardlogon, 디지털 서명 부인 방지는

확장 키 사용 필드

1.3.6.1.4.1.311.20.2.2 
2.5.29.37.3 
2.5.29.37 

H 가득해야합니다 ope 도움이

+0

그래서'szOID_ENHANCED_KEY_USAGE'가 될까요? 나는 그것을 보았지만'szOID_KEY_USAGE_RESTRICTION'이 더 적절하다고 생각했던 것을 기억합니다. 오늘 밤에 이걸 시험해 볼게. – Fozi

+0

어땠어? @Fozi – srbob

+0

네,이 방법이 효과가 있습니다. 내가 한 일에 대한 답변을 게시 하겠지만 올바른 방향으로 나를 밀어 넣었으므로 현상금을 드리겠습니다. – Fozi

0

szOID_ENHANCED_KEY_USAGE srbob의 대답에 따르면 나는 키 사용 분야를 바꿀 수 있었다.

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 
}; 

: 여기

내가 인증서의 확장을 만드는 데 사용하고있어 (간체) 코드입니다, 다시이 내가 CertCreateSelfSignCertificate 호출에 pExtensions 매개 변수를 준비하기 위해 사용하고 코드입니다 위의 코드는 여전히 szOID_KEY_USAGE_RESTRICTION 확장자를 추가합니다.