Java 将类路径中的.p12文件用于GoogleCredential

Java 将类路径中的.p12文件用于GoogleCredential,java,private-key,google-oauth,Java,Private Key,Google Oauth,我正在制作一个java命令行应用程序,它打包在一个JAR文件中,使用Google的一些API 我需要从私钥“Credentials.p12”设置GoogleCredential对象 现在我能够让它工作,但是文件“Credentials.p12”位于打包的JAR文件之外 如何使用JAR中的p12文件使其工作 因此,我认为我可以使用的唯一其他替代方法是使用PrivateKey对象的方法变量。我正在考虑使用InputStream从类路径获取p12文件: InputStream is = this.ge

我正在制作一个java命令行应用程序,它打包在一个JAR文件中,使用Google的一些API

我需要从私钥“Credentials.p12”设置GoogleCredential对象

现在我能够让它工作,但是文件“Credentials.p12”位于打包的JAR文件之外

如何使用JAR中的p12文件使其工作

因此,我认为我可以使用的唯一其他替代方法是使用PrivateKey对象的方法变量。我正在考虑使用InputStream从类路径获取p12文件:

InputStream is = this.getClass().getResourceAsStream("Credentials.p12");
我完全不知道该怎么做


在回答之前,请确保您有使用Google OAuth2库的经验。还有,请不要像将资源复制到临时文件那样进行黑客攻击:Credential.p12的单一版本应该出于某种原因留在JAR中。

在挖掘了
GoogleCredential.Builder
类源代码后,我意识到以下几点:

  • 由谷歌开发者生成的p12文件的密码 控制台总是
    “notasecret”
    以及别名的密码
  • 私钥的别名总是
    “privatekey”
使用以下代码从资源InputStream生成私钥:

KeyStore keystore = KeyStore.getInstance("PKCS12");
keystore.load(this.getClass().getClassLoader().getResourceAsStream("Credentials.p12"), "notasecret".toCharArray());
PrivateKey pk = (PrivateKey)keystore.getKey("privatekey", "notasecret".toCharArray());
我能够将私钥加载到GoogleCredential Builder中:

GoogleCredential credential = new GoogleCredential.Builder()
                    .setTransport(httpTransport)
                    .setJsonFactory(jsonFactory)
                    .setServiceAccountId("xxxxxx@developer.gserviceaccount.com")
                    .setServiceAccountScopes(Arrays.asList(DirectoryScopes.ADMIN_DIRECTORY_GROUP, DirectoryScopes.ADMIN_DIRECTORY_USER, DirectoryScopes.ADMIN_DIRECTORY_ORGUNIT))
                    .setServiceAccountUser(emailAccount)
                    .setServiceAccountPrivateKey(pk) //<----THIS
                    .build();
GoogleCredential-credential=new-GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.SetServiceAccounted(“xxxxxx@developer.gserviceaccount.com")
.setServiceAccountScopes(Arrays.asList(DirectoryScopes.ADMIN\u目录组、DirectoryScopes.ADMIN\u目录用户、DirectoryScopes.ADMIN\u目录组织单元))
.setServiceAccountUser(emailAccount)

.setServiceAccountPrivateKey(pk)/或者,您可以在实例化凭据时仅指定密钥文件

GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
            .setServiceAccountPrivateKeyFromP12File(new File(KEY_FILE_LOCATION))
            .setServiceAccountScopes(AnalyticsScopes.all())
            .build();

听起来不错,你只需要在这里替换FileInputStream,这是我遇到的另一个问题:我完全不知道google提供的p12文件的别名和密码是什么。。。更新:回答了我自己的问题,对p12文件的结构做了一些挖掘,并使用了@zapl建议。
GoogleCredential credential = new GoogleCredential.Builder()
            .setTransport(httpTransport)
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
            .setServiceAccountPrivateKeyFromP12File(new File(KEY_FILE_LOCATION))
            .setServiceAccountScopes(AnalyticsScopes.all())
            .build();