Я использую API каталога Google через учетную запись службы, и я получил ключ pkcs12
при создании учетной записи службы.
Google поддерживает два разных способа использования этого, принимая ключ как java.io.File
или java.security.PrivateKey
и для PoC, я использовал первый способ создания объекта GoogleCredential
с помощью 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
и будет выглядеть следующим, когда это будет сделано.
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(serviceAccountId)
.setServiceAccountScopes(Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_USER))
.setServiceAccountUser(serviceAccountUser)
.setServiceAccountPrivateKey(serviceAccountPrivateKey)
.build();
В моем случае использования, я должен сделать возможным загрузить закрытый ключ и сохранить его в базе данных с кодировкой base64. Теперь мне нужно передать это содержимое ключа pkcs12
и создать объект Googlecredential
. Для этого я думаю, что второй вариант наиболее подходит, но не смог найти какой-либо пример для создания java.security.PrivateKey из кодированного содержимого base64 загруженного ключа.
Возможно ли создать объект java.security.PrivateKey
из кодированного base64 содержимого ключа pkcs12
?
Или есть какой-то другой способ для достижения моего удобства?
заранее спасибо
DArray
java.securty.KeyStore использует любой метод InputStream для метода load(), поэтому вы можете создать его, используя любой способ получения байтов.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;
}
}