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

Android应用与Spring Boot REST服务器的HTTPS通信配置咨询

嘿,你已经搞定了密钥库和信任库的生成,这可是HTTPS配置的核心基础!接下来咱们一步步把Android和Spring Boot之间的加密通信打通,分服务器端和客户端两部分来操作:

一、Spring Boot 服务器端 HTTPS 配置

首先把你生成的keystore.jks放到Spring Boot项目的src/main/resources目录下(多模块项目就放到启动模块的resources里)。然后在配置文件里添加HTTPS相关参数:

如果用application.properties格式:

# 切换到HTTPS端口,默认8443
server.port=8443
# 指定密钥库路径
server.ssl.key-store=classpath:keystore.jks
# 密钥库密码(你生成时设的111111)
server.ssl.key-store-password=111111
# 密钥别名(你生成时设的localhost)
server.ssl.key-alias=localhost
# 密钥密码(和密钥库密码一致即可)
server.ssl.key-password=111111

如果用application.yml格式:

server:
  port: 8443
  ssl:
    key-store: classpath:keystore.jks
    key-store-password: 111111
    key-alias: localhost
    key-password: 111111

配置完启动服务器,用浏览器访问https://localhost:8443/你的接口路径,此时浏览器会提示“证书不安全”——这是自签名证书的正常现象,后续客户端配置信任库后就会解决这个问题。

二、Android 客户端 HTTPS 配置

你已经生成了truststore.jks,接下来把它放到Android项目的src/main/res/raw目录下(没有raw目录就新建一个),然后通过自定义SSLSocketFactory让App信任这个自签名证书。

1. 封装SSL工具类

创建一个SslUtils类,负责加载信任库并生成可用的SSLSocketFactory:

import android.content.Context;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.SecureRandom;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;

public class SslUtils {
    public static SSLSocketFactory getSslSocketFactory(Context context) {
        try {
            // 加载信任库
            KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
            InputStream inputStream = context.getResources().openRawResource(R.raw.truststore);
            trustStore.load(inputStream, "111111".toCharArray()); // 信任库密码
            inputStream.close();

            // 初始化信任管理器工厂
            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            trustManagerFactory.init(trustStore);

            // 构建SSLContext并返回SocketFactory
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
            return sslContext.getSocketFactory();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

2. 配置网络请求客户端(以Retrofit/OkHttp为例)

不管你用Retrofit还是直接用OkHttp,都需要把自定义的SSLSocketFactory配置到客户端里:

// 获取信任管理器(用于配置OkHttp)
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];

// 构建OkHttpClient
OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .sslSocketFactory(SslUtils.getSslSocketFactory(context), trustManager)
        .hostnameVerifier((hostname, session) -> {
            // 开发阶段可直接返回true,生产环境必须严格校验hostname
            return "localhost".equals(hostname) || "你的服务器公网IP/域名".equals(hostname);
        })
        .build();

// 如果用Retrofit,就把这个OkHttpClient传进去
Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://localhost:8443/") // 注意是https协议,端口和服务器配置一致
        .client(okHttpClient)
        .addConverterFactory(GsonConverterFactory.create())
        .build();

3. 权限配置

确保AndroidManifest.xml里添加了网络权限:

<uses-permission android:name="android.permission.INTERNET" />

Android 9及以上默认禁止HTTP请求,但咱们用的是HTTPS,所以不需要额外配置networkSecurityConfig。

三、常见问题排查
  • 服务器启动报错:检查keystore.jks的路径是否正确,密码、别名是否和生成命令一致。
  • 客户端抛出SSLHandshakeException:检查truststore.jks是否正确放入raw目录,密码是否匹配,hostnameVerifier的校验规则是否覆盖了服务器的IP/域名。
  • 生产环境建议:不要用自签名证书,改用CA颁发的正式证书,这样客户端不需要额外配置信任库,系统和浏览器会自动信任。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:12:41