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

使用自签名证书遇SSL握手等异常,HTTPS请求至Apache2转Django失败

解决Android向AWS Apache2转发Django的HTTPS请求SSL握手异常问题

看起来你在把Android端的HTTPS请求通过AWS上的Apache2转发到Django服务时,碰到了证书验证相关的SSLHandshakeException和CertPathValidatorException——之前HTTP正常,切HTTPS就出问题,大概率是证书信任链或者配置环节出了纰漏,我给你几个针对性的解决思路:


1. 先搞定生产环境最规范的证书配置(优先推荐)

如果是正式上线的服务,绝对不要用自签证书,先确保这几点:

  • 用受信任的CA颁发的证书(比如Let's Encrypt免费证书、AWS Certificate Manager的证书),Android系统默认信任这些CA的根证书。
  • 检查Apache的SSL配置,确保证书链完整:
    • 如果你用的是Apache 2.4.8及以上,用SSLCertificateFile指定主证书,SSLCACertificateFile指定中间证书文件;旧版本用SSLCertificateChainFile。
    • 可以用命令openssl s_client -connect your-domain:443检查证书链,输出里出现Verify return code: 0 (ok)就说明链是完整的。
  • 确保Apache反向转发时传递了HTTPS标识:在ProxyPass配置里加上RequestHeader set X-Forwarded-Proto "https",这样Django能识别到原始请求是HTTPS,避免内部重定向引发的证书问题。

2. 测试环境临时绕过证书验证(仅测试用!)

如果是本地/测试环境用自签证书,为了快速验证功能,可以在你的HurlStack里添加临时信任逻辑(生产环境绝对不能这么做,会有中间人攻击风险):

hurlStack = new HurlStack() {
    @Override
    protected HttpsURLConnection createConnection(URL url) throws IOException {
        HttpsURLConnection connection = (HttpsURLConnection) super.createConnection(url);
        try {
            // 创建信任所有证书的TrustManager
            TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                        return new java.security.cert.X509Certificate[]{};
                    }
                    @Override
                    public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
                    @Override
                    public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
                }
            };
            // 初始化SSL上下文
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
            // 给连接设置自定义SSLSocketFactory
            connection.setSSLSocketFactory(sslContext.getSocketFactory());
            // 关闭主机名验证(自签证书域名可能不匹配)
            connection.setHostnameVerifier((hostname, session) -> true);
        } catch (Exception e) {
            Log.e("HurlStack", "SSL配置失败", e);
        }
        return connection;
    }
};

3. 检查Android端的网络安全配置

如果你的App是Android 9(API 28)及以上,默认会限制明文HTTP,但HTTPS也需要确保域名被允许:

  • 在AndroidManifest.xml的<application>标签里添加:
    android:networkSecurityConfig="@xml/network_security_config"
    
  • 在res/xml/下创建network_security_config.xml:
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <domain-config cleartextTrafficPermitted="false">
            <domain includeSubdomains="true">你的AWS域名</domain>
            <!-- 如果是自签证书测试,添加下面的信任锚点 -->
            <!-- <trust-anchors>
                <certificates src="@raw/你的自签证书文件"/>
            </trust-anchors> -->
        </domain-config>
    </network-security-config>
    
    自签证书要放到res/raw目录下,格式为.crt。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:39:59