融云根证书系统更新指南
本文档旨在指导融云服务的开发者完成根证书的强制性安全升级。为确保服务的连续性和安全性,请您仔细阅读并遵循本文中的步骤进行操作。
升级概要
升级信息类别 | 详细说明 |
---|---|
当前根证书状态 | DigiCert Global Root CA |
过渡期证书状态 | DigiCert Global Root CA & DigiCert Global Root G2 交叉证书 |
最终根证书状态 | DigiCert Global Root G2 |
升级性质 | 强制性安全升级 |
影响范围 | 所有使用融云 SSL 证书的域名交互 |
关键影响 | 业务中断风险:未在规定时间内完成升级,将导致 G1 及交叉证书失效。届时,所有依赖融云服务的系统将无法建立安全的 TLS 连接,并返回证书握手错误。 |
重要时间节点 | 2025 年 04 月起:融云新签发的证书将使用 G1 与 G2 的交叉证书,以同时兼容 G1 和 G2 两种根证书。 2027 年 12 月起:融云新签发的证书将全面切换为 G2 根证书。 |
为何需要升级?
- Mozilla 政策变更:
Mozilla 将于 2026 年 4 月 15 日起,在其信任库中移除对
DigiCert Global Root CA
(G1) 根证书的信任。 - DigiCert 官方策略:
为响应 Mozilla 的政策并遵循行业安全标准,证书颁发机构 DigiCert 将全面停用旧的 G1 根证书体系,并切换至新的
Digicert Global Root G2
体系。 - 行业安全趋势: 本次升级是全行业范围内的强制性安全合规要求。新的 G2 根证书使用更安全的 SHA256 签名算法,以提升整体网络环境的安全性。
升级工作安排
自 2025 年起,融云服务器证书的颁发根 CA 将从 Digicert Global Root CA
(G1) 变更为 G1 和 G2 共存的交叉证书,以确保在过渡期间服务的平稳运行。2027 年底后,将逐步替换为仅 G2 证书。
为避免服务中断,使用融云服务的开发者必须仔细阅读本指南,并完成相应的环境验证与修正。
您需要做什么?
- 检查环境兼容性:大多数现代操作系统和运行时环境已默认内置
DigiCert Global Root G2
根证书,无需额外操作。 - 识别潜在风险:如果 您的服务器、客户端或代码中硬编码了对旧 G1 根证书的信任,则会受到影响。您必须移除此类限制,改用系统的默认信任库进行验证。
- 确保 G2 证书存在:请确保您运行环境的信任库中包含
DigiCert Global Root G2
根证书。
G2 根证书兼容性
新的 G2 根证书体系采用 SHA256 签名算法,兼容当前主流的操作系统和移动设备。各平台的最低兼容版本如下:
平台 | OS/浏览器 | G1 根证书最低版本 | G2 根证书最低版本 |
---|---|---|---|
Microsoft | Internet Explorer Microsoft Edge Google Chrome | Windows XP SP3+ | Windows XP SP3+ |
Apple | Safari/Chrome for Mac OS X | Mac OS X 10.6+ | Mac OS X 10.10+ |
Safari/Chrome for iOS | iOS 4.0+ | iOS 7.0+ | |
Mozilla | Firefox | Firefox 2+ NSS 3.11.8 | Firefox 32+ NSS 3.16.3 |
Android | Android 1.1+ | Android 5.0+ | |
Oracle | Java | JRE 1.4.2_17+ | JRE 1.8.0_131+ |
如何升级?
步骤 1:获取新根证书
如果您的环境缺少 G2 根证书,请从以下链接下载,并根据您的具体环境导入和适配。
- PEM 格式:https://cacerts.digicert.com/DigiCertGlobalRootG2.crt.pem
- DER 格式:https://cacerts.digicert.com/DigiCertGlobalRootG2.crt
步骤 2:更新您的环境
以下是针对不同开发环境的升级方案。
- Java
- PHP
- Python
- .NET
选择以下任一方式:
- 升级 JDK (推荐):将 JDK 升级到
1.8.0_131
或更高版本,其内置的信任库已包含 G2 根证书。 - 手动导入证书:将下载的 G2 根证书导入到 Java 的系统证书库 (
cacerts
)。shkeytool -keystore $JAVA_HOME/lib/security/cacerts -importcert -alias DigiCertGlobalRootG2 -file DigiCertGlobalRootG2.crt.pem -storepass changeit
- 代码中指定信任库:
Java
System.setProperty("javax.net.ssl.trustStore", "/path/to/your/custom/truststore");
System.setProperty("javax.net.ssl.trustStorePassword", "password");
选择以下任一方式:
- 升级系统证书库 (推荐):
sh
# Debian/Ubuntu
sudo apt-get update && sudo apt-get install -y ca-certificates
# CentOS/RHEL
sudo yum update -y ca-certificates - 在 cURL 中指定证书:
PHP
$curl = curl_init();
curl_setopt($curl, CURLOPT_CAINFO, "/path/to/DigiCertGlobalRootG2.crt.pem"); - 手动添加证书到信任链:
下表列出了不同 Linux 发行版中常见的根证书库位置:sh
cat DigiCertGlobalRootG2.crt.pem >> /etc/ssl/certs/ca-certificates.crt
操作系统类型 信任根证书库位置 添加方法 Linux /etc/ssl/certs/
拷贝根证书文件 ( .pem
) 到该目录Linux /etc/pki/tls/certs/ca-bundle.crt
cat DigiCertGlobalRootG2.crt.pem >> /etc/pki/tls/certs/ca-bundle.crt
Linux /etc/ssl/certs/ca-bundle.crt
cat DigiCertGlobalRootG2.crt.pem >> /etc/ssl/certs/ca-bundle.crt
Unix /System/Library/OpenSSL/
拷贝根证书文件 ( .pem
) 到该目录
导入证书到 Windows 证书存储中。下载 DER 格式的证书,双击并将其安装到“受信任的根证书颁发机构”存储区。
选择以下任一方式:
- 升级系统根证书库 (推荐):确保操作系统的根证书库已是最新。
- 在代码中指定证书:
python
import requests
response = requests.get('YOUR_API_ENDPOINT', verify='/path/to/DigiCertGlobalRootG2.crt.pem') - 创建自定义 SSL 上下文:
python
import ssl
context = ssl.create_default_context(cafile="/path/to/DigiCertGlobalRootG2.crt.pem")
如何验证?
融云提供了一个专用于 G2 证书测试的页面:https://g2-test.rong-api.com
。
如果您的客户端能与此页面正常建立 SSL 连接,则表明您的环境已支持 G2 根证书。
您可以使用以下代码示例进行验证。
- Java
- PHP
- Python
将以下代码保存为 SSLCertificateChecker.java
文件:
Java
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLHandshakeException;
import javax.net.ssl.SSLSocketFactory;
import java.io.IOException;
import java.net.URL;
public class SSLCertificateChecker {
public static void main(String[] args) {
String url = "https://g2-test.rong-api.com";
if (args.length > 0) {
url = args[0];
}
System.out.println("Testing connection to: " + url);
checkCertificate(url);
}
public static void checkCertificate(String urlString) {
try {
URL url = new URL(urlString);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
connection.connect();
int responseCode = connection.getResponseCode();
System.out.println("SUCCESS: Connection successful. Response Code: " + responseCode);
} catch (SSLHandshakeException e) {
System.err.println("FAILURE: SSL Handshake failed. Your environment may not trust the G2 root certificate.");
e.printStackTrace();
} catch (IOException e) {
System.err.println("ERROR: An I/O error occurred.");
e.printStackTrace();
}
}
}
然后通过以下命令编译并运行:
sh
javac SSLCertificateChecker.java
java SSLCertificateChecker
创建一个 PHP 文件并执行,以验证连接。
PHP
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
function test_connection($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo "FAILURE: cURL connection failed: " . curl_error($ch) . "\n";
} else {
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "SUCCESS: cURL connection successful. HTTP Code: " . $http_code . "\n";
}
curl_close($ch);
}
echo "Testing connection to https://g2-test.rong-api.com...\n";
test_connection('https://g2-test.rong-api.com');
?>
将以下代码保存为 check_cert.py
并运行:
python
import ssl
import socket
import sys
import requests
from requests.exceptions import SSLError
def test_connection(url):
print(f"--- Testing with requests library ---")
try:
response = requests.get(url, timeout=5)
print(f"SUCCESS: Connection successful. Status code: {response.status_code}")
except SSLError as e:
print(f"FAILURE: SSL Error with requests. Your environment may not trust the G2 root certificate.\n{e}")
except Exception as e:
print(f"ERROR: An unexpected error occurred: {e}")
print(f"\n--- Testing with ssl library ---")
try:
hostname = url.split('//')[1]
context = ssl.create_default_context()
with socket.create_connection((hostname, 443)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
print("SUCCESS: SSL certificate is trusted.")
# print("Certificate details:", ssock.getpeercert())
except ssl.SSLError as e:
print(f"FAILURE: SSL Error with ssl library. Your environment may not trust the G2 root certificate.\n{e}")
except Exception as e:
print(f"ERROR: An unexpected error occurred: {e}")
if __name__ == "__main__":
test_url = "https://g2-test.rong-api.com"
if len(sys.argv) > 1:
test_url = sys.argv[1]
print(f"Starting certificate validation for: {test_url}\n")
test_connection(test_url)
print("\nValidation finished.")
通过以下命令运行脚本:
sh
python check_cert.py
根证书指纹
如果您需要手动验证根证书的真实性,请核对以下指纹信息。数据来源于 DigiCert 官网。
DigiCert Global Root G2
- SHA-1:
DF:3C:24:F9:BF:D6:66:76:1B:26:80:73:FE:06:D1:CC:8D:4F:82:A4
- SHA-256:
CB:3C:CB:B7:60:31:E5:E0:13:8F:8D:D3:9A:23:F9:DE:47:FF:C3:5E:43:C1:14:4C:EA:27:D4:6A:5A:B1:CB:5F
DigiCert Global Root CA (旧版)
- SHA-1:
A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36
- SHA-256:
43:48:A0:E9:44:4C:78:CB:26:5E:05:8D:5E:89:44:B4:D8:4F:96:62:BD:26:DB:25:7F:89:34:A4:43:C7:01:61
后续步骤
- 环境验证:按照本文档的指导,在您的测试或预生产环境中完成升级与验证。
- 生产部署:确认测试无误后,在生产环境中实施相同的变更。
- 持续监控:部署后,请密切关注应用日志,确保无 SSL/TLS 相关错误。
验证成功标准:您的系统能够与融云服务器正常建立 HTTPS 连接,无任何证书相关错误,且业务功能一切正常。