2012-10-17 29 views
12

Tôi muốn tải MSCAPI keystore trong Java và kiểm tra các chứng chỉ có sẵn trong cửa hàng MY. Tuy nhiên một số khóa cho các chứng chỉ đó nằm trên mã thông báo phần cứng và cửa sổ bật lên yêu cầu mã thông báo trong khi tải.Tải MSCAPI Java Keystore mà không cần tải khóa riêng (mã thông báo cứng)

Có cách nào trì hoãn việc tải khóa cá nhân khi tải kho khóa Windows không?

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

Câu hỏi này không thu hút được nhiều sự chú ý, có thể hỏi tại diễn đàn của Oracle (liên kết tới câu hỏi này). –

Trả lời

7

Các cửa sổ bật lên đã được kích hoạt từ các nhà cung cấp MS-CAPI Cryptographic Service Provider (CSP) - DLL được cung cấp bởi các nhà sản xuất thẻ USB - mà cuối cùng liên lạc với các dấu hiệu thông qua một trình điều khiển (cũng được cung cấp bởi các token-nhà sản xuất). KeyStore chỉ thực hiện một cuộc gọi và các lớp ở giữa chỉ truyền nó qua; firmware trên mã thông báo là một trong đó ném lên sự xác thực pop-up và duy trì phiên bang vv

Các dll chìa khóa Java là sunmscapi.dll trong đó có việc thực hiện:

// 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; 
    } 
    .... 

Như bạn có thể thấy nó luôn kiểm tra khóa riêng. Bạn sẽ phải sửa đổi mã này và tạo ra một phiên bản tùy chỉnh của sunmscapi.dll để tránh điều này hoặc nếu không đánh bại kiểm tra này.

+0

Tôi đã sợ điều này. Cuối cùng tôi cần giao tiếp với mã thông báo phần cứng, vì vậy tôi đã sử dụng smartcardio để giao tiếp trực tiếp với mã thông báo hiện được chèn vào thiết bị đầu cuối. Cửa sổ tin cậy của cửa sổ Java đã cố tải các khóa riêng cho các mã thông báo đã được chèn trước đó vào máy tính, điều này không thể chấp nhận được đối với tôi. – emsworth

+0

Tò mò ... với thẻ thông minh Tôi có thể tải Keystore mà không cần nhắc mã thông báo: keyStore = KeyStore.getInstance ("Windows-MY"); keystore.load (null, null); Tôi đoán nó phụ thuộc vào nhà cung cấp phần mềm. – jBilbo

Các vấn đề liên quan