在 App Engine 上哪里可以安全地保存 p12 文件?

2024-02-13

在 App Engine 上,我需要一个 p12 文件来创建签名 URL:

https://developers.google.com/storage/docs/accesscontrol#Signing-Strings https://developers.google.com/storage/docs/accesscontrol#Signing-Strings

Google 没有描述保留此文件的最佳做法。

可以使用WEB-INF目录来存放文件吗?然后它将成为源代码的一部分,并与打开它的密码保存在一起。

这里的最佳实践是什么?或者其他方法?

--

性能怎么样?一遍又一遍地加载文件是否有效? App Engine 是否会自动缓存跨调用(在同一实例上)的文件?或者我是否需要使用 servlet 加载一次文件,然后以某种方式将其保存在静态变量中?是否有更好的方法来实现此目的,例如将文件存储在数据存储记录中,然后将其保存在内存缓存中?这种方法有多安全?大概没什么好处吧?


特别是在 App Engine 中,文件存储存在许多不寻常的安全限制。我发现安全存储资源的最佳位置是使用捆绑包本身。如果您使用的是 appengine maven 骨架项目生成的默认 Maven 设置,这就像将文件放置在适当的资源目录中一样简单

一旦 p12 位于正确的位置,您需要使用类加载器的 GetResourceAsStream 函数加载它。然后,在构建 GoogleCredentials 时,不要使用记录的 setServiceAccountPrivateKeyFromP12File() 函数,而是使用 setServiceAccountPrivateKey() 函数并传入刚刚构建的 PrivateKey。

此外,您很可能不想在实时 Appengine 实例中使用任何此功能,因为 Appengine 已经为您提供了在这种情况下更易于使用的 AppIdentityCredentials 函数,因此您可能希望检测您的应用程序是否正在生产中模式,并且仅在使用 localhost 进行测试时使用 ServiceAccount。

将所有这些函数放在一起会产生以下对我有用的函数:

public static HttpRequestInitializer getDefaultCredentials() throws IOException
  {
      List<String> scopes = Arrays.asList(new String[] {DEVSTORAGE_FULL_CONTROL});
      if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production)
          return new AppIdentityCredential(scopes);
      else
      {

          GoogleCredential credential;

          try {
              String p12Password = "notasecret";

              ClassLoader classLoader = ServiceUtils.class.getClassLoader();

              KeyStore keystore = KeyStore.getInstance("PKCS12");
              InputStream keyFileStream = classLoader.getResourceAsStream("key.p12");

              if (keyFileStream == null){
                  throw new Exception("Key File Not Found.");
              }

              keystore.load(keyFileStream, p12Password.toCharArray());
              PrivateKey key = (PrivateKey)keystore.getKey("privatekey", p12Password.toCharArray());

              credential = new GoogleCredential.Builder()
                      .setTransport(HTTP_TRANSPORT)
                      .setJsonFactory(JSON_FACTORY)
                      .setServiceAccountId("[email protected] /cdn-cgi/l/email-protection")
                      .setServiceAccountPrivateKey(key)
                      .setServiceAccountScopes(scopes)
                      .build();
          } catch (GeneralSecurityException e) {
              e.printStackTrace();
              return null;
          } catch (Exception e) {
              e.printStackTrace();
              return null;
          }

          return credential;

      }

  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 App Engine 上哪里可以安全地保存 p12 文件? 的相关文章

随机推荐