我正在尝试使用隧道让较旧的 usenet 客户端支持 SSL。我尝试了以下配置:
[myservice]
accept = <LOCAL_PORT>
connect = <REMOTE_HOST>:<REMOTE_PORT>
但 stunnel 一直失败并出现错误:
Section myservice: SSL server needs a certificate
我究竟做错了什么?
答案1
client = yes
在部分中设置[myservice]
。这会告诉 stunnel connect
(又名“服务器”)端是 SSL 端,而accept
(又名“客户端”)端是普通端。默认情况相反,需要 SSL 证书。
但这还不是全部!出于某些疯狂的原因,stunnel 默认为完全不安全的模式,不验证服务器的证书,这意味着您将遭受中间人 (MitM) 攻击!要解决此问题,请使用和选项verify = 2
。CAfile
在 Ubuntu 上,可以在(从包中)CAfile
找到。同时,还设置为禁用不安全的 SSLv2 协议。/etc/ssl/certs/ca-certificates.crt
ca-certificates
options = NO_SSLv2
最后,当您配置 usenet 程序时,请禁用 SSL,因为应用程序和 stunnel 之间的连接不使用 SSL。
我编写了以下包装器脚本来帮助解决此问题。根据需要替换<LOCAL_PORT>
、<REMOTE_HOST>
和,并将其替换为要运行的任何命令。<REMOTE_PORT>
# ...
#!/bin/bash
PIDFILE=/tmp/stunnel-agent.pid
# Start stunnel in the background.
cat << EOF | stunnel4 -fd 0
pid = $PIDFILE
# Enable proper SSL security. Without this, you are completely insecure!
verify = 2
CAfile = /etc/ssl/certs/ca-certificates.crt
options = NO_SSLv2
[myservice]
client = yes
accept = <LOCAL_PORT>
connect = <REMOTE_HOST>:<REMOTE_PORT>
EOF
# Start whatever program you want.
# ...
# Kill stunnel.
kill $(cat "$PIDFILE")