2012-10-17 16 views
12

मैं जावा के भीतर MSCAPI keystore लोड करना चाहता हूं और MY स्टोर में उपलब्ध प्रमाणपत्रों की जांच करना चाहता हूं। हालांकि उन प्रमाणपत्रों के लिए कुछ कुंजी हार्डवेयर टोकन पर रहते हैं और पॉपअप लोड के दौरान टोकन के लिए पूछता है।निजी कुंजी लोड करने के बिना एमएससीएपीआई जावा कीस्टोर लोड करें (हार्ड टोकन)

क्या विंडोज कीस्टोर लोड करते समय निजी कुंजी लोड करना स्थगित करने का कोई तरीका है? DLL यूएसबी टोकन निर्माता द्वारा आपूर्ति - - जो अंत में एक ड्राइवर (भी टोकन-निर्माता द्वारा आपूर्ति के माध्यम से टोकन के लिए संचार

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

इस प्रश्न को बहुत अधिक ध्यान नहीं मिलता है, शायद ओरेकल मंचों पर भी पूछें (इस प्रश्न से लिंक करें)। –

उत्तर

7

पॉपअप MS-CAPI क्रिप्टोग्राफिक सेवा प्रदाता (CSP) से सक्रिय किया जा रहा है)। कीस्टोर केवल कॉल करता है और परतों के बीच में बस इसे पास करता है;

// 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

मुझे डर था कि यह मामला था। मुझे अंततः हार्डवेयर टोकन के साथ इंटरफेस करने की आवश्यकता थी, इसलिए मैंने टर्मिनल में डाले गए टोकन के साथ सीधे संवाद करने के लिए स्मार्टकार्डियो का उपयोग करके समाप्त कर दिया। जावा विंडोज ट्रस्टस्टोर ने टोकन के लिए निजी कुंजी लोड करने का प्रयास किया जो पहले कंप्यूटर में डाला गया था, जो मेरे लिए अस्वीकार्य था। – emsworth

+0

उत्सुक ... स्मार्टकार्ड के साथ मैं इसके साथ टोकन के लिए संकेत दिए बिना कीस्टोर लोड करने में सक्षम हूं: keyStore = KeyStore.getInstance ("Windows-MY"); keystore.load (शून्य, नल); मुझे लगता है कि यह सॉफ्टवेयर विक्रेता पर निर्भर करता है। – jBilbo

संबंधित मुद्दे