2011-01-28 29 views
7

Xin chào, tôi đang cố gắng truy cập kho khóa từ thẻ thông minh của mình trong Java. Và tôi đang sử dụng đoạn mã sau ..Mã truy cập Java PKCS11 Không tìm thấy Nhà cung cấp

Tôi đang sử dụng thực hiện Pkcs11 của OpenSc http://www.opensc-project.org/opensc

file windows.cnf =

name=dnie 
library=C:\WINDOWS\system32\opensc-pkcs11.dll 

Java Mã =

String configName = "windows.cnf" 
String PIN = "####"; 
Provider p = new sun.security.pkcs11.SunPKCS11(configName); 
Security.addProvider(p); 
KeyStore keyStore = KeyStore.getInstance("PKCS11", "SunPKCS11-dnie"); =)(= 
char[] pin = PIN.toCharArray(); 
keyStore.load(null, pin); 

Khi thực hiện theo dòng với =) (= ném cho tôi những ngoại lệ sau đây

java.security.KeyStoreException: PKCS11 not found 

    at java.security.KeyStore.getInstance(KeyStore.java:635) 
    at ObtenerDatos.LeerDatos(ObtenerDatos.java:52) 
    at ObtenerDatos.obtenerNombre(ObtenerDatos.java:19) 
    at main.main(main.java:27) 
Caused by: java.security.NoSuchAlgorithmException: no such algorithm: PKCS11 for provider SunPKCS11-dnie 
     at sun.security.jca.GetInstance.getService(GetInstance.java:70) 
     at sun.security.jca.GetInstance.getInstance(GetInstance.java:190) 
     at java.security.Security.getImpl(Security.java:662) 
     at java.security.KeyStore.getInstance(KeyStore.java:632) 

Tôi nghĩ vấn đề là "SunPKCS11-DNIe", nhưng tôi không biết phải đặt ở đó. Tôi đã thử với rất nhiều sự kết hợp ...

Bất cứ ai có thể giúp tôi ...

Trả lời

4

Tôi không chắc chắn vấn đề là tên. Có vẻ đúng. ColinD's suggestion để vượt qua trường hợp Provider nên loại trừ sự cố đó.

Tôi đoán rằng sự cố là với sự hỗ trợ PKCS11. Giống như, bạn không có một thẻ trong đầu đọc của bạn, hoặc mã nguồn gốc không thể truy cập người đọc. Bạn đã thử sử dụng trình điều khiển này cùng với một số phần mềm "nổi tiếng", như các mô-đun bảo mật của Firefox hoặc Thunderbird?

+1

Tôi đã tìm thấy .dll cho trình đọc thẻ thông minh của tôi (asepkcs.dll). Và tôi đã thử lại với cùng một mã (với các gợi ý của @ ColinD) và Hoạt động! Vì vậy, vấn đề là .dll. Bạn phải có dll chính xác cho thiết bị của bạn. – oracleruiz

3

Tại sao bạn không chỉ vượt qua Provider trực tiếp như là đối số thứ hai để KeyStore.getInstance(String, Provider). Trong mã của bạn, bạn chỉ cần thực hiện:

KeyStore keyStore = KeyStore.getInstance("PKCS11", p); 
+0

Đề xuất tốt. Đây là cách tôi làm điều đó. Mặc dù tên có vẻ chính xác trong mã, nhưng sẽ tốt nếu loại bỏ đặt tên là một vấn đề. – erickson

+0

Bạn có ý nghĩa gì? có thể, KeyStore keyStore = KeyStore.getInstance ("PKCS11", "opensc") ?? – oracleruiz

+2

@oracleruiz: 'KeyStore' có quá tải' getInstance' lấy 'Nhà cung cấp' trực tiếp làm đối số thứ hai: [KeyStore.getInstance (String, Provider)] (http://download.oracle.com/javase/1.5 .0/docs/api/java/security/KeyStore.html # getInstance% 28java.lang.String,% 20java.security.Provider% 29). Xem bản chỉnh sửa của tôi, mặc dù @erickson nói đúng rằng nó có thể là một thứ khác trong trường hợp đó vẫn không thành công. – ColinD

6

Tôi cũng đã nhận được báo lỗi như sau:

Caused by: java.security.NoSuchAlgorithmException: no such algorithm: PKCS11 for provider SunPKCS11

Tôi đang chạy các ứng dụng từ một bình thông qua file bat.

tập tin tôi dơi Tôi thay thế mã: java - jar sign.jar với mã: java -Djava.security.debug=sunpkcs11,pkcs11 -jar SigningUtility.jar

Và nó giải quyết vấn đề này.

+0

Tôi không thấy cách đưa ra các tùy chọn gỡ lỗi sẽ giải quyết vấn đề này. Có thể bạn đã gọi nó từ một thư mục làm việc khác? –

0

Điều này có nghĩa là nhận xét về câu trả lời của BK Elizabeth (không thể nhận xét vì danh tiếng).

Tại sao nó hoạt động khi bật thuộc tính hệ thống gỡ lỗi, không có slotId? Đây là một tác dụng phụ (vui lòng xem câu trả lời này: https://stackoverflow.com/a/16776155/5658642).

-1

Hãy thử đoạn code dưới đây:

// Create instance of SunPKCS11 provider 
String pkcs11Config = "name=eToken\nlibrary=C:\\Windows\\System32\\eps2003csp11.dll"; 
java.io.ByteArrayInputStream pkcs11ConfigStream = new java.io.ByteArrayInputStream(pkcs11Config.getBytes()); 
sun.security.pkcs11.SunPKCS11 providerPKCS11 = new sun.security.pkcs11.SunPKCS11(pkcs11ConfigStream); 
java.security.Security.addProvider(providerPKCS11); 

// Get provider KeyStore and login with PIN 
String pin = "12345678"; 
java.security.KeyStore keyStore = java.security.KeyStore.getInstance("PKCS11", providerPKCS11); 
keyStore.load(null, pin.toCharArray()); 

nó đang làm việc tốt cho tôi.

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