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