• http2 mTLS代理搭建与远程端口转发(gost)


    一、制作证书

    mTLS认证要求两端都提供证书并证明拥有对应的key,并且要求对方的证书是由自己认可的CA签发的

    (一)自制根CA证书

    https://learn.microsoft.com/zh-cn/azure/application-gateway/self-signed-certificates
    1、准备RSA密钥
    输出的key文件里实际同时包含公钥和私钥

    openssl genrsa -out wzp-ca.key 2048
    # 查看上述密钥文件里的公钥;可用于检查“证书里的公钥”和“密钥文件的公钥”是否一致
    openssl rsa -pubout -in wzp-ca.key
    
    • 1
    • 2
    • 3

    2、准备签名请求
    输出的csr文件里包含CA的公钥、CA的名称

    openssl req -new -key wzp-ca.key -out wzp-ca.csr -config <(
    cat <<-EOF
    [ req ]
    default_bits = 2048
    prompt = no
    default_md = sha256
    distinguished_name = dn
    
    [ dn ]
    CN=wzp-ca
    EOF
    )
    # 查看上述签名请求文件里的名称、公钥信息
    openssl req -in wzp-ca.csr -noout -text
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3、准备证书扩展配置
    主要是申明是CA,并可以用于签发证书

    tee wzp-ca_ext.cnf <<-'EOF'
    basicConstraints = CA:TRUE
    keyUsage = digitalSignature, keyEncipherment, keyCertSign
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4、制作CA

    openssl x509 -req -days 1000 -in wzp-ca.csr -extfile wzp-ca_ext.cnf -signkey wzp-ca.key -out wzp-ca.crt
    
    • 1

    (二)自签发服务端证书

    1、准备RSA密钥

    2、准备签名请求
    提供给签发方的csr文件,不含私钥信息,无需担心安全问题

    openssl req -new -key wzp-server.key -out wzp-server.csr -config <(
    cat <<-EOF
    [ req ]
    default_bits = 2048
    prompt = no
    default_md = sha256
    distinguished_name = dn
    
    [ dn ]
    CN=wzp.com
    EOF
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    3、准备证书扩展配置
    申明增强密钥用法:serverAuth
    请求端验证证书合法性时,是检查服务端证书里的备用名称subjectAltName是否和请求地址匹配,而不是检查Subject里的CN

    tee wzp-server_ext.cnf <<-'EOF'
    basicConstraints = CA:FALSE
    nsCertType = server
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    keyUsage = critical, digitalSignature, keyEncipherment
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names
    [alt_names]
    DNS.1= wzp.com
    DNS.2 = *.wzp.com
    IP.1 = 127.0.0.1
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4、签发证书

    openssl x509 -req -days 1000 -in wzp-server.csr -extfile wzp-server_ext.cnf -CA wzp-ca.crt -CAkey wzp-ca.key -CAcreateserial -out wzp-server.crt
    #验证证书是否由某个CA签发
    openssl verify -CAfile wzp-ca.crt -verbose wzp-server.crt
    
    • 1
    • 2
    • 3

    (三)客户端证书

    1、准备RSA密钥

    2、准备签名请求

    3、准备证书扩展配置
    关键是申明增强密钥用法:clientAuth

    tee wzp-client_ext.cnf <<-'EOF'
    basicConstraints = CA:FALSE
    nsCertType = client, email
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer
    keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage = clientAuth, emailProtection
    EOF
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    4、签发证书

    5、制作PKCS#12证书安装文件
    pfx文件里包含证书和私钥,可被浏览器等请求端导入,用于在mTLS通讯时向服务端证明自己身份

    openssl pkcs12 -export -out wzp-client.pfx -inkey wzp-client.key -in wzp-client.crt
    
    • 1

    二、使用gost进行端口转发

    gost v2

    (一)本地端口转发

    访问转发客户端所在机器的端口,相当于从转发服务器发起对指定地址的访问
    1、服务端:准备转发通道

    gost -L="http2://:443?cert=/wzp-server.crt&key=/wzp-server.key&ca=/wzp-ca.crt"
    
    • 1

    转发通道要求客户端进行TLS握手时,持有wzp-ca签发的证书

    2、客户端:申请监听并映射客户端机器的端口
    假设转发服务器地址是a.a.a.a,在转发客户端本地hosts配置里把mtls.wzp.com解析到地址a.a.a.a;

    gost -L="tcp://:2222/b.b.b.b:443" \
         -L="tcp://:3333/c.c.c.c:443" \
         -F="http2://mtls.wzp.com:443?cert=/wzp-client.crt&key=/wzp-client.key&secure=true&ca=/wzp-ca.crt"
    
    • 1
    • 2
    • 3

    用户访问转发客户端机器的2222端口,相当于从转发服务器a.a.a.a发起对b.b.b.b:443的访问;
    用户访问转发客户端机器的3333端口,相当于从转发服务器a.a.a.a发起对c.c.c.c:443的访问

    (二)远程端口转发

    访问转发服务器的端口,相当于从转发客户端机器发起对指定地址的访问
    1、服务端:准备转发通道

    gost -L="h2://:443?cert=/wzp-server.crt&key=/wzp-server.key&ca=/wzp-ca.crt"
    gost -L="socks5://127.0.0.1:18080"
    
    • 1
    • 2

    第一个转发通道用于和客户端建立mTLS握手的多路复用长连接;
    第二个转发通道用于在转发服务器本地打开映射端口,因为只有socks5协议支持远程端口转发

    2、客户端:申请监听并映射转发服务器的端口
    假设转发服务器地址是a.a.a.a,在转发客户端本地hosts配置里把mtls.wzp.com解析到地址a.a.a.a;

    gost -L="rtcp://:28080/d.d.d.d:8080" \
         -F="h2://mtls.wzp.com:443?cert=/wzp-client.crt&key=/wzp-client.key&secure=true&ca=/wzp-ca.crt" \
         -F="socks5://127.0.0.1:18080"
    
    • 1
    • 2
    • 3

    第二个-F参数表示进行第二级转发,即由转发服务器本地的socks5服务在转发服务器上开启监听28080端口;
    用户访问转发服务器a.a.a.a的28080端口,相当于在转发客户端机器发起对d.d.d.d:8080的访问

  • 相关阅读:
    还在用微信截图吗?这2个免费软件你不能错过
    assertionError: Torch not compiled with CUDA enabled 无法使用gpu
    浅谈关于数据仓库的理解,聊聊数据仓库到底是什么?
    GO 中的指针?
    Spring 中Bean的生命周期及后置处理器使用
    程序员必备的IP查询工具
    Vue关键知识点
    关于神经网络的英语单词有,神经网络的英文单词
    js设计模式
    HTML常用基本元素总结
  • 原文地址:https://blog.csdn.net/wzp1986/article/details/127731987