web-dev-qa-db-ja.com

Javaの.p12ファイルからPrivateKeyオブジェクトを取得する

タイトルが示すように、GoogleサービスアカウントのAPIアクセスに必要な.p12ファイルがあります。 APIに接続するための資格情報を取得するために、フィールド.setServiceAccountPrivateKey(PrivateKey privateKey)があります。それで、私がこれを行うことができる最も簡単な方法は何ですか?クラスパスにあるリソースフォルダーがあるので、そこにp12ファイルを追加すると、getStream()。getResource()からinputStreamまたはURLとしてリソースを取得できます。 URLメソッドを試しましたが、機能しません(URL.toURI()からFileオブジェクトを作成しようとすると、「URIは階層的ではありません」というエラーが表示されます)。

28
gratsby

GoogleのSecurityUtilsを直接呼び出す方が簡単だと思います。例:

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

これは1行であり、エイリアシングを心配する必要はありません。

8
Robert Watts

getKey()からnullを取得する場合(たとえば、BouncyCastleをプロバイダーとして使用している場合)、最後の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);
4
Stocki

上記の提案はうまくいきませんでした。それから http://www.Java2s.com/Code/Java/Security/RetrievingaKeyPairfromaKeyStore.htm で試しましたが、うまくいきました。下に貼り付けてコピー

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);
    }
  }
}
2
sdm