2012-01-16 17 views
0

ここでは、httpsウェブサイトに接続し、PKIスマートカードで認証できるJavaスタンドアロンアプリケーションを実装しようとしています。私たちはあらゆる種類の問題を抱えています。PKCS#11 PKCS11 dll

アプレットを使用すると(ブラウザのキーストアとトラストアが使用されます)、すべて正常に動作し、カードのピン番号を入力してアクセス権を取得すると、この種のアプリケーションを実行できることに言及する必要がありますウェブページに

私には2つの質問があります。最初に私のコードに関して、誰かがそれに何か間違っていると思っていますか?

Exception in thread "main" java.security.ProviderException: Initialization failed 
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:340) 
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:86) 
    at TestPKCS11.main(TestPKCS11.java:95) 
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:141) 
    at sun.security.pkcs11.wrapper.PKCS11.getInstance(PKCS11.java:154) 
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:281) 
    ... 2 more 

私の2番目の質問は、PKCS11に使用するDLLに関するさ:

public class TestPKCS11 { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 

    // Set keyStore and trustStore 
    System.setProperty("javax.net.ssl.trustStoreType", "PKCS11"); 
    System.setProperty("javax.net.ssl.trustStore", "NONE"); 
    System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); 
    System.setProperty("javax.net.ssl.trustStoreProvider", "SunPKCS11-mycard"); 
    String trustStore = System.getProperty("javax.net.ssl.trustStore"); 
    if (trustStore == null) { 
     System.out.println("javax.net.ssl.trustStore is not defined"); 
    } else { 
     System.out.println("javax.net.ssl.trustStore = " + trustStore); 
    } 

    System.setProperty("javax.net.ssl.keyStoreType", "PKCS11"); 
    System.setProperty("javax.net.ssl.keyStore", "NONE"); 
    System.setProperty("javax.net.ssl.keyStorePassword", "changeit"); 
    System.setProperty("javax.net.ssl.keyStoreProvider", "SunPKCS11-mycard"); 
    String keyStore = System.getProperty("javax.net.ssl.keyStore"); 
    if (keyStore == null) { 
     System.out.println("javax.net.ssl.keyStore is not defined"); 
    } else { 
     System.out.println("javax.net.ssl.keyStore = " + keyStore); 
    } 

    System.setProperty("javax.net.debug", "ssl"); // dynamic conf of PKCS#11 

    String configName = "C:\\confDirectory\\pkcs11.cfg"; 

    sun.security.pkcs11.SunPKCS11 sunPKCS11 = new sun.security.pkcs11.SunPKCS11(configName); 
    Provider p = sunPKCS11; 
    Security.addProvider(p); 


    SSLSocketFactory sslFact = (SSLSocketFactory) SSLSocketFactory.getDefault(); 

    try{ 
     SSLSocket sock = (SSLSocket)sslFact.createSocket("myserver", 8081); 

     sock.startHandshake(); 

    } catch (SSLHandshakeException ex) { 
     Logger.getLogger(TestPKCS11.class.getName()).log(Level.SEVERE, null, ex); 
     System.out.println(ex.getMessage()); 
    } 
    catch (IOException ex) { 
     Logger.getLogger(TestPKCS11.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

はERRORを実行します。私はそれを実行している間、私たちが持っているランタイムエラーが含まれます。現在、私はそれを使用しているIBMのRationalのインストール(jpkcs11.dll)に含まれていますが、私は本当にそれが良いものであるかどうかは分かりません。私はOpenSCについて読んでいますが、OpenSC-pkcs11.dllファイルが見つかりません。私はopensc.dllを見るだけです。

私は、Java 1.6 27

でのWindows7上で実行していますが

答えて

2

OpenSC PKCS#11ありがとう "opensc-pkcs11.dll" と命名され、それがSYSTEM32に置かれています。しかし、スマートカードがOpenSCによってサポートされていることを確認する必要があります。一般的なルールとして、カードに付属のPKCS#11プロバイダ(通常はクローズドソース)を使用するか、OpenSCのようなカードをサポートする必要があります。

+0

ok私はそれをsystem32見つけられません。おそらく、このフォルダに新しいdllを許可しないクライアントからのセキュリティメッシュは、確認する必要があります。 – jon

0

DLLをsystem32に入れるのではなく、ホームディレクトリ。しかし、それはアプリケーションに依存し、どのようにインストールするかによって異なります。

関連する問題