stunnel

Quasi-Alternative zu OpenVPN für einfache Punkt-zu-Punkt-Verbindungen. Eignet sich auch hervorragend, alte SSL-Kamellen, die z.B. anfällig gegen POODLE & Co. sind, und bei denen sich SSLv2 und SSLv3 nicht abschalten lässt, hinter einem stunnel zu verstecken.

Stunnel wird benötigt auf

  • Server-Seite

  • Client-Seite

Teile von stunnel sind 15+ Jahre alt.

Installation:

yum -y install stunnel

Systemd:

/etc/systemd/system/stunnel.service
[Unit]
Description=TLS tunnel for network daemons
After=syslog.target network.target

[Service]
ExecStart=/usr/bin/stunnel
Type=forking
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Server-Zertifikat:

  • Ein einfaches CA-Zertifikat ohne Key Usages genügt (es braucht also kein Server-Zertifikat; server.pem ist ein reines CA-Cert). Das CA-Zertifikat muss aber die gesamte Chain beinhalten (in XCA: Export der stunnel CA als „PEM chain“).

  • Empfohlen: drei Jahre Gültigkeit.

Nach Erstellung/Installation der Zertifikate und Erstellung der Konfiguration müssen die DH-Parameter an das Server-Zertifikat angehängt werden, sonst erhält man im Log den Fehler Could not load DH parameters from /etc/stunnel/server.pem:

openssl gendh 2048 >> /etc/stunnel/server.pem

stunnel-Server

Verzeichnis-Struktur:

/etc/stunnel
├── approved
│   ├── 35f791ce.0 -> client.pem
│   └── client.pem
├── README
├── revoked
│   ├── abc472ff.r0 -> client.pem
│   └── client.pem
├── server.key
├── server.pem
└── stunnel.conf
mkdir -p /etc/stunnel/{revoked,approved}
/etc/stunnel/stunnel.conf
client = no
cert = /etc/stunnel/server.pem
key = /etc/stunnel/server.key

pid = /run/stunnel.pid

CApath = /etc/stunnel/approved
CRLpath = /etc/stunnel/revoked
verify = 4

; Allow only TLS, thus avoiding SSL
sslVersion = TLSv1

socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1

debug = 7
output = /var/log/stunnel.log


[beats]
accept = 12345
connect = 5044
chmod 0400 /etc/stunnel/server.key /etc/stunnel/server.pem
systemctl enable --now stunnel

Die Client-Zertifikate, denen man vertraut, werden in einem Verzeichnis gehasht abgelegt:

cd /etc/stunnel/approved
HASHVALUE=$(openssl x509 -noout -hash -in trustedcert.pem)
ln -s trustedcert.pem $HASHVALUE.0

Revozierte Zertifikate müssen dagegen $HASHVALUE.r0 heissen und mit obiger Konfiguration in /etc/stunnel/revoked abgelegt werden:

cd /etc/stunnel/revoked
HASHVALUE=$(openssl x509 -noout -hash -in revokedcert.pem)
ln -s revokedcert.pem $HASHVALUE.r0

Restart des stunnel-Servers nach Änderungen der Zertfikate nötig.

Für Debug-Zwecke - Debug = 4: nur Fehler protokollieren, Debug = 7: Log aufdrehen. Anschliessend:

systemctl stop stunnel
stunnel kill $(pidof stunnel)

Log-File findet sich in /var/log/stunnel.log.

Hinweise:

  • Mit der „chroot“-Option und User/Group „nobody“ funktioniert das chrooten unter systemd nicht (chroot: Permission denied).

  • Entweder man verwendet CAfile und hängt alle getrusteten Client-Zertifikate an das Zertifikat an, oder man verwendet wie oben CApath. Wird beides angegeben, wird stunnel immer im CAfile nach Zertifikaten suchen.

  • Die Option „verify“ ist seit Version 5 deprecated.

stunnel-Client

/etc/stunnel/stunnel.conf
client = yes
cert = /etc/stunnel/client.pem
key = /etc/stunnel/client.key
CAfile = /etc/stunnel/ca.pem
verify = 3
fips = no

socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1

debug = 7
output = /var/log/stunnel.log

[beats]
accept = 5044
connect = server:12345
chmod 0400 /etc/stunnel/client.key /etc/stunnel/client.pem
stunnel

Built on 2022-06-03