mTLS认证要求两端都提供证书并证明拥有对应的key,并且要求对方的证书是由自己认可的CA签发的
https://learn.microsoft.com/zh-cn/azure/application-gateway/self-signed-certificates
1、准备RSA密钥
输出的key文件里实际同时包含公钥和私钥
openssl genrsa -out wzp-server.key 2048
# 查看上述密钥文件里的公钥;可用于检查“证书里的公钥”和“密钥文件的公钥”是否一致
openssl rsa -pubout -in wzp-server.key
2、准备签名请求
输出结果里包含服务端证书的公钥、服务端证书的名称;
真实申请证书时,自己的key文件是保密的,把签名请求csr文件发给CA机构即可
openssl req -new -key wzp-server.key -out server.csr -config <(
cat <<-EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
[ dn ]
C=CN
ST=GuangDong
L=FoShan
CN=wzp-server
EOF
)
# 查看上述签名请求文件里的名称、公钥信息
openssl req -in wzp-server.csr -noout -text
3、准备证书扩展配置
主要是提供密钥用法、增强密钥用法、备用名称;
请求端验证证书合法性时,是检查服务端证书里的备用名称是否和请求地址匹配,而不是检查Subject里的名称
tee wzp-server_ext.cnf <<-'EOF'
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "OpenSSL Generated Server Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer:always
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
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、准备RSA密钥
2、准备签名请求
3、准备证书扩展配置
关键是申明增强密钥用法:clientAuth
tee wzp-client_ext.cnf <<-'EOF'
basicConstraints = CA:FALSE
nsCertType = client, email
nsComment = "OpenSSL Generated Client Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth, emailProtection
EOF
4、签发证书
5、制作PKCS#12证书安装文件
pfx文件里包含证书和私钥,可被浏览器等请求端导入,用于在mTLS通讯时向服务端证明自己身份
openssl pkcs12 -export -out wzp-client.pfx -inkey wzp-client.key -in wzp-client.crt
访问转发客户端所在机器的端口,相当于从转发服务器发起对指定地址的访问
1、服务端:准备转发通道
gost -L="http2://:443?cert=/wzp-server.crt&key=/wzp-server.key&ca=/wzp-ca.crt"
转发通道要求客户端进行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"
第三方访问转发客户端机器的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"
第一个转发通道用于和客户端建立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"
第二个-F参数表示进行第二级转发,即由socks5服务进行远程端口绑定;
第三方访问转发服务器的28080端口,相当于从转发客户端机器发起对d.d.d.d:8080的访问