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

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应用的网络安全配置,允许信任用户证书:
      1. 在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>
        
      2. 在AndroidManifest.xml的<application>标签添加配置:
        android:networkSecurityConfig="@xml/network_security_config"
        
      3. 重新编译打包应用后安装到设备

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:20:37