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
相关产品推荐
相关产品推荐

