我正在通过服务帐户使用Google Directory API,并且在创建服务帐户时收到了pkcs12
密钥。
Google确实支持两种不同的方式来使用此方法将密钥作为java.io.File
或java.security.PrivateKey
使用,对于PoC,我使用第一种方法创建GoogleCredential
对象使用{{ 1}},
java.io.File
它按预期工作但在我的实际用例中我不能依赖文件系统,所以我不能使用第一种方法。所以我想使用第二种方式实现实际用例,使用 GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(serviceAccountId)
.setServiceAccountScopes(Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_USER))
.setServiceAccountUser(serviceAccountUser)
.setServiceAccountPrivateKeyFromP12File(serviceAccountPrivateKeyFile)
.build();
并在完成时看起来像跟随。
java.security.PrivateKey
我的用例,我需要上传私钥并将其存储在base64编码的数据库中。现在我需要传递 GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(serviceAccountId)
.setServiceAccountScopes(Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_USER))
.setServiceAccountUser(serviceAccountUser)
.setServiceAccountPrivateKey(serviceAccountPrivateKey)
.build();
密钥的内容并创建pkcs12
对象。我认为第二个选项是最适合的方式,但找不到任何从上传密钥的base64编码内容创建java.security.PrivateKey的示例。
是否可以从Googlecredential
密钥的base64编码内容创建java.security.PrivateKey
对象?
或者还有其他方法来实现我的用例吗?
提前致谢
DarRay
答案 0 :(得分:0)
java.securty.KeyStore为load()方法接受任何InputStream,因此您可以使用获取.p12字节的任何方法来创建它。这是我使用的另一种方法。虽然这仍然使用.p12字节的文件,但您可以引入ByteArrayInputStream或任何InputStream子类:
private PrivateKey getPrivateKeyFromP12() {
// Google p12 files all have "notasecret" as the pass and "privatekey" as the PK name
String p12p = "notasecret"; // not cool! Change this before exporting your .p12
try {
KeyStore keystore = KeyStore.getInstance("PKCS12");
// This is where you'd adjust to bring in your .p12 bytes or chars
// as an input stream. Passwords are a char array!
keystore.load(
this.getClass().getClassLoader()
.getResourceAsStream("the.p12"),
p12p.toCharArray());
// This key name is fixed by Google, but could be changed
PrivateKey key = (PrivateKey) keystore.getKey("privatekey",
p12p.toCharArray());
return key;
} catch (Exception e) {
LOG.error("Exception while trying to obtain private key",e);
return null;
}
}