配置国密加密套件(如  `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扩展是否正确。

总的来说,配置国密加密套件是一项涉及底层密码库、证书体系和服务器配置的系统工程。希望以上步骤能帮助你顺利完成配置。