{{item}}
{{item.title}}
{{items.productName}}
{{items.price}}/年
{{item.title}}
部警SSL证书可实现网站HTTPS加密保护及身份的可信认证,防止传输数据的泄露或算改,提高网站可信度和品牌形象,利于SEO排名,为企业带来更多访问量,这也是网络安全法及PCI合规性的必备要求
前往SSL证书移动App请求后端API时,HTTPS是保障数据传输安全的核心(防窃取、防篡改、防中间人攻击)。其安全基础依赖 “正确的HTTPS配置” 与 “严谨的证书信任机制”,但移动场景(iOS/Android 双端差异、自定义证书需求)易出现配置遗漏或信任失效问题。本文以 “简洁实操” 为核心,拆解双端HTTPS配置步骤、证书信任原理及常见问题解决方案。
HTTPS配置需覆盖 “网络库设置”“证书集成”“安全参数配置”,双端因系统特性略有差异,但核心逻辑一致。
1.1.1 基础配置:启用HTTPS并禁用不安全协议
Alamofire 默认支持HTTPS,需通过ServerTrustManager限制 TLS 版本(禁用 SSLv3、TLS1.0/1.1):
import Alamofire
// 1. 配置安全策略:仅允许TLS1.2/1.3
let serverTrustManager = ServerTrustManager(
evaluators: [
"api.yourdomain.com": PinnedCertificatesTrustEvaluator(
certificates: [
// 加载集成的API服务器证书(.cer格式)
Certificates.apiServer,
// 若用系统信任根证书,可省略此步,用DefaultTrustEvaluator()
],
acceptSelfSignedCertificates: false, // 禁用自签证书(生产环境)
performDefaultValidation: true, // 启用默认证书验证
validateHost: true // 验证证书绑定的域名与API域名一致
)
]
)
// 2. 创建网络会话
let session = Session(serverTrustManager: serverTrustManager)
// 3. 发起API请求
session.request("https://api.yourdomain.com/getData")
.responseJSON { response in
// 处理响应
}
1.1.2 证书集成:将API证书导入项目
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>api.yourdomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<false/> <!-- 强制HTTPS-->
</dict>
</dict>
</dict>
1.2.1 基础配置:构建安全的 OkHttpClient
Retrofit 依赖 OkHttpClient 实现HTTPS,需通过SSLSocketFactory配置证书信任:
import okhttp3.OkHttpClient
import retrofit2.Retrofit
// 1. 加载API服务器证书(res/raw目录下的api_server.cer)
val certificateFactory = CertificateFactory.getInstance("X.509")
val inputStream = context.resources.openRawResource(R.raw.api_server)
val certificate = certificateFactory.generateCertificate(inputStream)
// 2. 创建信任管理器:仅信任指定证书
val keyStore = KeyStore.getInstance(KeyStore.getDefaultType())
keyStore.load(null, null)
keyStore.setCertificateEntry("api_server", certificate)
val trustManagerFactory = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm()
)
trustManagerFactory.init(keyStore)
// 3. 配置TLS版本与安全套接字工厂
val sslContext = SSLContext.getInstance("TLSv1.3") // 优先TLS1.3
sslContext.init(null, trustManagerFactory.trustManagers, null)
// 4. 构建OkHttpClient
val okHttpClient = OkHttpClient.Builder()
.sslSocketFactory(sslContext.socketFactory, trustManagerFactory.trustManagers[0] as X509TrustManager)
.hostnameVerifier { hostname, session ->
// 验证域名:确保证书绑定域名与API域名一致(生产环境必开)
hostname == "api.yourdomain.com"
}
.build()
// 5. 配置Retrofit并发起请求
val retrofit = Retrofit.Builder()
.baseUrl("https://api.yourdomain.com/")
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
val apiService = retrofit.create(ApiService::class.java)
apiService.getData().enqueue(/* 回调处理 */)
1.2.2 证书集成:将证书放入资源目录
<uses-permission android:name="android.permission.INTERNET" />
移动App请求API时,证书信任遵循 “层级验证” 逻辑,核心是确认 “API服务器证书” 来自可信来源,分 “系统默认信任” 与 “自定义证书信任” 两种场景。
当API使用 “全球可信CA签发的证书”(如 DigiCert、Let's Encrypt)时,App 依赖系统预装的根证书信任:
(1)证书链传递:API服务器返回 “终端证书(API域名证书)+ 中间证书”,根证书已预装在 iOS/Android 系统中;
(2)验证流程:
当API使用 “自建CA签发的证书”(如内网 API、测试环境)时,需App手动信任自定义根证书:
1. 原因:API证书不是可信CA签发、证书链缺失、域名不匹配;
2. 解决:
1. 原因:Android 7.0 + 默认禁用用户证书信任;
2. 解决:在res/xml新建network_security_config.xml,配置信任自签证书:
<network-security-config>
<domain-config>
<domain includeSubdomains="true">api.yourdomain.com</domain>
<trust-anchors>
<certificates src="@raw/api_server" /> <!-- 自签证书 -->
</trust-anchors>
</domain-config>
</network-security-config>
并在AndroidManifest.xml中引用:
<application android:networkSecurityConfig="@xml/network_security_config">
1. 原因:iOS的ATS限制不安全连接;
2. 解决:在Info.plist中配置API域名的 ATS 例外(仅允许HTTPS),参考 1.1.2 步骤。
API服务器的SSL证书存在有效期(通常 1 年),证书更新时若处理不当,会导致已上线App无法正常请求 API。需从 “服务器平滑过渡” 与 “App 兼容策略” 两方面应对:
(1)双证书并行部署:在API服务器(如 Nginx、Apache)上同时部署 “旧证书” 与 “新证书”,配置优先使用新证书,旧证书作为备份(过渡期 1-2 周);
server {
listen 443 ssl;
server_name api.yourdomain.com;
# 新证书(优先)
ssl_certificate /etc/nginx/ssl/new_fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/new_private.key;
# 旧证书(备份,仅当新证书验证失败时使用)
ssl_certificate_backup /etc/nginx/ssl/old_fullchain.pem;
ssl_certificate_key_backup /etc/nginx/ssl/old_private.key;
}
(2)提前推送证书信息:通过App内 “证书更新预告接口”,在证书到期前 1 个月向App推送新证书的指纹信息,让App提前缓存,避免更新时验证失败。
(1)多证书信任配置:在App的HTTPS信任逻辑中,同时集成 “旧证书” 与 “新证书” 的指纹或完整证书,确保过渡期内App既能信任旧证书,也能识别新证书;
let serverTrustManager = ServerTrustManager(
evaluators: [
"api.yourdomain.com": PinnedCertificatesTrustEvaluator(
certificates: [
Certificates.oldApiServer, // 旧证书
Certificates.newApiServer // 新证书
],
acceptSelfSignedCertificates: false,
performDefaultValidation: true,
validateHost: true
)
]
)
(2)证书过期后的应急方案:若证书意外过期且未提前处理,可通过App热更新(如 iOS的 TestFlight、Android 的热修复框架 Tinker)快速推送包含新证书的配置包,无需重新提交应用商店审核,缩短故障时间。
基础HTTPS配置可能面临 “证书劫持” 风险(如攻击者伪造系统根证书信任的虚假证书),SSL Pinning(证书绑定)可通过 “App 仅信任预设的API证书”,彻底阻断此类攻击,适合金融、支付等高安全需求场景。
5.1.1 iOS端(Alamofire):证书指纹绑定
let serverTrustManager = ServerTrustManager(
evaluators: [
"api.yourdomain.com": PublicKeysTrustEvaluator(
publicKeys: [
// 提前获取API证书的SHA-256指纹(从CA或服务器获取)
PublicKey.sha256(for: Certificates.apiServer)
],
acceptSelfSignedCertificates: false,
performDefaultValidation: true,
validateHost: true
)
]
)
5.1.2 Android 端(OkHttp):证书哈希绑定
通过CertificatePinner绑定证书的 SHA-256 哈希,仅信任指定哈希的证书:
val okHttpClient = OkHttpClient.Builder()
.certificatePinner(CertificatePinner.Builder()
.add("api.yourdomain.com", "sha256/abc123...") // API证书的SHA-256哈希
.build())
.sslSocketFactory(sslContext.socketFactory, trustManager as X509TrustManager)
.hostnameVerifier { hostname, session -> hostname == "api.yourdomain.com" }
.build()
注意:证书更新时需同步更新哈希值,可通过热更新机制推送新哈希,避免重新发版。
风险 1:证书更新导致App失效:若证书更新后未同步更新App中的绑定信息,App 会因指纹不匹配拒绝信任新证书;
规避:提前规划证书更新周期,在更新前通过热更新推送新指纹,或采用 “多指纹绑定”(同时绑定新旧证书指纹)。
风险 2:Root / 越狱设备绕过 Pinning:Root 后的 Android 设备或越狱的 iOS设备可能通过工具(如 Xposed、Cydia Substrate)绕过 SSL Pinning;
规避:在App中加入 Root / 越狱检测,检测到风险环境时禁用敏感功能(如支付、转账),并提示用户使用安全设备。
除原生开发外,Flutter、React Native 等跨平台框架的HTTPS配置需结合框架特性,核心是 “复用原生信任逻辑” 或 “通过插件实现配置”。
Flutter 的dio插件支持HTTPS配置,需通过SecurityContext加载证书,本质是调用原生平台的 SSL 能力:
import 'dart:io';
import 'package:dio/dio.dart';
void initDio() async {
// 1. 加载证书(从assets目录读取)
ByteData certData = await rootBundle.load('assets/api_server.cer');
SecurityContext securityContext = SecurityContext(withTrustedRoots: false);
securityContext.setTrustedCertificatesBytes(certData.buffer.asUint8List());
// 2. 配置dio
Dio dio = Dio();
dio.httpClientAdapter = Http2Adapter(
ConnectionManager(
context: securityContext,
),
);
// 3. 发起请求
Response response = await dio.get('https://api.yourdomain.com/getData');
}
注意:需在pubspec.yaml中声明 assets 目录下的证书文件,确保打包时包含。
通过第三方插件react-native-ssl-pinning实现证书绑定,简化跨平台配置:
import { fetch } from 'react-native-ssl-pinning';
async function fetchData() {
try {
const response = await fetch('https://api.yourdomain.com/getData', {
method: 'GET',
// 配置证书名称(不含后缀)
sslPinning: {
certs: ['api_server'] // 对应api_server.cer
},
timeoutInterval: 10000
});
const data = await response.json();
} catch (error) {
console.error('HTTPS请求失败:', error);
}
}
HTTPS因 TLS 握手会增加请求延迟,尤其在移动网络(如 4G、弱网)下更明显,可通过以下优化提升性能:
TLS 会话复用允许App与API服务器在后续请求中复用已建立的 TLS 会话,无需重新握手,减少延迟:
HTTP/2 支持 “多路复用”(同一连接处理多个请求)和 “头部压缩”,可大幅提升HTTPS请求效率:
将API证书压缩为轻量级格式(如.der格式比.cer小 30%),并在App启动时提前加载证书到内存,避免请求时临时读取证书导致的延迟。
通过以上实践,可确保移动App请求API时的HTTPS通信 “安全、稳定、高效”,同时兼顾不同场景的兼容性与可维护性。
Dogssl.cn拥有20年网络安全服务经验,提供构涵盖国际CA机构Sectigo、Digicert、GeoTrust、GlobalSign,以及国内CA机构CFCA、沃通、vTrus、上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!