2011-04-21 3 views
1

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()를 사용 개인 키가 보존되지 않는 이유는 무엇입니까? 내가 놓친 게 있니?

답변

4

잘못된 CryptoAPI를 사용하고 있습니다. 대신 PFXExportCertStoreExPFXImportCertStore을 사용해야합니다.

업데이트 됨 : 기능이 매우 일반적입니다. 물론 스마트 카드 나 다른 수출 가능하지 않은 인증서의 인증서는 내보낼 수 없습니다. 이 함수의 BLOG는 PFX 파일을 포함하고있는 것입니다. 예를 들어 PFX 파일에서 인증서를 가져 오면 다음을 수행해야합니다.

  1. PFX 파일을 열고 메모리에있는 전체 포함을 읽습니다. 물론 파일 매핑을 대신 사용할 수 있습니다.
  2. PFXIsPFXBlob 기능을 사용하여 파일에 실제로 PFX 파일에 해당하는 파일이 있는지 확인할 수 있습니다.
  3. PFXImportCertStore을 사용하여 BLOB (PFX)을 원본 인증서 저장소로 엽니 다.
  4. CertOpenStore 또는 다른 기능을 사용하여 PFX 파일의 인증서를 저장할 대상 인증서 저장소를 엽니 다.
  5. 소스 인증서 저장소 (PFX)의 인증서를 열거하고 모든 인증서 사용 CertAddCertificateContextToStore을 사용하여 원본 인증서 저장소의 인증서를 대상 인증서 저장소에 추가하려면 CertEnumCertificatesInStore을 사용합니다. 개인 키가있는 인증서는 개인 키와 함께 가져옵니다.
  6. CertCloseStore을 사용하면 열린 상점을 모두 닫을 수 있습니다.
+0

흠,이 기능은 모든 유형의 cert/cert 저장소에서 작동합니까? – Benj

+0

@Benj : 이전 작업 프로그램의 정보를 사용하여 답변을 업데이트했습니다. 나만의 프로그램을 작성하는 것으로 충분할 것입니다. 내보내기는 매우 간단하지만 가져 오기는 좀 더 복잡하므로 가져 오기를 더 자세히 설명했습니다. – Oleg

+0

이것은 훌륭하게 작동하는 것 같습니다. 나는 내 프로그램을 기분 좋게 저장/개인 키를 포함한 모든 인증서를 복원하고있다. 정말 고마워! – Benj

관련 문제