Windows Crypto API를 사용하여 사용자 인증서를 저장하고 복원해야하는 프로그램을 작성했습니다. 나는 그것이 잘 작동했다는 인상을 받고 있었지만 이제 사용자는 인증서가 복원 된 후에 인증서에 첨부 된 개인 키가 유효하지 않다고 불평했습니다. 나중에 다음MS CryptoAPI로 인증서를 저장/복원하면 첨부 된 개인 키가 무효화됩니다.
HCERTSTORE hCertStore =
CertOpenStore(CERT_STORE_PROV_PHYSICAL_W,
0,
NULL,
CERT_SYSTEM_STORE_CURRENT_USER |
CERT_STORE_OPEN_EXISTING_FLAG |
CERT_STORE_READONLY_FLAG |
CERT_STORE_UPDATE_KEYID_FLAG,
(PVOID) storeName.c_str());
을 그리고 :
내가 사용하는 인증서를 저장 한
if (!CertSaveStore(hCertStore,
0,
CERT_STORE_SAVE_AS_STORE,
CERT_STORE_SAVE_TO_FILENAME,
(PVOID) saveFile.c_str(),
0))
내가 CERT_STORE_SAVE_AS_STORE 플래그가 전체 인증서 개인 키를 포함하여 직렬화 가야한다는 것을 의미한다는 것을 이해합니다. 나는 MSDN 말하는 있습니다 만 ". CERT_KEY_CONTEXT_PROP_ID 속성 과 관련 CERT_KEY_PROV_HANDLE_PROP_ID 및 CERT_KEY_SPEC_PROP_ID 값 직렬화 된 저장소에 저장 아니다"
가
.. 나는 고백한다. 나는 정말로 모른다. ...
bOK = CertAddCertificateContextToStore(
hDestinationStore,
pCertContext,
CERT_STORE_ADD_USE_EXISTING,
NULL);
다시 인증서를 추가하려면 그래서 내 질문 : 나는 인증서를 복원 할 때 인증서가 이미 존재하고 그것이 내가 할 수없는 경우에만 경우
내가 볼 CertFindCertificateInStore()를 사용 개인 키가 보존되지 않는 이유는 무엇입니까? 내가 놓친 게 있니?
흠,이 기능은 모든 유형의 cert/cert 저장소에서 작동합니까? – Benj
@Benj : 이전 작업 프로그램의 정보를 사용하여 답변을 업데이트했습니다. 나만의 프로그램을 작성하는 것으로 충분할 것입니다. 내보내기는 매우 간단하지만 가져 오기는 좀 더 복잡하므로 가져 오기를 더 자세히 설명했습니다. – Oleg
이것은 훌륭하게 작동하는 것 같습니다. 나는 내 프로그램을 기분 좋게 저장/개인 키를 포함한 모든 인증서를 복원하고있다. 정말 고마워! – Benj