haproxy集成国密ssl功能[上]

本文介绍了如何在haproxy中集成国密SSL功能,包括环境搭建、编译铜锁openssl和haproxy,详细阐述了配置国密和国际SSL证书的过程,并提供了测试步骤,确保haproxy能作为国密HTTPS服务器运行。
摘要由CSDN通过智能技术生成

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
#------------------------
  • 25
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农心语

您的鼓励是我写作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值