2012-11-05 4 views
1

클라이언트에 대한 보안 SSL 연결을 설정하기 위해 CryptoAPI 및 Schannel을 사용하는 서버 응용 프로그램을 작성하고 있습니다. 서버에서는 클라이언트가 확인을 위해 인증서를 제출해야합니다 (ASC_REQ_MUTUAL_AUTH 플래그를 AcceptSecurityContext으로 설정).클라이언트 인증서에 대한 CA 인증서 추가

내가 가지고있는 문제는 일부 클라이언트 (즉, javax.net.ssl을 사용하는 클라이언트)가 클라이언트 인증서를 전달하지 않는다는 것입니다 (그렇게하도록 구성 되었더라도). 클라이언트 인증서에 서명하는 데 사용되는 CA 인증서가 핸드 셰이크 중에 클라이언트에 전달 된 CA 목록에 없기 때문에 이것이 의심 스럽습니다.

나는이 목록에 CA 인증서를 추가하려면 다음의 변화를하려고 노력했습니다

PCERT_CONTEXT caCertContext = ...; /* Imported from a DER formatted file */ 

HCERTSTORE systemStore = CertOpenStore(
       CERT_STORE_PROV_SYSTEM, 
       0, 
       0, 
       CERT_STORE_OPEN_EXISTING_FLAG | 
        CERT_SYSTEM_STORE_LOCAL_MACHINE, 
       L"ROOT"); 

bool ok = CertAddCertificateContextToStore(
       systemStore, 
       caCertContext, 
       CERT_STORE_ADD_USE_EXISTING, 
       NULL); 

if (!ok) 
{ 
    std::cerr << "Could not add certificate to system store!" << std::endl; 
} 

CertAddCertificateContextToStore 항상 실패 위의 예에서. CERT_SYSTEM_STORE_LOCAL_MACHINECERT_SYSTEM_STORE_CURRENT_USER으로 변경하면 인증서를 확인하라는 팝업이 표시되지만 CA 인증서가 클라이언트에 전송 된 목록에 나타나지 않더라도 동의합니다.

또한 임시 저장소 (나는 픽업 한 here)를 사용하여 시스템 저장소 컬렉션을 확장하려고했지만 아무 소용이 없었습니다.

누구든지이 문제를 해결할 방법을 알고 있습니까? GUI 또는 외부 도구를 사용하지 않고 프로그래밍 방식으로 이상적입니까?

+0

CertAddCertificateContextToStore()를 호출 한 후 GetLastError()에서 반환되는 값은 무엇입니까? 나는 꽤 비슷하지만 CertAddEncodedCertificateToStore()를 성공과 함께 사용합니다. – NuSkooler

+0

GetLastError()는 무엇을 의미하든 "5"를 반환합니다 ... 편집 : 오류 5는 ERROR_ACCESS_DENIED 인 것 같습니다. –

답변

1

저장소에 읽기 및 쓰기 권한이 없으므로 오류가 발생합니다.이 권한은 읽기 전용으로 만 액세스 할 수 있습니다.

HCERTSTORE systemStore = CertOpenStore(
      CERT_STORE_PROV_SYSTEM, 
      0, 
      0, 
      CERT_STORE_OPEN_EXISTING_FLAG | 
       CERT_SYSTEM_STORE_LOCAL_MACHINE | CERT_STORE_READONLY_FLAG , 
      L"ROOT"); 

당신이 상점을 변경하고 ++ 응용 프로그램은 그 당신이 당신의 C를 실행하는 경우 관리 권한 상승이 필요합니다 의미 읽기 전용이 없습니다있는 경우 : 그래서 당신이해야 할 것은 수 있도록 CERT_STORE_READONLY_FLAG를 추가입니다 .

+0

그러나 읽기 전용 일 경우 어떻게 프로그래밍 방식으로 CA 인증서 컬렉션을 확장 할 수 있습니까? 해당 컴퓨터의 모든 응용 프로그램에 대해 전역으로 만들 것이므로 시스템 저장소에 추가하지 않으려합니다. –

+0

내 대답을 편집합니다. 상점을 변경하려면 응용 프로그램을 관리자 권한으로 승격해야합니다. 나는이 문제를 해결할 수 있도록이 문제 중 하나를 해결했다는 것을 알고 있습니다. 이 을 매니페스트 파일에 추가하면됩니다. –

관련 문제