# Zugriff auf KeyStore



## skorpionking (17. Mai 2013)

Hallo zusammen,

ich habe eine SmartCard, die Zertifikate enthält, welche über einen sogen. KeyStore zugänglich sind.
Ziel ist es, die Zertifikate auszulesen.

Wenn ich den Zugriff per SUN-JDK (32-Bit) mache, funktioniert das mit folgendem Code:


```
java.security.Provider provider = new sun.security.pkcs11.SunPKCS11( PATH );
Security.addProvider( provider );
KeyStore keyStore = KeyStore.getInstance( "PKCS11", provider );
keyStore.load( null, PIN.toCharArray() );
 
Enumeration aliasesEnum = keyStore.aliases();
while ( aliasesEnum.hasMoreElements() )
{
     String alias = (String) aliasesEnum.nextElement();
     System.out.println( "Alias: " + alias );
     Certificate cert = keyStore.getCertificate( alias );
     System.out.println( "Certificate: " + cert );
     PrivateKey privateKey = (PrivateKey) keyStore.getKey( alias, null );
     System.out.println( "Private key: " + privateKey );
}
```

Anstelle des SUN-JDK muss ich aber ein IBM-JDK verwenden.
Der Zugriff dort sollte eigentlich (lt. Doku) wie folgt funktionieren:


```
com.ibm.crypto.pkcs11impl.provider.IBMPKCS11Impl provider = new com.ibm.crypto.pkcs11impl.provider.IBMPKCS11Impl( PATH );
Security.insertProviderAt( provider, 1 );
KeyStore keyStore = KeyStore.getInstance( "PKCS11IMPLKS", provider );
keyStore.load( null, PIN.toCharArray() );    // <- hier tritt die Exception auf
 
Enumeration aliasesEnum = keyStore.aliases();
while ( aliasesEnum.hasMoreElements() )
{
     String alias = (String) aliasesEnum.nextElement();
     System.out.println( "Alias: " + alias );
     Certificate cert = keyStore.getCertificate( alias );
     System.out.println( "Certificate: " + cert );
     PrivateKey privateKey = (PrivateKey) keyStore.getKey( alias, null );
     System.out.println( "Private key: " + privateKey );
}
```

Leider erhalte ich in der markierten Zeile folgende Exception:

```
Exception in thread "main" java.security.KeyStoreException: com.ibm.pkcs11.PKCS11Exception: Template is incomplete
    at java.security.KeyStore$Builder$BuilderImpl.getKeyStore(KeyStore.java:707)
...
```

Kann mir evtl. jmd. weiterhelfen, der weiss, wo das Problem liegen könnte?

Danke im Voraus

skorpionking


----------



## skorpionking (7. Juni 2013)

Hat keiner eine Idee?

Grüße skorpionking


----------



## skorpionking (21. Juni 2013)

Hallo,

das Problem ist gelöst.
Ursache war, dass der IBMPKCS11 beim Laden des KeyStores wohl versucht, schreibend auf die SmartCard zuzugreifen. Da diese aber ReadOnly ist, wird hier wahrscheinlich ein interner Fehler ausgelöst.
Details dazu sind in folgendem Foreneintrag nachzulesen:
https://www.ibm.com/developerworks/...topic?id=77777777-0000-0000-0000-000013941775

Zur Lösung des Problems muss in der im Code-Beispiel unter PATH übergebenen Config-Datei folgender Eintrag hinzugefügt werden:

```
disabledMechanisms = {
CKM_RSA_PKCS_KEY_PAIR_GEN
}
```

Anschließend sollte der Zugriff auf die Elemente der SmartCard gelingen.

Ich bedanke mich dennoch bei allen, die mir versucht haben zu helfen.

Viele Grüße skorpionking


----------

