2012-10-17 3 views
12

Java 내에 MSCAPI keystore을로드하고 MY 저장소에서 사용 가능한 인증서를 검토하고 싶습니다. 그러나 이러한 인증서의 일부 키는 하드웨어 토큰에 있으며 팝업은로드 중에 토큰을 묻습니다.개인 키를로드하지 않고 MSCAPI Java 키 저장소로드 (하드 토큰)

Windows 키 저장소를로드 할 때 개인 키로드를 지연하는 방법이 있습니까? 마지막 또한 토큰 제조업체에서 제공하는 드라이버 (통해 토큰 전달 -의 USB 토큰 제조자에 의해 공급되는 DLL -

keyStore = KeyStore.getInstance("Windows-MY", "SunMSCAPI"); 
keystore.load(null,null); 
+0

이 질문은 많은 관심을받지는 못하지만 오라클 포럼 (이 질문에 대한 링크)에서 질문하십시오. –

답변

7

팝업은 MS-CAPI 암호화 서비스 제공자 (CSP)에서 활성화되고). KeyStore는 단순히 전화를 걸고 그 사이의 레이어는 통과시킵니다. 당신으로

// Use CertEnumCertificatesInStore to get the certificates 
// from the open store. pCertContext must be reset to 
// NULL to retrieve the first certificate in the store. 
while (pCertContext = ::CertEnumCertificatesInStore(hCertStore, pCertContext)) 
{ 
    // Check if private key available - client authentication certificate 
    // must have private key available. 
    HCRYPTPROV hCryptProv = NULL; 
    DWORD dwKeySpec = 0; 
    HCRYPTKEY hUserKey = NULL; 
    BOOL bCallerFreeProv = FALSE; 
    BOOL bHasNoPrivateKey = FALSE; 
    DWORD dwPublicKeyLength = 0; 

    if (::CryptAcquireCertificatePrivateKey(pCertContext, NULL, NULL, 
              &hCryptProv, &dwKeySpec, &bCallerFreeProv) == FALSE) 
    { 
     bHasNoPrivateKey = TRUE; 

    } else { 
     // Private key is available 

    BOOL bGetUserKey = ::CryptGetUserKey(hCryptProv, dwKeySpec, &hUserKey); 

    // Skip certificate if cannot find private key 
    if (bGetUserKey == FALSE) 
    { 
     if (bCallerFreeProv) 
      ::CryptReleaseContext(hCryptProv, NULL); 

     continue; 
    } 
    .... 

: 토큰의 펌웨어는 인증 팝업을 던져 세션 상태를 유지 하나, 등 구현이 핵심 자바 DLL이 sunmscapi.dll입니다

입니다 항상 개인 키가 있는지 확인합니다. 이 코드를 수정하고 sunmscapi.dll의 사용자 지정 버전을 만들어이 검사를 피하거나이 검사를 무효화해야합니다.

+0

나는 이것이 두려웠다. 궁극적으로 하드웨어 토큰과 인터페이스해야하므로 smartcardio를 사용하여 현재 터미널에 삽입 된 토큰과 직접 통신합니다. Java 창 truststore는 이전에 컴퓨터에 삽입 된 토큰에 대한 개인 키를로드하려고 시도했지만 이는 허용 할 수 없었습니다. – emsworth

+0

호기심 ... SmartCard를 사용하여 다음과 같이 토큰을 묻지 않고 키 스토어를로드 할 수 있습니다. keyStore = KeyStore.getInstance ("Windows-MY"); keystore.load (null, null); 나는 그것이 소프트웨어 공급 업체에 달려 있다고 생각한다. – jBilbo