클라이언트에 대한 보안 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_MACHINE
을 CERT_SYSTEM_STORE_CURRENT_USER
으로 변경하면 인증서를 확인하라는 팝업이 표시되지만 CA 인증서가 클라이언트에 전송 된 목록에 나타나지 않더라도 동의합니다.
또한 임시 저장소 (나는 픽업 한 here)를 사용하여 시스템 저장소 컬렉션을 확장하려고했지만 아무 소용이 없었습니다.
누구든지이 문제를 해결할 방법을 알고 있습니까? GUI 또는 외부 도구를 사용하지 않고 프로그래밍 방식으로 이상적입니까?
CertAddCertificateContextToStore()를 호출 한 후 GetLastError()에서 반환되는 값은 무엇입니까? 나는 꽤 비슷하지만 CertAddEncodedCertificateToStore()를 성공과 함께 사용합니다. – NuSkooler
GetLastError()는 무엇을 의미하든 "5"를 반환합니다 ... 편집 : 오류 5는 ERROR_ACCESS_DENIED 인 것 같습니다. –