タイトルが示すように、GoogleサービスアカウントのAPIアクセスに必要な.p12ファイルがあります。 APIに接続するための資格情報を取得するために、フィールド.setServiceAccountPrivateKey(PrivateKey privateKey)があります。それで、私がこれを行うことができる最も簡単な方法は何ですか?クラスパスにあるリソースフォルダーがあるので、そこにp12ファイルを追加すると、getStream()。getResource()からinputStreamまたはURLとしてリソースを取得できます。 URLメソッドを試しましたが、機能しません(URL.toURI()からFileオブジェクトを作成しようとすると、「URIは階層的ではありません」というエラーが表示されます)。
GoogleのSecurityUtilsを直接呼び出す方が簡単だと思います。例:
PrivateKey privateKey = SecurityUtils.loadPrivateKeyFromKeyStore(SecurityUtils.getPkcs12KeyStore(), this.getClass().getResourceAsStream("keyFile.p12"), "notasecret", "privatekey", "notasecret")
これは1行であり、エイリアシングを心配する必要はありません。
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);
上記の提案はうまくいきませんでした。それから 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);
}
}
}