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 배열입니다. 저장소 공급자 함수가 하나 이상의 콜백 함수를 지원해야 하는 경우 이 배열에 대한 포인터를 제공해야 합니다. 이러한 포인터는 다른 인증서 저장소 작업(예: 저장소 닫기)에 사용할 콜백 함수를 가리킵니다. 다음 그림에서는 이 프로세스의 흐름을 보여 줍니다.
certopenstore 기능
다음 그림과 같이 저장소가 열린 후 다른 CryptoAPI 함수(예: CertCloseStore)는 포인터 배열을 사용하여 의도한 작업을 수행하는 콜백 함수에 액세스합니다. CERT_STORE_PROV_INFO 구조의 정의와 CryptoAPI와 함께 제공되는 기본 콜백 함수의 프로토타입은 인증서 저장소 공급자 콜백 함수표시됩니다.
저장소 API를 사용하면 저장소 공급자가 저장소 캐시 외부의 인증서, CRL 및 인증서 신뢰 목록(CTL)을 유지 관리할 수 있습니다(예: Microsoft Certificate Server 데이터베이스에서 제공하는 것과 같은 인증서의 외부 데이터베이스).
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 (CRL 속성 설정 함수)
- CERT_STORE_PROV_READ_CTL_FUNC
- CERT_STORE_PROV_WRITE_CTL_FUNC (인증서 저장소 제공자 쓰기 CTL 함수)
- 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 (인증서 저장소 제공자 CTL 속성 얻기 함수)
인증서 콜백 함수에는 다음과 같은 서명이 있습니다.
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에 대한 포인터로 대체되었다는 점을 제외하면 위의 서명과 동일합니다.
FIND_CERT 콜백은 저장소 API가 인증서를 열거, 찾기 또는 추가할 때 호출됩니다. pPrevCertContext 및 ppvStoreProvFindInfo가 NULL로 설정되어 새로운 FIND 작업을 시작하기 위해. 반환된 ppvStoreProvFindInfo는 다음 찾기 시에 다시 전달되며, 이때 공급자가 해제할 수 있습니다. 공급자는 인증서 속성을 모두, 일부 또는 전혀 설정하지 않을 수 있습니다. 공급자에는 GET_CERT_PROPERTY 콜백이 호출될 때까지 연기할 수 있는 옵션이 있습니다. 공급자가 다른 저장소에 복사할 수 있도록 가능한 한 많은 속성을 설정하는 것이 좋습니다.
다음 인증서 찾기 형식은 CertFindCertificateInStore지원됩니다.
- CERT_FIND_ANY
- CERT_FIND_SHA1_HASH
- CERT_FIND_MD5_HASH (MD5 해시 찾기)
- 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 사용하여 FIND_CERT 콜백에서 반환된 인증서를 해제하지 않았으므로 참조 수가 0으로 감소하거나 CertCloseStore대한 호출에 의해 해제되는 호출될 때 호출됩니다. CLOSE 콜백이 호출되기 전에 FIND_CERT 콜백에서 반환된 모든 인증서는 FIND_CERT 콜백에 대한 호출 또는 FREE_FIND_CERT 콜백 호출에 전달되어 공급자에게 해제되어야 합니다. CRL 및 CTL 콜백도 마찬가지입니다.
GET_CERT_PROPERTY 콜백은 pCertContext 매개 변수에 대해 지정된 속성을 찾을 수 없는 경우 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을 열거하거나 찾을 때 호출됩니다. 다음 CTL 찾기 형식은 CertFindCTLInStore지원됩니다.
- 탐색_임의
- CTL_FIND_SHA1_HASH
- CTL_FIND_MD5_HASH
- 사용처 찾기 기능
- CTL_FIND_SUBJECT
- CTL_기존 항목 찾기
위의 각 찾기 형식에 대해 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의 CTL_CONTEXT 구조체에 대한 포인터입니다.