赞
踩
haproxy作为开源高性能http/tcp代理服务器得到了广泛应用,它可以支持国际ssl加密通信功能,但是对于国密ssl却一直没有被官方得到支持。随着国密标准规范的推广应用,以及等保2.0明确规定要求对网络通信中的报文或会话过程全文加密(三级),这样导致在haproxy在国内的很多业务场景中不符合等保要求而不能使用。因此有必要对haproxy进行国密ssl功能支持进行改造。
铜锁/Tongsuo是由阿里巴巴基于openssl,衍生开发并开源的同时能够提供国际ssl和国密ssl的一个提供现代密码学算法和安全通信协议的开源基础密码库,为存储、网络、密钥管理、隐私计算等诸多业务场景提供底层的密码学基础能力,实现数据在传输、使用、存储等过程中的私密性、完整性和可认证性,为数据生命周期中的隐私和安全提供保护能力。
本文描述了基于铜锁加密库,为haproxy添加国密ssl的加密传输能力的修改方法以及对应的测试环境搭建和测试方法。
为了支持测试国密测试,首先需要准备测试的客户端工具和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 表示国密,其他表示国际)
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 #------------------------
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。