제 질문은 : 응용 프로그램이 서명과 같은 암호화 작업을 수행하기 위해 CSP를 호출 할 때 CSP가 certifcate의 개인 키를 찾는 방법은 무엇입니까?
인증서를 가져온 인증서가 로컬 컴퓨터 (USB 토큰, 모바일 장치와 같은 외부 저장소)에 개인 키가 저장되어 있지 않은 경우 찾을 수 있습니까?
CSP가 암호화 작업을 수행하기 위해 인증서의 개인 키를 찾는 방법은 무엇입니까?
답변
CSP 자체가 아닌 CSP에서 사용하는 키 저장소의 위치와 유형에 따라 달라집니다. 예를 들어, USB 토큰에는 대개 PKCS # 11 드라이버가 필요합니다. CSP는 드라이버를 통해 키를 "사용"하지만 개인 키를 토큰에서 추출 할 수 없기 때문에 드라이버를 "가져 오지"않습니다. 그러나 소프트웨어 키 스토어는 먼저 .. 키를 제공하거나 당신은 어느 쪽이 보통 별칭으로 사용하는 CSP에게 소프트웨어 및 하드웨어 키를
을 결합 예를 들어 윈도우 스토어의 컨텐츠
를 노출하지 않고 사용하도록 허용 할 수 있습니다 사용 가능한 모든 인증서를 가져오고 사용자에게 인증서를 선택하라는 메시지를 표시하고 선택한 인증서의 별칭을 CSP에 제공하여 암호화 작업을 수행합니다.
인증서를 시스템 저장소로 가져 오면 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 기능으로 그것을 달성 할 수 있습니다. 예를 들어 : Windows가 개인 키를하고 싶어
, 그것은 다시 (CertGetCertificateContextProperty를 호출하는 CryptAcquireCertificatePrivateKey를 호출 이제 인증서 (안 영어 죄송합니다) 다음과 같이 보일 것입니다 들어
#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:
key_prov_info.pwszProvName = L"Microsoft Software Key Storage Provider"; // Or L"Your_CNG_key_storage_provider_name"
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;
}
. .., CERT_KEY_PROV_INFO_PROP_ID, ...).
감사합니다. 우수 설명. –
나는 그것이 사용 된 CSP에 달려 있다고 말할 것입니다. 인증서가 USB 토큰 용 CSP에 의해 관리되는 경우 USB 토큰에 개인 키가 있어야합니다. – Robert
CSP가 발견 한 메커니즘과 암호화 연산의 개인 키에 액세스하는 메커니즘은 무엇입니까? 좀 더 자세히 설명해 주시겠습니까? –
CSP 자체가 아닌 CSP에서 사용하는 키 저장소의 위치와 유형에 따라 달라질 것입니다. 예를 들어, USB 토큰에는 대개 PKCS # 11 드라이버가 필요합니다. CSP는 드라이버를 통해 키를 "사용"하지만 개인 키를 토큰에서 추출 할 수 없기 때문에 드라이버를 "가져 오지"않습니다. 그러나 소프트웨어 키 스토어는 키를 제공하거나 콘텐츠를 노출하지 않고 키 키를 사용할 수 있습니다 (예 : Windows 키 저장소). – pedrofb