国密支持_ssl 使用国密加密算法

By 李敏 2023-08-26

国密支持

1.1 功能说明

国密版OpenSSL库来使用SM2、SM3、SM4算法(以下简称为SM234算法). SM234算法使用双证书,包括签名证书和加密证书,这是国密支持在证书上的一个特点。同时,还要求使用的国密版OpenSSL兼容标准OpenSSL。 目前,铜锁国密NTLS支持HTTP和Stream。根据NJet的使用场景,国密支持的场景也细分为Server和反向代理两种场景。

1.2 配置说明

1.2.1 配置说明当NJet作为web server或stream server时,增加以下指令:

增加 ssl_ntls 指令,用于指定是否使用ntls。

Syntax:        ssl_ntls on | off;
Default:       -
Context:       http, server

修改 ssl_certificate 指令,可以配置一个或两个证书,当配置两个证书时,前一个是签名证书,后一个是加密证书。

Syntax:        ssl_certificate file [file];
Default:       —
Context:       http, server

修改 ssl_certificate_key 指令,可以配置一个或两个秘钥,当配置两个秘钥时,前一个是签名密钥,后一个是加密密钥。

Syntax:        ssl_certificate_key file [file];
Default:       —
Context:       http, server

1.2.2 NJet作为反向代理时,增加以下指令:

新增 proxy_ssl_ntls 指令,用于指定是否使用ntls。

Syntax:        proxy_ssl_ntls on | off;
Default:       -
Context:       http, server, location

修改 proxy_ssl_certificate 指令,可以配置一个或两个证书,当配置两个证书时,前一个是签名证书,后一个是加密证书。

Syntax:        proxy_ssl_certificate file [file];
Default:       —
Context:       http, server, location

修改 proxy_ssl_certificate_key 指令,可以配置一个或两个秘钥,当配置两个秘钥时,前一个是签名密钥,后一个是加密密钥。

Syntax:        proxy_ssl_certificate_key file [file];
Default:       —
Context:       http, server, location

NJet作为Server时国密支持需要增加双证书的配置:

server {
        listen       443 ssl;
        server_name  localhost;
        ssl_ntls     on;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        ssl_ciphers "ECC-SM2-SM4-CBC-SM3:ECDHE-SM2-WITH-SM4-SM3:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!RC4:!EXPORT:!DES:!3DES:!MD5:!DSS:!PKS";
        # 原RSA证书
        ssl_certificate         certs/rsa/rsa..crt.pem;
        ssl_certificate_key      certs/rsa/rsa..key.pem;
        ssl_ntls  on;
        # 国密支持添加的证书
        ssl_certificate         certs/sm2.aaaa.sig.crt.pem  certs/sm2.aaaa.enc.crt.pem;
        ssl_certificate_key     certs/sm2.aaaa.sig.key.pem  certs/sm2.aaaa.enc.key.pem;
        
        location / {
            root   html;
            index  index.html index.htm;
        }
      }

NJet作为反向代理时的配置: 配置示例:

http {
    server {
        listen                  443 ssl;
        server_name             example.com;

        ssl_ntls  on;
        ssl_certificate      certs/SS.crt     certs/SE.crt;
        ssl_certificate_key  certs/SS.key     certs/SE.key;

        ssl_verify_client       on;
        ssl_client_certificate  certs/CA.crt;

        location  / {
            return 200 "Welcome to tongsuo http server\n";
        }
    }

    server {
        listen       8081;
        server_name  server1;

        location / {
            proxy_ssl_ntls  on;

            proxy_ssl_verify on;
            proxy_ssl_trusted_certificate   certs/CA.crt;

            proxy_ssl_certificate      certs/CS.crt   certs/CE.crt;
            proxy_ssl_certificate_key  certs/CS.key    certs/CE.key;
            
            proxy_ssl_ciphers "ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3:RSA";

            proxy_pass https://127.0.0.1:443;
        }
    }
}

stream {
    server {
        listen      6443 ssl;

        ssl_ntls  on;
        ssl_certificate         certs/SS.crt  certs/SE.crt;
        ssl_certificate_key     certs/SS.key  certs/SE.key;

        return "welcome to tongsuo tcp server\n";
    }

    server {
        listen      6061;

        proxy_ssl on;

        proxy_ssl_verify on;
        proxy_ssl_trusted_certificate   certs/CA.crt;        

        proxy_ssl_ntls  on;
        proxy_ssl_certificate      certs/CS.crt   certs/CE.crt;
        proxy_ssl_certificate_key  certs/CS.key    certs/CE.key;

        proxy_ssl_ciphers "ECC-SM2-WITH-SM4-SM3:ECDHE-SM2-WITH-SM4-SM3:RSA";

        proxy_pass 127.0.0.1:6443;
    }
}

1.3 功能验证

1.3.1 验证服务器对国密的支持

验证工具为分别为360企业安全浏览器和gmcurl。

使用360企业安全浏览器访问server:

国密浏览器访问

使用gmcurl访问server:

gmcurl访问

1.3.2 验证服务器对RSA证书的支持

上节的server的配置中分别指定了RSA证书和国密证书,再验证一下服务器对RSA证书的支持。验证工具为分别为Chrome浏览器和curl。

使用Chrome浏览器访问server:

img

使用curl访问server:

img

1.3.3 后端upstream使用国密验证

NJet作反向代理访问后端国密upstream服务器。验证工具为分别为Chrome浏览器和curl。

img img