如何将Base64编码的pkcs12内容转换为java.security.PrivateKey?

时间:2014-04-23 18:45:13

标签: java google-api-java-client private-key google-admin-sdk pkcs#12

我正在通过服务帐户使用Google Directory API,并且在创建服务帐户时收到了pkcs12密钥。

Google确实支持两种不同的方式来使用此方法将密钥作为java.io.Filejava.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

1 个答案:

答案 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;
        } 

    }