2013-05-14 2 views
4

Я изучил, как использовать Sun PKCS # 11 api для доступа к CAC DoD и, возможно, использовать CAC для доступа (только для чтения) Active Directory. Моя проблема была в том, что я нашел в большинстве случаев ссылку на некоторый код, но никогда не показывает ссылочный код. Я нашел следующий код, но дает ошибку. Кто-нибудь знает какие-либо примеры кода или четкую документацию для использования PKCS11 для CAC? Или решение API, которое может работать?Использование Java PKCS # 11 для чтения общей карты доступа DoD

import java.io.*; 
import java.util.*; 
import java.security.cert.CertificateException; 
import java.security.KeyStoreException; 
import java.security.cert.X509Certificate; 
import java.security.KeyStore; 
import java.security.Provider; 
import java.security.Security; 


public class SmartCard { 
    public static void main(String[] args) throws Exception { 
     try { 
      String configName = "pkcs11.properties"; 
      Provider p = new sun.security.pkcs11.SunPKCS11(configName); 
      Security.addProvider(p); 
      Console c = System.console(); 
      char[] pin = c.readPassword("Enter your PIN: "); 
      KeyStore cac = null; 
      cac = KeyStore.getInstance("PKCS11"); 
      cac.load(null, pin); 
      showInfoAboutCAC(cac); 
     } 
     catch(Exception ex) { 
      ex.printStackTrace(); 
      System.exit(0); 
     } 
    } 
    public static void showInfoAboutCAC(KeyStore ks) throws KeyStoreException, CertificateException { 
     Enumeration<String> aliases = ks.aliases(); 
     while(aliases.hasMoreElements()) { 
      String alias = aliases.nextElement(); 
      X509Certificate[] cchain = (X509Certificate[]) ks.getCertificateChain(alias); 
      System.out.println("Certificate Chain for " + alias); 
      for(int i = 0; i < cchain.length; i++) { 
       System.out.println(" -SubjectDN: " + cchain[i].getSubjectDN()); 
       System.out.println(" -IssuerDN: " + cchain[i].getIssuerDN()); 
      } 
     } 
    } 
} 

java.security.ProviderException: Initialization failed 
     at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:374) 
     at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:103) 
     at smartcard.SmartCard.main(SmartCard.java:21) 
Caused by: java.io.IOException: The specified procedure could not be found. 

     at sun.security.pkcs11.wrapper.PKCS11.connect(Native Method) 
     at sun.security.pkcs11.wrapper.PKCS11.<init>(PKCS11.java:137) 
     at sun.security.pkcs11.wrapper.PKCS11.getInstance(PKCS11.java:150) 
     at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:312) 
     ... 2 more 

ответ

2

В следующем коде configName должен быть путь к файлу в какой-то файл конфигурации. Он не существует, или java не может его прочитать, поэтому вызывается IOException. Выясните, какой файл должен быть и создать его, или иначе убедитесь, что у java есть доступ к файлу, и код будет запущен.

String configName = "pkcs11.properties"; 
Provider p = new sun.security.pkcs11.SunPKCS11(configName); 

Чтение руководство может помочь: http://docs.oracle.com/javase/8/docs/technotes/guides/security/p11guide.html#Config

+0

ссылка сломана – gregm

+0

@gregm я нашел его снова, удачи! –

1

Файл свойства действительно существует, и находится в том же каталоге, что и приложение. И насколько я могу судить, Java имеет доступ к файлу.

Если это помогает, вот содержимое файла:

name=SmartCard 
library=C:/Program Files/Java/jre7/bin/j2pkcs11.dll 
+0

вам не хватает строки слота в файле свойств. – mat