Java 如何调用ssl端点fon AWS Lambda函数
我有一个AWS Lambda函数,由Alexa命令触发。在每个Alexa命令上,我都希望调用一个外部API端点来执行所需的操作 我有一个调用API的jar,并且有下面的带有invokeCommand函数的externalService类。jar已作为依赖项添加到我的Java项目下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并抛出错误
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一样
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目录的资源中