Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting a PrivateKey object from a .p12 file in Java

As the title suggests, I have .p12 file required for google service account api access. In order to get the credential to connect to the api, there's a field .setServiceAccountPrivateKey(PrivateKey privateKey). So, what's the easiest way in which I can do this? I have a resources folder which is in my classpath so if I add the p12 file there, I can get the resource from getClass().getResource() as either an inputStream or a URL. I've tried the URL method but it doesn't work (I get a "URI is not hierarchical" error trying to create a File object from URL.toURI()).

like image 623
gratsby Avatar asked Sep 04 '13 18:09

gratsby


People also ask

How to get public key from p12 file in Java?

You can load your . p12 file using the ClassLoader. getResourceAsStream(String) method, load it to a KeyStore and them get the key from the KeyStore.

How do I use p12 files?

In the Cloud Manager, click TLS Profiles. Click Select File, browse for the certificate file that you want to present for authentication, and click Open. Note: API Connect supports only the P12 (PKCS12) format file for the present certificate.


1 Answers

You can load your .p12 file using the ClassLoader.getResourceAsStream(String) method, load it to a KeyStore and them get the key from the 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) loads resources from any location provided they're already on the classpath, there's no need to specify a path to the file.

keyAlias is the name of the entry in your p12 file that corresponds to the private key. PKCS12 files can contain multiple entries, so you need some way to indicate which entry you want to access. The alias is how this is achieved.

If you're not sure what the alias for your private key is, you can use the keytool utility from the command line to list the contents of your p12 file. This tool is included with all JRE and JDK installations.

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

Output

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 
like image 175
Syon Avatar answered Sep 18 '22 20:09

Syon