java - 如何调用 AWS Lambda 函数的 ssl 端点
问题描述
我有一个由 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 一样。
解决方案
您也必须以编程方式创建信任库 请参阅下面的代码以供参考
// 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 目录的资源中