四时宝库

程序员的知识宝库

如何在HAProxy 中实现国密支持(国密 openssl)

HAProxy 集成 GmSSL 编译扩展

  1. 解压 GmSSL: tar -xvf gmssl_opt_xxx.tar.gz -C /usr/local
  2. 解压 HAProxy:tar -xvf haproxy_xxx.tar.gz
  3. 进入 HAProxy 安装目录(不要和后面编译生成的运行目录同一目录)修改
  • 修改 makefile:
    注释 :
    #OPTIONS_LDFLAGS += $(if $(SSL_LIB),-L$(SSL_LIB)) -lssl -lcrypto
    新增:
    OPTIONS_LDFLAGS += $(SSL_LIB)/libssl.aOPTIONS_LDFLAGS += $(SSL_LIB)/libcrypto.a -lm -lpthread -ldl
    • 修改源码:

文件 src/ssl_sock.c 备注:不能直接修改红色内容,还需要更换位置,按照修改的顺序
函数 ssl_sock_put_ckch_into_ctx 将以下代码

if (SSL_CTX_use_PrivateKey(ctx, ckch->key) <= 0) {
    memprintf(err, "%sunable to load SSL private key into SSL Context '%s'.\n", err && *err ? *err : "", path);
    errcode |= ERR_ALERT | ERR_FATAL; return errcode;
if (!SSL_CTX_use_certificate(ctx, ckch->cert)) {
    memprintf(err, "%sunable to load SSL certificate into SSL Context '%s'.\n", err && *err ? *err : "", path);
    errcode |= ERR_ALERT | ERR_FATAL;
    goto end; 
}

修改为:

if (!SSL_CTX_use_certificate_file(ctx, path, SSL_FILETYPE_PEM)) {
    memprintf(err, "%sunable to load SSL certificate into SSL Context '%s'.\n", err && *err ? *err : "", path);
    errcode |= ERR_ALERT | ERR_FATAL;
    goto end;
}

if (SSL_CTX_use_PrivateKey_file(ctx, path, SSL_FILETYPE_PEM) <= 0) {
    memprintf(err, "%sunable to load SSL private key into SSL Context '%s'.\n", err && *err ? *err : "", path);
    errcode |= ERR_ALERT | ERR_FATAL; return errcode;
}

4. 编译
编译前可能需要提前安装相关依赖:
yum install pcre-devel zlib-devel
make TARGET=linux31 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_CRYPT_H=1 USE_LIBCRYPT=1 SSL_INC=/root/gmssl/gmssl/include SSL_LIB=/root/gmssl/gmssl/lib
备注:SSL_INC 和 SSL_LIB 指定 gmssl 解压的路径

5. 安装
make install PREFIX=/usr/local/haproxy
备注:PREFIX=/usr/local/haproxy 是编译生成的运行目录,不要和安装目录同目录。

6. 配置

    • 证书准备:
      将签名证书 pem 文件和签名私钥 pem 文件合并成 XXX_sig.pem,文件名必须以 sig.pem 结尾

将加密证书 pem 文件和加密私钥 pem 文件合并成 XXX_enc.pem,文件名必须以 enc.pem 结尾
XXX_enc.pem 将被隐式加载,且必须放到 XXX_sig.pem 的相同目录下,比如: /usr/local/keystore/server_enc.pem
需要双向认证的时候:CA 证书合并到一个文件(选做)

    • HAProxy.conf:
global
        daemon
        ssl-default-bind-ciphers ECC-SM4-CBC-SM3:ECC-SM4-GCM-SM3
        #ssl-default-bind-options no-sslv3
        maxconn 256
        log 127.0.0.1 local7 info
    defaults
        mode tcp
        log global
        option tcplog
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms
        stats uri /status
        #stats auth zp:123456
    frontend emqx_dashboard
        bind *:18083
        option tcplog
        mode tcp
        default_backend emqx_dashboard_back
    frontend emqx_tcps
        bind *:8883 ssl crt /usr/local/haproxy/cert/server_sig.pem ca-file /usr/local/haproxy/cert/ca.pem verify required
        option tcplog
        mode tcp
       default_backend backend_emqx_tcp
    frontend emqx_tcp
        bind *:1883
        option tcplog
        mode tcp
        default_backend backend_emqx_tcp
    frontend frontend_emqx_ws
        bind *:8083
        option tcplog
#        option forwardfor
        mode tcp
        default_backend backend_emqx_ws
    backend emqx_dashboard_back
        balance roundrobin
        server emqx_node_1 192.168.92.120:18083 check
    backend backend_emqx_tcp
        mode tcp
balance roundrobin
        server emqx_node_1 192.168.92.120:1883 check-send-proxy send-proxy-v2-ssl-cn
    backend backend_emqx_ws
        mode http
        option forwardfor
        balance roundrobin
        server emqx_node_1 192.168.92.120:8083 check-send-proxy send-proxy-v2 check inter 10s fall 2 rise 5
    • 启动测试
      假如配置文件放在:
      /usr/local/haproxy/conf/
      启动命令:
      /usr/local/haproxy/sbin/haproxy -f /usr/local/haproxy/conf/haproxy.cfg

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接