🙈 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:
1.3.2 验证服务器对RSA证书的支持
上节的server的配置中分别指定了RSA证书和国密证书,再验证一下服务器对RSA证书的支持。验证工具为分别为Chrome浏览器和curl。
使用Chrome浏览器访问server:
使用curl访问server:
1.3.3 后端upstream使用国密验证
NJet作反向代理访问后端国密upstream服务器。验证工具为分别为Chrome浏览器和curl。