Android端Rocket.Chat自签名CA部署证书信任问题求助
Android 端部署基于自签名CA的Rocket.Chat 问题排查与解决方案
核心问题分析
Android 7.0+ 系统默认不再信任用户级安装的CA证书,仅信任系统级证书;另外你的证书生成流程可能存在SAN扩展配置不全、证书安装方式不对的问题,导致Chrome和Rocket.Chat应用无法验证证书链。
修复步骤
1. 修正CA与服务器证书生成脚本
现有脚本基础上补充细节,确保证书符合现代SSL验证要求:
###################### # 生成自签名CA ###################### # 生成CA私钥(可选去掉-des3,避免后续签名时重复输入密码) openssl genrsa -out myCA.key 2048 # 生成CA根证书,填写明确的CA标识信息 openssl req -x509 -new -nodes -key myCA.key -sha256 -days 825 -out myCA.pem \ -subj "/CN=Shipboard Root CA/O=Vessel IT Dept/C=CN" ###################### # 生成CA签名的Rocket.Chat服务器证书 ###################### # 替换为实际域名或船舶内网IP TARGET=rocketchat # 生成服务器私钥 openssl genrsa -out $TARGET.key 2048 # 生成证书请求,CN与后续SAN保持一致 openssl req -new -key $TARGET.key -out $TARGET.csr \ -subj "/CN=$TARGET/O=Vessel Services/C=CN" # 创建扩展配置文件,必须包含SAN(域名/IP),现代应用不再单独信任CN >$TARGET.ext cat <<-EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment subjectAltName = @alt_names [alt_names] DNS.1 = $TARGET # 如果用IP访问,取消下方注释并替换为实际IP # IP.1 = 192.168.1.100 EOF # 签名生成服务器证书 openssl x509 -req -in $TARGET.csr -CA myCA.pem -CAkey myCA.key -CAcreateserial \ -out $TARGET.crt -days 825 -sha256 -extfile $TARGET.ext
2. Android 端CA证书安装要点
- 格式无需转换:直接将
myCA.pem重命名为myCA.crt,Android原生支持PEM格式证书 - 安装位置选择:
- Android 7+ 必须将证书安装到系统证书存储(路径:设置 → 安全 → 加密与凭据 → 安装证书 → CA证书 → 选择存储位置为「系统」,需验证锁屏密码)
- 若设备无法安装到系统存储,需修改Rocket.Chat应用的网络安全配置,允许信任用户证书:
- 在Rocket.Chat Android项目中创建
res/xml/network_security_config.xml:<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config> <trust-anchors> <certificates src="system" /> <certificates src="user" /> </trust-anchors> </base-config> </network-security-config> - 在
AndroidManifest.xml的<application>标签添加配置:android:networkSecurityConfig="@xml/network_security_config" - 重新编译打包应用后安装到设备
- 在Rocket.Chat Android项目中创建
3. Nginx SSL配置补充完善
确保Nginx返回完整的证书链,并启用合规的SSL协议:
server { listen 443 ssl; server_name rocketchat; # 替换为你的域名/IP ssl_certificate /etc/nginx/certs/rocketchat.crt; ssl_certificate_key /etc/nginx/certs/rocketchat.key; # 配置信任的CA根证书,用于OCSP stapling(可选但推荐) ssl_trusted_certificate /etc/nginx/certs/myCA.pem; # 启用安全的SSL协议与加密套件 ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; # 可选:OCSP stapling优化证书验证速度 ssl_stapling on; ssl_stapling_verify on; # Rocket.Chat反向代理配置(省略其他常规配置) location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
4. 证书链有效性验证
用ADB连接Android设备,执行以下命令验证证书链是否正常:
adb shell echo | openssl s_client -connect rocketchat:443 -CAfile /sdcard/myCA.crt
若输出末尾显示Verify return code: 0 (ok),说明证书链验证通过。
成功部署的通用经验
船舶环境中已有大量成功案例,核心注意事项:
- 必须为服务器证书添加SAN扩展(域名/IP),仅靠CN字段在现代应用中会被拒绝
- Android 7+ 优先将CA证书安装到系统存储,避免修改应用配置的麻烦
- 确保Nginx配置中使用完整的证书链,避免客户端无法追溯到信任的CA根证书
内容的提问来源于stack exchange,提问作者user1407764
相关产品推荐
相关产品推荐

