目录
1.1 缘起
haproxy作为开源高性能http/tcp代理服务器得到了广泛应用,它可以支持国际ssl加密通信功能,但是对于国密ssl却一直没有被官方得到支持。随着国密标准规范的推广应用,以及等保2.0明确规定要求对网络通信中的报文或会话过程全文加密(三级),这样导致在haproxy在国内的很多业务场景中不符合等保要求而不能使用。因此有必要对haproxy进行国密ssl功能支持进行改造。
铜锁/Tongsuo是由阿里巴巴基于openssl,衍生开发并开源的同时能够提供国际ssl和国密ssl的一个提供现代密码学算法和安全通信协议的开源基础密码库,为存储、网络、密钥管理、隐私计算等诸多业务场景提供底层的密码学基础能力,实现数据在传输、使用、存储等过程中的私密性、完整性和可认证性,为数据生命周期中的隐私和安全提供保护能力。
本文描述了基于铜锁加密库,为haproxy添加国密ssl的加密传输能力的修改方法以及对应的测试环境搭建和测试方法。
2 环境搭建
2.1 测试环境准备
为了支持测试国密测试,首先需要准备测试的客户端工具和web服务器。
-
测试工具:支持国密ssl的curl
国密curl下载链接
直接下载linux版本的二进制文件,经测试在ubuntu 22.04中直接可以用。 -
支持国密ssl的nginx web服务器
国密nginx下载链接
从以上地址下载源码后根据文档自行编译部署。
最新版本的tengine需要修改一下configure:
./configure --prefix=/opt/nginx \
--add-module=modules/ngx_tongsuo_ntls \
--with-openssl=../Tongsuo \ # 铜锁的源码目录
--with-openssl-opt='enable-ntls' \
--with-http_ssl_module \
--with-stream \
--with-stream_ssl_module \
--with-stream_sni
然后直接进行编译安装 make & make install
复制国密nginx下载链接中的证书文件并保存到对应的文件中:
CA.cert.pem
SE.cert.pem
SE.key.pem
SS.cert.pem
SS.key.pem
test_ecc.crt
test_ecc.key
test_rsa.crt
test_rsa.key
配置nginx.conf文件
# http服务
server {
listen 80;
server_name localhost;
access_log /opt/nginx/logs/access.log main;
ssi on;
location / {
index index.html;
root /opt/nginx/html/;
}
}
# 支持双证书的https服务
server {
listen 443 ssl;
#开启国密功能
enable_ntls on;
#国际 RSA 证书
ssl_certificate cert/test_rsa.crt;
ssl_certificate_key cert/test_rsa.key;
#国际 ECC 证书(可选)
ssl_certificate cert/test_ecc.crt;
ssl_certificate_key cert/test_ecc.key;
#国密签名证书
ssl_sign_certificate cert/SS.cert.pem;
ssl_sign_certificate_key cert/SS.key.pem;
#国密加密证书
ssl_enc_certificate cert/SE.cert.pem;
ssl_enc_certificate_key cert/SE.key.pem;
#国密套件
ssl_ciphers "ECC-SM2-SM4-CBC-SM3:ECC-SM2-SM4-GCM-SM3:ECDHE-SM2-SM4-CBC-SM3:ECDHE-SM2-SM4-GCM-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-SHA25 6:!aNULL:!eNULL:!RC4:!EXPORT:!DES:!3DES:!MD5:!DSS:!PKS";
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
default_type text/plain;
add_header "Content-Type" "text/html;charset=utf-8";
location / {
return 200 "tengine ntls test OK, ssl_protocol is $ssl_protocol (NTLSv1.1 表示国密,其他表示国际)";
}
}
如果国密握手成功,将显示:
tengine ntls test OK, ssl_protocol is NTLSv1.1 (NTLSv1.1 表示国密,其他表示国际)
否则显示:
tengine ntls test OK, ssl_protocol is TLSv1.3 (NTLSv1.1 表示国密,其他表示国际)
2.2 测试
2.2.1 配置haproxy为ssl终结点,用http连接后端服务器
global
log /dev/log local2 warning
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 65536
user haproxy
group haproxy
nbproc 1
#nbthread 10
#daemon
debug
ssl-default-bind-ciphers ECC-SM2-SM4-CBC-SM3:ECC-SM2-SM4-GCM-SM3:ECDHE-SM2-SM4-CBC-SM3:ECDHE-SM2-SM4-GCM-SM3:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256,AES256-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!ADH:!MD5:!RC4
ssl-default-bind-options prefer-client-ciphers no-sslv3 no-tlsv10 no-tls-tickets
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option redispatch
retries 3
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
maxconn 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#------------------------