什么是mTLS
正常的tls只是能让客户端知道服务端是可信的, 而对于服务端来说, 并不能知道客户端是可信的
mTLS相当于在tls的基础上加了个反向的tls, 即服务器配置公钥, 客户端配置私钥, 来验证客户端身份
我部署了一些只希望我自己使用的web服务, 比如web版的rss阅读器, bt软件的webui等, 并不希望我信任的人以外的任何人访问, 因此给web套一层mTLS
生成自签证书
用下面这套命令生成, 不携带CN之外的信息
1 | # 1. 生成本地CA根证书的私钥 |
服务端部署
我是用caddy对内网http做的反代
1 | xxx.ggemo.com:7326 { |
客户端部署
客户端遇到坑了, 本来是这样的命令生成的p12:
1 | openssl pkcs12 -export -out client.p12 -inkey client.key -in client.crt -certfile ca.crt -name "QriClientCert" |
然后发现只有windows能装的上, 安卓/ios/ipadOS/macOS都装不了, 而且安装的时候很迷惑, 就是提示输入证书的密码, 但是怎么输都不对, 除了密码输不对给报错
后来发现, 在OpenSSL3.0以后的版本中, 因为一些旧的加密算法和密码套件被认为是不安全的, 所以默认禁用了, 而上面那些os并没有跟进, 所以装不上, 需要在命令上加个-legacy
参数
1 | openssl pkcs12 -legacy -export -out client.p12 -inkey client.key -in client.crt -name "QriClientCert" |
之后, 把生成的p12传到各个终端安装就可以了