从 Java 中的 .p12 文件获取私钥对象

2022-09-01 11:19:09

正如标题所示,我有谷歌服务帐户API访问所需的.p12文件。为了获取连接到api的凭据,有一个字段.setServiceAccountPrivateKey(PrivateKey privateKey)。那么,我能做到的最简单方法是什么?我有一个资源文件夹,它位于我的类路径中,所以如果我在那里添加p12文件,我可以从getClass().getResource()获取资源作为输入流或URL。我已经尝试了URL方法,但它不起作用(我收到“URI不是分层的”错误,尝试从URL.toURI()创建文件对象)。


答案 1

您可以使用该方法加载 .p12 文件,将其加载到密钥库,然后他们从密钥库获取密钥。ClassLoader.getResourceAsStream(String)

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)从任何位置加载资源,前提是它们已经在类路径上,则无需指定文件的路径。

keyAlias是 p12 文件中与私钥对应的条目的名称。PKCS12文件可以包含多个条目,因此您需要一些方法来指示要访问的条目。别名是如何实现的。

如果您不确定私钥的别名是什么,则可以从命令行使用该实用程序列出 p12 文件的内容。此工具包含在所有 JRE 和 JDK 安装中。keytool

keytool -list -keystore keyFile.p12 -storepass password -storetype PKCS12

输出

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

答案 2

我认为直接调用Google的SecurityUtils更容易,例如:

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

它是一行的,您不必担心锯齿。


推荐