配置国密加密套件(如 `SM2-WITH-SMS4-SM3`)的核心在于替换底层密码库,因为主流的Web服务器和编程语言(如Nginx、OpenJDK)默认并不支持国密算法。目前主流的方案是使用GMSSL或Tongsuo(铜锁)等国密版OpenSSL分支。
下面以几种常见场景为例,介绍具体的配置方法。
一、通用配置原则
在开始具体配置前,有几个关键点需要了解:
1. 密码库是基础:必须将系统或应用依赖的OpenSSL替换为支持国密的版本(如GMSSL或Tongsuo)。
2. 双证书是必须:国密SSL(TLCP/NTLS)要求使用签名证书和加密证书两套独立的SM2证书,用途不同,不可混用。
签名证书:用于身份认证,Key Usage需包含 `digitalSignature`。
加密证书:用于密钥交换,Key Usage需包含 `keyEncipherment`。
3. 加密套件要精确:在配置中需显式指定国密加密套件,并建议将其置于优先位置。
二、Nginx 配置方法
Nginx官方版本不支持国密,需要重新编译。
1. 编译安装国密版Nginx
下载源码:下载Nginx源码和国密版OpenSSL(如GMSSL或Tongsuo)。
编译配置:在Nginx源码目录下,通过 `./configure` 指定国密库路径。
bash
./configure \
prefix=/usr/local/nginx \
with-http_ssl_module \
with-openssl=/path/to/gmssl # 指向国密OpenSSL源码目录
编译安装:执行 `make && make install`。
2. 配置 `server` 块
在Nginx配置文件中,关键配置项如下:
nginx
server {
listen 443 ssl;
server_name your-domain.com;
关键:开启国密支持(NTLS),Tongsuo专用
enable_ntls on;
1. 配置签名证书(标准指令)
ssl_certificate /path/to/your_domain_sign.crt;
ssl_certificate_key /path/to/your_domain_sign.key;
2. 配置加密证书(需通过额外方式加载,如 lua 模块或网关)
ssl_certificate_by_lua_block { ... } # 示例,非标准配置
3. 指定国密加密套件
ssl_ciphers ECDHE-SM4-SM3:SM4-SM3:TLS_SM4_SM3:TLS_SM4_SHA256;
ssl_prefer_server_ciphers on;
4. 配置协议版本
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
...
}
注意:`ssl_certificate` 和 `ssl_certificate_key` 指令仅用于签名证书。加密证书的加载方式较为复杂,通常需要借助 `nginx-gmssl` 模块或前置国密网关来实现。
三、Tomcat 配置方法
Tomcat本身基于Java,需要替换其JVM的加密提供者。
1. 准备工作
下载国密组件:从国密SSL实验室等网站下载 `gmssl_provider.jar` (Java国密提供者) 和 `gmssl4t.jar` (Tomcat国密组件)。
部署JAR包:
将 `gmssl_provider.jar` 放入 `$JAVA_HOME/jre/lib/ext/` 目录。
将 `gmssl4t.jar` 放入Tomcat的 `lib/` 目录。
配置JRE策略:确保JRE使用无限制的加密策略,编辑 `$JAVA_HOME/jre/lib/security/java.security` 文件,设置 `crypto.policy=unlimited`。
2. 配置 `server.xml`**
在Tomcat的 `conf/server.xml` 文件中,配置支持国密的 `Connector`:
xml
<Connector port="3443" protocol="HTTP/1.1" SSLEnabled="true"
sslImplementationName="cn.gmssl.tomcat.GMSSLImplementation"
sslProtocol="GMSSLv1.1"
keystoreFile="/path/to/your/keystore.pfx"
keystoreType="PKCS12"
keystorePass="your_password" />
`sslImplementationName`:指定为国密的Tomcat实现类。
`sslProtocol`:设置为 `GMSSLv1.1`。
`keystoreFile`:指向包含SM2双证书和私钥的密钥库文件(如PFX格式)。
四、Java 应用配置方法
对于非Tomcat的Java应用,可通过在代码中引入国密Provider来使用国密算法。
引入依赖:在项目中添加支持国密的Provider库,如腾讯的 KonaCrypto、Bouncy Castle 或 GMSSL Provider。
代码中注册Provider:
java
import java.security.Security;
// 假设使用 KonaCrypto
Security.addProvider(new com.tencent.kona.crypto.KonaCryptoProvider());
// 之后即可使用 "SM2", "SM3", "SM4" 等算法名称
五、其他场景配置要点
Apache HTTP Server:与Nginx类似,需替换为支持国密的OpenSSL(如GMSSL)并重新编译。
CDN/全站加速:在服务商控制台开启国密HTTPS功能,并上传签名和加密两张SM2证书。
数据库:如达梦(Dameng)、金仓(Kingbase)等数据库,需使用其支持GMSSL的特定版本,并在客户端进行相应配置。
六、验证与测试
配置完成后,可以通过以下方式验证:
1. 检查Nginx版本:执行 `nginx -V 2>&1 | grep -o 'OpenSSL [^ ]*'`,输出应包含 `gm` 或 `tongsuo` 等字样。
2. 使用国密浏览器访问:使用奇安信可信浏览器、密信浏览器等支持国密的浏览器访问你的网站,查看是否成功建立国密连接。
3. 查看加密套件:在浏览器开发者工具的安全选项卡中,查看连接所使用的加密套件是否为 `SM2-WITH-SMS4-SM3` 或类似的国密套件。
常见问题
编译错误:编译Nginx时遇到 `ssl.h` 错误,可能需要手动修改Nginx的 `auto/lib/openssl/conf` 文件,确保正确包含国密库的头文件和库文件路径。
握手失败:国密TLS握手失败,最常见的原因是密码库替换不彻底或证书类型/用途不匹配。请严格检查Nginx链接的OpenSSL库路径,并确认签名证书和加密证书的Key Usage扩展是否正确。
总的来说,配置国密加密套件是一项涉及底层密码库、证书体系和服务器配置的系统工程。希望以上步骤能帮助你顺利完成配置。