2011-03-10 15 views
7

Estoy intentando generar el par de claves RSA y almacenarlo en el almacén de claves de HSM. El código que tengo en este momento es el siguiente:Generación de claves de RSA y almacenamiento en el almacén de claves

String configName = "C:\\eTokenConfig.cfg"; 
    Provider p = new sun.security.pkcs11.SunPKCS11(configName); 
    Security.addProvider(p); 
    // Read the keystore form the smart card 
    char[] pin = { 'p', '4', 's', 's', 'w', '0', 'r', 'd' }; 
    KeyStore keyStore = KeyStore.getInstance("PKCS11",p); 
    keyStore.load(null, pin); 
    //generate keys 
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA",p); 
    kpg.initialize(512); 
    KeyPair pair = kpg.generateKeyPair(); 

    PrivateKey privateKey = pair.getPrivate(); 
    PublicKey publicKey = pair.getPublic(); 
    // Save Keys How ??? 

He intentado utilizar el método keyStore.setEntry pero el problema es que requiere una cadena de certificados y no sabe cómo conseguir este certificado ??

Respuesta

-1

No debería poder leer la clave privada si genera la clave dentro del token. necesitará crear un certificado ficticio (por ejemplo, autofirmado) y almacenarlo con un alias, el modelo del almacén de claves depende de los certificados para que se pueda utilizar.

1

Ver http://docs.oracle.com/javase/tutorial/security/apisign/vstep2.html

Guardar clave pública:

X509EncodedKeySpec x509ks = new X509EncodedKeySpec(
      publicKey.getEncoded()); 
    FileOutputStream fos = new FileOutputStream(strPathFilePubKey); 
    fos.write(x509ks.getEncoded()); 

de carga de clave pública:

byte[] encodedKey = IOUtils.toByteArray(new FileInputStream(strPathFilePubKey)); 
    KeyFactory keyFactory = KeyFactory.getInstance("RSA", p); 
    X509EncodedKeySpec pkSpec = new X509EncodedKeySpec(
      encodedKey); 
    PublicKey publicKey = keyFactory.generatePublic(pkSpec); 

Guardar clave privada:

PKCS8EncodedKeySpec pkcsKeySpec = new PKCS8EncodedKeySpec(
      privateKey.getEncoded()); 
    FileOutputStream fos = new FileOutputStream(strPathFilePrivbKey); 
    fos.write(pkcsKeySpec.getEncoded()); 

Cargar Clave Privada:

byte[] encodedKey = IOUtils.toByteArray(new FileInputStream(strPathFilePrivKey)); 
    KeyFactory keyFactory = KeyFactory.getInstance("RSA", p); 
    PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(
      encodedKey); 
    PrivateKey privateKey = keyFactory.generatePrivate(privKeySpec); 
+0

Desafortunadamente esta solución no funciona cuando la clave privada es "no extraíble" del dispositivo PKCS # 11. 'privateKey.getEncoded()' puede devolver 'null' – Jcs

Cuestiones relacionadas