Java 如何调用ssl端点fon AWS Lambda函数

Java 如何调用ssl端点fon AWS Lambda函数,java,amazon-web-services,ssl,aws-lambda,ssl-certificate,Java,Amazon Web Services,Ssl,Aws Lambda,Ssl Certificate,我有一个AWS Lambda函数,由Alexa命令触发。在每个Alexa命令上,我都希望调用一个外部API端点来执行所需的操作 我有一个调用API的jar,并且有下面的带有invokeCommand函数的externalService类。jar已作为依赖项添加到我的Java项目下 if(value.equals("something")) { externalService.invokeCommand(); } invokeCommand调用受SSL证书保护的外部API并抛出错误

我有一个AWS Lambda函数,由Alexa命令触发。在每个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文件夹,我可以在procfile中提供Keystore作为参数,该参数将使用Keystore运行Jar,并允许访问受SSL保护的端点

if(value.equals("something")) {
   externalService.invokeCommand(); // error on AWS Lambda
   }
然而,我不认为我可以对Lambda做同样的事情,因为Lambda不允许我调用SSL安全端点

if(value.equals("something")) {
   externalService.invokeCommand(); // error on AWS Lambda
   }
  • 有没有一种方法可以将我的罐子打包到trustStore中
  • 有没有一种方法可以在AWS Lambda中使用命令行选项运行jar,就像弹性Beanstalk中的procfile一样

我认为一种选择是将证书打包到用于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\u文件,如

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

您也可以通过编程方式创建信任库,请参见下面的代码以供参考

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

:“你好,我们很欣赏你对LAMBDA的兴趣,我会把它看作是一个特性请求。同时,你可以用Fuff/Excel来启动一个JVM进程。虽然链接中的帖子是2016年发布的,但我想知道现在是否已经实施了。。。但是,多亏了前者:一篇博客文章准确地处理了您的问题:……并提供了两种有效的解决方法!(我查阅了“aws lambda truststore”)请发布您用于发出请求的代码。另外,您是否需要证书验证,或者只要您可以提出请求,您是否可以跳过该步骤?还可以打印异常的完整堆栈跟踪。首先,SSL证书不再是免费的-您需要与“外部API”供应商谈谈为什么他们无法安装真正的证书。第二,在中查看已接受的答案-基本上自己处理证书。