Getting a PrivateKey object from a .p12 file in Java

前端 未结 4 1621
[愿得一人]
[愿得一人] 2020-12-05 06:59

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 .setServiceAcc

相关标签:
4条回答
  • 2020-12-05 07:30

    The above suggestions did not work for me. Then I tried the one at http://www.java2s.com/Code/Java/Security/RetrievingaKeyPairfromaKeyStore.htm and it worked. Copy pasting it below

    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);
        }
      }
    }
    
    0 讨论(0)
  • 2020-12-05 07:36

    If you get null from getKey() (eg. you are using BouncyCastle as a provider) you should find the last keyAlias element:

    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);
    
    0 讨论(0)
  • 2020-12-05 07:39

    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
    
    0 讨论(0)
  • 2020-12-05 07:42

    I think it's easier to call Google's SecurityUtils directly, e.g.:

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

    It's one-line and you don't have to worry about aliasing.

    0 讨论(0)
提交回复
热议问题