You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Secrets Manager ColdFusion调用出现SSLHandshakeException问题排查

问题描述

原有Java程序直接运行可正常从AWS Secrets Manager获取密钥,打包成可运行Jar包在ColdFusion环境中使用时,此前一直正常,但近1个月开始抛出以下SSL握手错误:

javax.net.ssl.SSLHandshakeException: Could not generate secret

Unable to execute HTTP request: Could not generate secret

已尝试调整JVM信任库(cacerts)但未解决,需明确问题原因及可行排查方案。

附Java代码:

public static void main(String[] args) {
    GetSecretValue getval = new GetSecretValue();
    String v1 = getval.getSecretV1("Key", "secretsmanager.us-east-1.amazonaws.com", "us-east-4");
    System.out.println("Secret value1 :: " + v1);
}
public String getSecretV1(String secretName, String endpoint, String region) {
   
    AWSSecretsManager client = AWSSecretsManagerClientBuilder.standard()
        .withRegion(region)
        .build();

   
    String secret, decodedBinarySecret;
    GetSecretValueRequest getSecretValueRequest = new GetSecretValueRequest()
        .withSecretId(secretName);
    GetSecretValueResult getSecretValueResult = null;

    try {
        getSecretValueResult = client.getSecretValue(getSecretValueRequest);
    } catch (DecryptionFailureException e) {
        return "Error: Secrets Manager can't decrypt the protected secret text using the provided KMS key.";
    } catch (InternalServiceErrorException e) {
       return "Error: An internal service error occurred.";
    } catch (InvalidParameterException e) {
        return "Error: Invalid argument is passed.";
    } catch (InvalidRequestException e) {
        return "Error: Something is wrong with the input to the request. For example, a required parameter may be missing or out of range.";
    } catch (ResourceNotFoundException e) {
        return "Error: Secrets Manager can't find the specified secret.";
    } 
    catch (SdkClientException e) {
        return "SdkClientException Exception :"+e.getMessage() + " || Cause : "+ e.getCause();
    }catch (Exception e) {
        return "Exception :"+ e.getStackTrace();
    } 


    if (getSecretValueResult.getSecretString() != null) {
        secret = getSecretValueResult.getSecretString();
        JSONObject obj = new JSONObject(secret);
        String objectString = obj.getString((String) obj.names().get(0));
        return objectString;

    } else {
        ByteBuffer binarySecretData = getSecretValueResult.getSecretBinary();
        return "error";
    }

}
可能原因及排查方案

1. 代码中区域配置明显错误

代码调用getSecretV1时传入的区域是us-east-4,但AWS目前不存在这个区域(美国东部区域为us-east-1、us-east-2),且传入的端点是secretsmanager.us-east-1.amazonaws.com,区域与端点不匹配会导致客户端连接错误地址,直接引发SSL握手失败。

  • 解决:将代码中的us-east-4替换为实际使用的合法AWS区域(比如和端点匹配的us-east-1),重新打包Jar后在ColdFusion中测试。

2. AWS SDK版本过时,不支持TLS协议要求

AWS近年逐步淘汰TLS 1.0/1.1,强制使用TLS 1.2及以上版本。如果你的AWS Java SDK版本过老,可能缺少对TLS 1.2的支持,导致握手时密钥协商失败。

  • 排查:
    • 检查项目依赖的AWS SDK版本,升级到最新稳定版(AWS SDK for Java v1已进入维护阶段,建议迁移到v2)。
    • 确保打包的Jar包包含完整的最新SDK依赖,避免ColdFusion环境中旧版本SDK的冲突。

3. ColdFusion环境的JVM SSL配置问题

即使调整过cacerts,ColdFusion的JVM可能存在以下问题:

  • JVM信任库未包含AWS根CA证书,或证书已过期。
  • JVM被限制使用旧版TLS协议。
  • 排查:
    • 找到ColdFusion使用的JVM路径,检查该JVM的cacerts文件是否包含Amazon Root CA证书,若缺失则导入最新证书。
    • 在ColdFusion的JVM启动参数中添加-Dhttps.protocols=TLSv1.2,强制启用TLS 1.2,重启ColdFusion后测试。
    • 对比直接运行Java程序的JVM和ColdFusion的JVM配置(如Java版本、SSL相关系统参数),找出差异并调整。

4. 网络层面的SSL拦截或限制

所在环境的防火墙、代理服务器可能对SSL连接进行拦截或篡改,导致密钥协商过程失败。

  • 排查:
    • 在ColdFusion服务器上执行telnet secretsmanager.us-east-1.amazonaws.com 443或curl https://secretsmanager.us-east-1.amazonaws.com,测试网络连通性。
    • 确认环境是否启用了SSL inspection(中间人攻击),如果有,需将AWS Secrets Manager的域名加入白名单。

5. KMS密钥权限或配置变更

虽然Java程序直接运行正常,但ColdFusion环境使用的AWS凭证可能权限不足,或关联的KMS密钥配置变更:

  • 排查:
    • 确认ColdFusion运行时使用的AWS凭证(环境变量、IAM角色、配置文件)拥有kms:Decrypt权限,且权限范围覆盖Secrets Manager关联的KMS密钥。
    • 检查KMS密钥的状态是否为启用,密钥策略是否允许当前凭证访问。

内容的提问来源于stack exchange,提问作者Rikhi Sahu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:24:59