CertOpenStore 기능 확장
인증서 저장소는 모든 인증서 관리 작업의 중심입니다. CertOpenStore 함수의 기능은 설치 가능(또는 등록된) 인증서 저장소 공급자 함수를 사용하여 확장할 수 있습니다. CryptoAPI에 사용할 함수를 설치하거나 등록하는 방법에 대한 개요는 OID 개요를 참조하세요.
참고
사용자 지정 인증서 저장소는 자동화된 배포를 수행할 때 자동으로 마이그레이션되지 않습니다. 사용자 지정 인증서 저장소를 마이그레이션하려면 사용자 지정 저장소를 마이그레이션하기 위한 매니페스트를 만들고 USMT(Windows 사용자 상태 마이그레이션 도구)를 사용해야 합니다.
CertOpenStore는 메모리에 빈 저장소를 열고 lpszStoreProvider 매개 변수에 전달된 OID(개체 식별자)를 사용하여 저장소 공급자 함수를 호출합니다(등록되거나 설치된 경우). CryptoAPI와 함께 제공되는 미리 정의된 공급자 유형 목록은 CertOpenStore를 참조하세요.
저장소 공급자 함수는 인증서 및 CRL( 인증서 해지 목록 )을 전달된 hCertStore 핸들로 지정된 메모리 내 저장소에 복사합니다. 새 저장소 공급자 함수는 CertAddCertificateContextToStore 또는 CertAddSerializedElementToStore와 같은 CryptoAPI 인증서 저장소 함수를 사용하여 해당 인증서 및 CRL을 메모리 내 저장소에 추가할 수 있습니다. 또한 저장소 공급자 함수는 필요에 따라 CERT_STORE_PROV_INFO 구조체의 모든 데이터 멤버에 대한 값을 반환합니다. 함수는 추가 콜백 함수를 지원하는 경우에만 이 구조를 업데이트해야 합니다. 예를 들어 저장소가 읽기 전용 저장소인 경우 다른 콜백 함수의 지원이 필요하지 않을 수 있습니다. 가능한 콜백 함수의 세부 정보 및 프로토타입은 인증서 저장소 공급자 콜백 함수를 참조하세요.
사용자별 TrustedPeople 저장소는 미리 정의된 실제 저장소로 제한됩니다. 사용자별로 TrustedPeople 저장소를 확장할 수 없습니다. 그러나 로컬 컴퓨터 TrustedPeople 저장소를 확장할 수 있습니다.
Windows XP 및 Windows Server 2003: 사용자별 TrustedPeople 저장소는 미리 정의된 실제 저장소로 제한되지 않습니다.
CERT_STORE_PROV_INFO 구조체의 데이터 멤버 중 하나는 rgpvStoreProvFunc 배열입니다. 저장소 공급자 함수가 하나 이상의 콜백 함수를 지원해야 하는 경우 이 배열에 대한 포인터를 제공해야 합니다. 이러한 포인터는 다른 인증서 저장소 작업에 사용할 콜백 함수(예: 저장소 닫기)를 가리킵니다. 다음 그림에서는 이 프로세스의 흐름을 보여 줍니다.
다음 그림과 같이 저장소를 연 후 다른 CryptoAPI 함수(예: CertCloseStore)는 포인터 배열을 사용하여 의도한 작업을 수행하는 콜백 함수에 액세스합니다. cryptoAPI와 함께 제공되는 기본 콜백 함수의 CERT_STORE_PROV_INFO 구조 및 프로토타입의 정의는 인증서 저장소 공급자 콜백 함수에 표시됩니다.
저장소 API를 사용하면 저장소 공급자가 저장소 캐시 외부에서 인증서, CRL 및 CTL( 인증서 신뢰 목록 )을 유지 관리할 수 있습니다(예: Microsoft 인증서 서버 데이터베이스에서 제공하는 것과 같은 인증서의 외부 데이터베이스).
CertOpenStore 는 pszStoreProvider 매개 변수를 통해 적절한 CertDllOpenStoreProv 설치 가능한 공급자 함수로 디스패치합니다. 공급자는 CERT_STORE_PROV_INFO 구조를 가리키는 pStoreProvInfo 매개 변수의 정보를 반환합니다. CERT_STORE_PROV_INFO 구조체에는 dwStoreProvFlags 멤버가 포함됩니다. 공급자가 인증서, CRL 및 CTL이 저장소의 캐시 외부에 있음을 나타낼 수 있도록 CERT_STORE_PROV_EXTERNAL_FLAG 플래그가 추가되었습니다.
CertDllOpenStoreProv 는 콜백 함수 배열을 반환합니다. 공급자는 다음 콜백 함수를 구현할 수 있습니다.
- CERT_STORE_PROV_CLOSE_FUNC
- CERT_STORE_PROV_READ_CERT_FUNC
- CERT_STORE_PROV_WRITE_CERT_FUNC
- CERT_STORE_PROV_DELETE_CERT_FUNC
- CERT_STORE_PROV_SET_CERT_PROPERTY_FUNC
- CERT_STORE_PROV_READ_CRL_FUNC
- CERT_STORE_PROV_WRITE_CRL_FUNC
- CERT_STORE_PROV_DELETE_CRL_FUNC
- CERT_STORE_PROV_SET_CRL_PROPERTY_FUNC
- CERT_STORE_PROV_READ_CTL_FUNC
- CERT_STORE_PROV_WRITE_CTL_FUNC
- CERT_STORE_PROV_DELETE_CTL_FUNC
- CERT_STORE_PROV_SET_CTL_PROPERTY_FUNC
CERT_STORE_PROV_WRITE_ADD_FLAG 설정된 경우 WRITE_CERT, WRITE_CRL 및 WRITE_CTL 콜백 함수에 대한 호출에서 dwFlags 매개 변수의 상위 16비트에는 dwAddDisposition 값이 포함됩니다. 외부 저장소를 지원하기 위해 공급자는 다음 콜백 함수를 구현할 수 있습니다.
- CERT_STORE_PROV_FIND_CERT_FUNC
- CERT_STORE_PROV_FREE_FIND_CERT_FUNC
- CERT_STORE_PROV_GET_CERT_PROPERTY_FUNC
- CERT_STORE_PROV_FIND_CRL_FUNC
- CERT_STORE_PROV_FREE_FIND_CRL_FUNC
- CERT_STORE_PROV_GET_CRL_PROPERTY_FUNC
- CERT_STORE_PROV_FIND_CTL_FUNC
- CERT_STORE_PROV_FREE_FIND_CTL_FUNC
- CERT_STORE_PROV_GET_CTL_PROPERTY_FUNC
인증서 콜백 함수에는 다음과 같은 서명이 있습니다.
typedef struct _CERT_STORE_PROV_FIND_INFO {
DWORD cbSize;
DWORD dwMsgAndCertEncodingType;
DWORD dwFindFlags;
DWORD dwFindType;
const void *pvFindPara;
} CERT_STORE_PROV_FIND_INFO, *PCERT_STORE_PROV_FIND_INFO;
typedef const CERT_STORE_PROV_FIND_INFO CCERT_STORE_PROV_FIND_INFO,
*PCCERT_STORE_PROV_FIND_INFO;
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FIND_CERT)(
IN HCERTSTOREPROV hStoreProv,
IN PCCERT_STORE_PROV_FIND_INFO pFindInfo,
IN PCCERT_CONTEXT pPrevCertContext,
IN DWORD dwFlags,
IN OUT void **ppvStoreProvFindInfo,
OUT PCCERT_CONTEXT *ppProvCertContext
);
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_FREE_FIND_CERT)(
IN HCERTSTOREPROV hStoreProv,
IN PCCERT_CONTEXT pCertContext,
IN void *pvStoreProvFindInfo,
IN DWORD dwFlags
);
typedef BOOL (WINAPI *PFN_CERT_STORE_PROV_GET_CERT_PROPERTY)(
IN HCERTSTOREPROV hStoreProv,
IN PCCERT_CONTEXT pCertContext,
IN DWORD dwPropId,
IN DWORD dwFlags,
OUT void *pvData,
IN OUT DWORD *pcbData
);
CRL 및 CTL 콜백 함수의 서명은 위와 동일하며 CERT_CONTEXT 대한 포인터가 CRL_CONTEXT 또는CTL_CONTEXT 대한 포인터로 바뀝니다.
저장소 API가 인증서를 열거, 찾기 또는 추가할 때 FIND_CERT 콜백이 호출됩니다. pPrevCertContext 및 ppvStoreProvFindInfo 는 NULL 로 설정되어 새 FIND를 시작합니다. 반환된 ppvStoreProvFindInfo 는 공급자가 해제할 수 있는 다음 찾기에서 다시 전달됩니다. 공급자는 인증서 속성을 모두, 일부 또는 전혀 설정할 수 없습니다. 공급자에는 GET_CERT_PROPERTY 콜백이 호출될 때까지 연기할 수 있는 옵션이 있습니다. 공급자가 다른 저장소에 복사할 수 있도록 가능한 한 많은 속성을 설정하는 것이 좋습니다.
CertFindCertificateInStore에서 지원되는 인증서 찾기 유형은 다음과 같습니다.
- CERT_FIND_ANY
- CERT_FIND_SHA1_HASH
- CERT_FIND_MD5_HASH
- CERT_FIND_PROPERTY
- CERT_FIND_PUBLIC_KEY
- CERT_FIND_SUBJECT_NAME
- CERT_FIND_SUBJECT_ATTR
- CERT_FIND_ISSUER_NAME
- CERT_FIND_ISSUER_ATTR
- CERT_FIND_SUBJECT_STR_A
- CERT_FIND_SUBJECT_STR_W
- CERT_FIND_ISSUER_STR_A
- CERT_FIND_ISSUER_STR_W
- CERT_FIND_KEY_SPEC
- CERT_FIND_ENHKEY_USAGE
위의 각 찾기 형식에 대해 FIND_CERT 콜백이 호출됩니다. CertFindCertificateInStore에 전달된 매개 변수는 FIND_CERT 콜백이 호출되기 전에 CERT_STORE_PROV_FIND_INFO 구조체에 직접 복사됩니다. CERT_STORE_PROV_FIND_INFO 구조체의 다양한 찾기 형식에 대한 필드 값에 대한 자세한 내용은 CertFindCertificateInStore를 참조하세요.
다음 인증서 찾기 형식은 CertGetSubjectCertificateFromStore 및 CertGetIssuerCertificateFromStore API를 지원하고 추가하기 전에 인증서가 저장소에 이미 있는지 여부를 확인하는 데 도움이 됩니다.
- CERT_FIND_SUBJECT_CERT
- CERT_FIND_ISSUER_OF
- CERT_FIND_EXISTING
CERT_FIND_SUBJECT_CERT 경우 pvFindPara 매개 변수는 주체의 발급자 및 직렬 번호가 포함된 CERT_INFO 구조를 가리킵니다. CERT_FIND_ISSUER_OF 경우 pvFindPara 는 주제의 CERT_CONTEXT 구조를 가리킵니다. CERT_FIND_EXISTING 경우 pvFindPara는 인증서의 CERT_CONTEXT 가리키며 저장소에 있는지 검사.
FREE_FIND_CERT 콜백은 후속 FIND_CERT 사용되거나 참조 수가 0으로 감소하거나 CertCloseStore 호출에 의해 해제되어 FIND_CERT 콜백에서 반환된 인증서를 해제하지 않을 때 호출됩니다. CLOSE 콜백이 호출되기 전에 FIND_CERT 콜백에서 반환된 모든 인증서는 FIND_CERT 콜백에 대한 호출 또는 FREE_FIND_CERT 콜백에 대한 호출에 전달되어 공급자에게 해제되어야 합니다. CRL 및 CTL 콜백도 마찬가지입니다.
pCertContext 매개 변수에 대해 지정된 속성을 찾을 수 없는 경우 GET_CERT_PROPERTY 콜백은 CertGetCertificateContextProperty에서 호출됩니다. GET_CRL_PROPERTY 및 GET_CTL_PROPERTY 마찬가지입니다.
FIND_CRL 콜백은 저장소 API가 CRL을 열거하거나 가져올 때와 CRL을 추가하기 전에 호출됩니다. 다음 CRL 찾기 형식이 정의됩니다.
CRL_FIND_ISSUED_BY 경우 pvFindPara 는 CRL 발급자의 CERT_CONTEXT 대한 포인터입니다. CRL_FIND_EXISTING 경우 pvFindPara 는 CRL 의 CRL_CONTEXT 대한 포인터로, 저장소에 이미 있는지 여부를 확인합니다.
FIND_CTL 콜백은 저장소 API가 CTL을 열거하거나 찾을 때 호출됩니다. CertFindCTLInStore에서 지원되는 CTL 찾기 형식은 다음과 같습니다.
- CTL_FIND_ANY
- CTL_FIND_SHA1_HASH
- CTL_FIND_MD5_HASH
- CTL_FIND_USAGE
- CTL_FIND_SUBJECT
- CTL_FIND_EXISTING
위의 각 찾기 형식에 대해 FIND_CTL 콜백이 호출됩니다. CertFindCTLInStore에 전달된 매개 변수는 FIND_CTL 콜백이 호출되기 전에 CERT_STORE_PROV_FIND_INFO 구조체에 직접 복사됩니다. CERT_STORE_PROV_FIND_INFO 구조체의 다양한 찾기 형식에 대한 필드 값에 대한 자세한 내용은 CertFindCTLInStore를 참조하세요.
CTL_FIND_EXISTING CTL 찾기 형식은 CTL 추가를 수행하기 전에 CTL이 저장소에 이미 있는지 여부를 확인하는 데 도움이 됩니다.
CTL_FIND_EXISTING 경우 pvFindPara 는 CTL의 CTL_CONTEXT 구조에 대한 포인터로, 저장소에 이미 있는지 여부를 확인합니다.