现在开发一款手机应用,光做好界面和功能还不够。用户通过手机连接服务器时,数据传输的安全性成了硬性要求。比如你做的记账App,如果用户的消费记录在传输过程中被截取,后果可想而知。这时候,给后端服务配置SSL证书就成了必不可少的一环。
为什么必须配置SSL
安卓和iOS系统从几年前就开始强制要求应用使用HTTPS协议访问网络。如果你的服务还在用HTTP,App很可能直接连不上接口,甚至被系统拦截报错。用户看到“不安全连接”的提示,基本就会卸载了事。配置SSL证书,就是把HTTP升级成HTTPS,让数据加密传输,防止中间人攻击。
获取并部署SSL证书
目前很多云服务商提供免费的SSL证书,比如阿里云、腾讯云的DV类型证书,申请流程简单,几分钟就能签发。以Nginx服务器为例,申请到证书后你会拿到两个文件:一个.crt证书文件和一个.key私钥文件。
接着在服务器配置中加入SSL相关设置:
server {
listen 443 ssl;
server_name api.yourapp.com;
ssl_certificate /path/to/your/certificate.crt;
ssl_certificate_key /path/to/your/private.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
改完配置别忘了重启Nginx。然后在手机App里把请求地址从http://api.yourapp.com改成https://api.yourapp.com,再测试接口是否正常。
常见问题处理
有时候证书部署好了,App还是报SSL握手失败。这可能是证书链不完整导致的。解决办法是把CA提供的中间证书也合并到.crt文件里,顺序是:你的域名证书在前,中间证书在后。
还有一种情况是开发阶段想用自签名证书测试。这时候需要在App代码里临时允许不信任的证书,但上线前一定要去掉,否则会被平台审核拒绝。
比如在Android的OkHttp客户端中添加信任所有证书的逻辑(仅限测试):
<?java
// 仅用于测试环境
TrustManager[] trustAllCerts = new TrustManager[] {
new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {}
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, trustAllCerts, new java.security.SecureRandom());
OkHttpClient client = OkHttpClient.Builder().sslSocketFactory(sc.getSocketFactory(), (X509TrustManager)trustAllCerts[0]).hostnameVerifier((hostname, session) -> true).build();
?>
线上环境必须使用正规CA签发的证书,不能走捷径。
服务配置SSL证书配置不是一次性任务。证书通常有效期一年,快到期时得提前续签,不然App会突然无法联网。建议在项目文档里记下证书过期时间,或者用自动化工具监控。
把SSL配置当成和版本更新一样重要的日常维护,用户的隐私和体验才真正有保障。