Настройте stunnel для переноса SSL для одного приложения
Я пытаюсь использовать stunnel, чтобы заставить старый клиент usenet поддерживать SSL. Я попробовал следующий конфиг:
[myservice]
accept = <LOCAL_PORT>
connect = <REMOTE_HOST>:<REMOTE_PORT>
но stunnel продолжал работать с ошибкой:
Section myservice: SSL server needs a certificate
Что я делаю неправильно?
1 ответ
Задавать client = yes
в [myservice]
раздел. Это говорит о том, что connect
(так называемая "серверная") сторона является SSL и accept
(он же "клиент") сторона простая. По умолчанию используется обратное действие, для которого требуется сертификат SSL.
Но это не все! По какой-то безумной причине stunnel по умолчанию использует совершенно небезопасный режим, который не проверяет сертификаты сервера, а это означает, что вы будете подвергаться атакам типа "человек посередине" (MitM)! Чтобы это исправить, используйте verify = 2
а также CAfile
опции. На Ubuntu CAfile
можно найти на /etc/ssl/certs/ca-certificates.crt
(от ca-certificates
пакет). Пока вы на это, также установите options = NO_SSLv2
отключить небезопасный протокол 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")