java - 如何调用 AWS Lambda 函数的 ssl 端点

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

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

我有一个调用 API 的 jar,并具有以下带有 invokeCommand 函数的 externalService 类。该 jar 已作为依赖项添加到我的 Java 项目下。

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

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

PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径

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

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

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

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

最佳答案

您也以编程方式创建了信任库,请参阅下面的代码以供引用

        // 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 目录的资源中

关于java - 如何调用 AWS Lambda 函数的 ssl 端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58457063/

相关文章:

Java SSL 错误 403 禁止访问

PHP curl 错误 :error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure

java - 用 Java 签署 PKCS10 证书

java - 当实现 FAST 协议(protocol)(来自 FIX)时,我什么时候应该重置模板解析器?

amazon-web-services - AWS Config - MaxNumberOfDeliveryChannelsExceededException

amazon-web-services - Cloudformation KeyValuePair 列表作为参数

amazon-web-services - Cloudbreak的优势和局限性

java - 正则表达式 - 如何确保两个字符之间或从开始到某个字符之间仅出现 1 个字符实例

java - 为什么数组的最小值总是0?

iOS 到 Node.js 后端 SSL 握手失败