【问题标题】:How to call ssl endpoint fon AWS Lambda function如何调用 AWS Lambda 函数的 ssl 端点
【发布时间】:2020-02-15 19:37:09
【问题描述】:

我有一个由 Alexa 命令触发的 AWS Lambda 函数。在每个 Alexa 命令上,我都想调用一个外部 API 端点来执行所需的操作。

我有一个调用 API 的 jar,并且有下面的 externalService 类和 invokeCommand 函数。该 jar 已添加为我的 Java 项目下的依赖项。

if(value.equals("something")) {
   externalService.invokeCommand();
   }

invokeCommand 调用受 SSL 证书保护的外部 API 并抛出错误

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

在 Elastic Beanstalk 中,我可以创建一个包含 Jar、Keystore 和 procfile 的 zip 文件夹,并且我可以在 procfile 中提供 keystore 作为参数,它将使用 keystore 运行 jar 并允许访问 SSL 安全端点。

if(value.equals("something")) {
   externalService.invokeCommand(); // error on AWS Lambda
   }

但是,我认为我不能对不允许我调用 SSL 安全端点的 Lambda 做同样的事情。

  • 有没有办法可以使用 trustStore 打包我的 jar?
  • 有没有办法在 AWS Lambda 中运行带有命令行选项的 jar,就像在 Elastic Beanstalk 中的 procfile 一样。

【问题讨论】:

  • forums.aws.amazon.com/… :“嗨,我们感谢您对 Lambda 的兴趣,并将将此视为功能请求。同时,也许您可​​以 fork/exec 并使用所需的信任库启动 jvm 进程?关于 Shashank "
  • 谢谢。虽然链接里的帖子是2016年的,不知道现在有没有实现。
  • 根据谷歌:还没有! ...但是,感谢前者:一篇博客文章可以准确处理您的问题/问题:medium.com/i-me-myself-naveen/… ..并提供两种可行的解决方案! (我查找了“aws lambda 信任库”)
  • 请发布您用于提出请求的代码。此外,您是否需要证书验证,或者只要您可以提出请求,您是否可以跳过该步骤?同时打印异常的完整堆栈跟踪。
  • 首先,SSL 证书不再免费 - 您需要与您的“外部 API”供应商讨论他们为什么无法安装真正的证书。其次,请参阅this post 中接受的答案 - 基本上自己处理证书。

标签: java amazon-web-services ssl aws-lambda ssl-certificate


【解决方案1】:

您也必须以编程方式创建信任库 请参阅下面的代码以供参考

        // Declare path of trust store and create file
        String trustStorePath = "/tmp/trust";
        // try creating above directory and path if you get error no such file 

        // Create Truststore using Key store api
        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

        // locate the default truststore
        String filename = System.getProperty("java.home")
                + "/lib/security/cacerts".replace('/', File.separatorChar);

        try (FileInputStream fis = new FileInputStream(filename)) {

            keyStore.load(fis, "changeit".toCharArray());
        }

        // Add Certificate to Key store
        CertificateFactory certF = CertificateFactory.getInstance("X.509");
        Certificate cert = certF.generateCertificate(new FileInputStream("your certificate path"));
        keyStore.setCertificateEntry("any alias", cert);

        // Write Key Store
        try (FileOutputStream out = new FileOutputStream(trustStoreFile)) {
            keyStore.store(out, "changeit".toCharArray());
        }

        // Set Certificates to System properties
        System.setProperty("javax.net.ssl.trustStore", trustStorePath);
        System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

您也可以在 aws lambda 上进行本地测试。 希望这能解决问题

  • 您可以将证书保存在 s3 中或保存在 lambda 目录的资源中

【讨论】:

    【解决方案2】:

    我相信一种选择是将证书打包到您的 Lambda 函数本身的 Jar/zip 中,这会将它们放在您的类路径中。一旦它们在您的类路径中,您就可以使用编程方式设置它们

        System.setProperty("javax.net.ssl.keyStore", KEYSTORE_FILE);
        System.setProperty("javax.net.ssl.keyStorePassword", KEYSTORE);
        System.setProperty("javax.net.ssl.keyStoreType", "JKS");
        System.setProperty("javax.net.ssl.trustStore", TRUSTSTORE_FILE);
        System.setProperty("javax.net.ssl.trustStorePassword", TRUSTSTORE);
        System.setProperty("javax.net.ssl.trustStoreType", "JKS");
    

    您将在哪里定义 KEYSTORE_FILE

    URL trustStoreResource = LdapConfig.class.getResource( "/keystore.jks" );
    String KEYSTORE_FILE= trustStoreResource.toURI().getPath();
    System.setProperty("javax.net.ssl.keyStore", KEYSTORE_FILE);
    

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 1970-01-01
      • 2022-01-19
      • 2022-01-14
      • 1970-01-01
      • 2018-10-03
      • 2021-04-13
      • 1970-01-01
      • 2021-12-17
      相关资源
      最近更新 更多