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

如何手动复现并验证K8s调用自签名证书API的主机名验证失败问题

问题解答

1. 能否用curl/wget复现"hostname verify failed"错误?

可以复现,但需要强制开启SSL证书与主机名的严格校验(默认情况下部分环境的curl/wget会宽松处理)。具体命令如下:

  • curl复现命令:
    curl -v --ssl-reqd --cert-status https://<新API域名>
    
    如果你的Java密钥库使用了自定义CA证书,需要先将其导出为PEM格式,再用以下命令校验:
    curl -v --cacert <导出的CA证书.pem> https://<新API域名>
    
    若证书的SAN/CN字段与请求域名不匹配,curl会返回类似SSL: certificate subject name '<证书域名>' does not match target host name '<请求的API域名>'的错误,和Java抛出的"hostname verify failed"本质一致。
  • wget复现命令:
    wget --secure-protocol=TLSv1_2 --no-check-certificate=no https://<新API域名>
    
    主机名不匹配时,会抛出ERROR: The certificate of '<新API域名>' is not trusted.或明确的主机名不匹配提示。

2. 错误中包含IAM服务URL的可能原因

  • 应用调用新API前可能需要通过AWS IAM做身份验证(比如SigV4签名),签名过程中请求了IAM元数据服务或STS服务,这些请求触发了SSL校验问题。
  • 新API的后端逻辑需要调用IAM服务,但应用在代理或转发请求时,错误地将IAM的URL纳入了SSL校验流程,或者IAM服务的证书未被Java密钥库信任。

调试建议

  • 直接用curl/wget请求IAM相关URL(比如http://169.254.169.254/latest/meta-data/或STS端点),排查是否存在SSL问题(注意:EC2元数据服务默认是HTTP,若环境强制用HTTPS代理访问则可能触发校验)。
  • 用keytool -list -keystore <你的密钥库文件>查看密钥库条目,确认新API的证书(含完整CA链)已正确导入,且证书的SAN字段包含请求的API域名。
  • 在K8s同命名空间运行带Java环境的调试容器,用简单代码模拟应用调用逻辑,更容易复现原生错误:
    import java.net.URL;
    import javax.net.ssl.HttpsURLConnection;
    
    public class HttpsTest {
        public static void main(String[] args) throws Exception {
            URL url = new URL("https://<新API域名>");
            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setRequestMethod("GET");
            System.out.println("Response Code: " + conn.getResponseCode());
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:30:37