permitida opcion exportar existe example close claves certificado archivo almacén java google-api google-prediction

opcion - keystore java download



Obtención de un objeto PrivateKey de un archivo.p12 en Java (4)

Como sugiere el título, tengo el archivo .p12 requerido para el acceso a la API de la cuenta del servicio de Google. Para obtener la credencial para conectarse a la api, hay un campo .setServiceAccountPrivateKey (PrivateKey privateKey). Entonces, ¿cuál es la forma más fácil en que puedo hacer esto? Tengo una carpeta de recursos que está en mi ruta de clases, por lo que si agrego el archivo p12 allí, puedo obtener el recurso de getClass (). GetResource () como inputStream o como URL. He intentado el método de URL pero no funciona (aparece un error "URI no es jerárquico" al intentar crear un objeto de archivo desde URL.toURI ()).


Creo que es más fácil llamar directamente a SecurityUtils de Google, por ejemplo:

PrivateKey privateKey = SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(), this.getClass().getResourceAsStream("keyFile.p12"), "notasecret", "privatekey", "notasecret")

Es de una línea y no tiene que preocuparse por el alias.


Las sugerencias anteriores no funcionaron para mí. Luego probé el de http://www.java2s.com/Code/Java/Security/RetrievingaKeyPairfromaKeyStore.htm y funcionó. Copia pegándolo abajo

import java.io.FileInputStream; import java.security.Key; import java.security.KeyPair; import java.security.KeyStore; import java.security.PrivateKey; import java.security.PublicKey; import java.security.cert.Certificate; public class Main { public static void main(String[] argv) throws Exception { FileInputStream is = new FileInputStream("your.keystore"); KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); keystore.load(is, "my-keystore-password".toCharArray()); String alias = "myalias"; Key key = keystore.getKey(alias, "password".toCharArray()); if (key instanceof PrivateKey) { // Get certificate of public key Certificate cert = keystore.getCertificate(alias); // Get public key PublicKey publicKey = cert.getPublicKey(); // Return a key pair new KeyPair(publicKey, (PrivateKey) key); } } }


Si obtiene un null de getKey() (por ejemplo, está utilizando BouncyCastle como proveedor), debe encontrar el último elemento keyAlias :

KeyStore keystore = KeyStore.getInstance("PKCS12", "BC"); keystore.load(this.getClass().getClassLoader().getResourceAsStream("keyFile.p12"), p12Password.toCharArray()); Enumeration aliases = keystore.aliases(); String keyAlias = ""; while (aliases.hasMoreElements()) { keyAlias = (String) aliases.nextElement(); } PrivateKey key = (PrivateKey)keystore.getKey(keyAlias, pass);


Puede cargar su archivo .p12 utilizando el método ClassLoader.getResourceAsStream(String) , cargarlo en un KeyStore y obtener la clave del KeyStore.

KeyStore keystore = KeyStore.getInstance("PKCS12"); keystore.load(this.getClass().getClassLoader().getResourceAsStream("keyFile.p12"), p12Password.toCharArray()); PrivateKey key = (PrivateKey)keystore.getKey(keyAlias, p12Password.toCharArray());

ClassLoader.getResourceAsStream(String) carga recursos desde cualquier ubicación, siempre que ya estén en la ruta de clase, no es necesario especificar una ruta al archivo.

keyAlias es el nombre de la entrada en su archivo p12 que corresponde a la clave privada. Los archivos PKCS12 pueden contener varias entradas, por lo que necesita alguna forma de indicar a qué entrada desea acceder. El alias es cómo se logra esto.

Si no está seguro de cuál es el alias para su clave privada, puede usar la keytool desde la línea de comandos para enumerar los contenidos de su archivo p12. Esta herramienta se incluye con todas las instalaciones de JRE y JDK.

keytool -list -keystore keyFile.p12 -storepass password -storetype PKCS12

Salida

Keystore type: PKCS12 Keystore provider: SunJSSE Your keystore contains 1 entry yourKeyAlias, Sep 4, 2013, PrivateKeyEntry, Certificate fingerprint (MD5): 48:A8:C4:12:8E:4A:8A:AD:58:81:26:90:E7:3D:C8:04