openconnect+OpenSSL failing DTLS handshake with ocserv+GnuTLS

Vuille, Martin (Martin) vmartin at avaya.com
Wed Jul 7 07:05:23 PDT 2021


Client was built from sources, for ARM, using OpenSSL:

       OpenConnect version v8.05-275-g9d287e4
       Using OpenSSL 1.0.2u-fips  20 Dec 201. Features present: TPM (OpenSSL ENGINE not present), HOTP software token, TOTP software token, DTLS, ESP
       Supported protocols: anyconnect (default), nc, gp, pulse

The server is Fedora-provided RPM, using GnuTLS:

       ocserv 1.1.1
       Compiled with: seccomp, oath, radius, gssapi, PAM, PKCS#11, AnyConnect
       GnuTLS version: 3.6.16 (compiled with 3.6.14)

Non-comment lines in ocserv.conf are:

       auth = "certificate"
       listen-host = 10.215.0.62
       tcp-port = 8443
       udp-port = 8443
       run-as-user = ocserv
       run-as-group = ocserv
       socket-file = ocserv.sock
       chroot-dir = /var/lib/ocserv
       server-cert = /etc/pki/ocserv/public/server-cert.pem
       server-key = /etc/pki/ocserv/private/server-key.pem
       ca-cert = /etc/pki/ocserv/public/ca-cert.pem
       isolate-workers = true
       max-clients = 16
       max-same-clients = 2
       rate-limit-ms = 100
       server-stats-reset-time = 604800
       keepalive = 32400
       dpd = 90
       mobile-dpd = 1800
       switch-to-tcp-timeout = 25
       try-mtu-discovery = false
       cert-user-oid = 2.5.4.3
       tls-priorities = "NORMAL:%SERVER_PRECEDENCE"
       auth-timeout = 240
       min-reauth-time = 300
       max-ban-score = 80
       ban-reset-time = 1200
       cookie-timeout = 300
       deny-roaming = false
       rekey-time = 172800
       rekey-method = ssl
       use-occtl = true
       device = vpns
       predictable-ips = true
       ipv4-network = 192.215.0.0
       ipv4-netmask = 255.255.255.252
       ping-leases = true
       cisco-client-compat = false
       dtls-psk = true
       dtls-legacy = false

Client is invoked with the command:

       openconnect --protocol=anyconnect -c user-cert.pem -k user-key.pem --cafile=ca-cert.pem --dump -vvv 10.215.0.62:8443

DTLS handshake fails, server logs show:

       Jul 06 09:56:00 gna ocserv[3394]: worker[user]: 10.215.0.36 suggesting DPD of 90 secs
       Jul 06 09:56:00 gna ocserv[3394]: worker[user]: 10.215.0.36 configured link MTU is 1500
       Jul 06 09:56:00 gna ocserv[3394]: worker[user]: 10.215.0.36 peer's link MTU is 1500
       Jul 06 09:56:00 gna ocserv[3394]: worker[user]: 10.215.0.36 sending IPv4 192.215.0.2
       Jul 06 09:56:00 gna ocserv[3394]: worker[user]: 10.215.0.36 X-DTLS-App-ID: 14ff6e6e26aca40eea9e3f05df2eb9613da6e6bfe400c83aa7d956b5e318c805
       Jul 06 09:56:00 gna ocserv[3394]: worker[user]: 10.215.0.36 DTLS ciphersuite: PSK-NEGOTIATE
       Jul 06 09:56:00 gna ocserv[3394]: worker[user]: 10.215.0.36 Link MTU is 1500 bytes
       Jul 06 09:56:00 gna ocserv[3394]: worker[user]: 10.215.0.36 setting up DTLS-PSK connection
       Jul 06 09:56:00 gna ocserv[3394]: worker[user]: 10.215.0.36 worker-vpn.c:1440: error in DTLS handshake: A packet with illegal or unsupported version was re>

Wireshark capture shows client sending DTLS ClientHello with DTLS 1.0 version (0xfeff) in both the record layer and in the handshake.

This configuration works fine if openconnect is built with GnuTLS:

       OpenConnect version v8.05-275-g9d287e4
       Using GnuTLS 3.5.3. Features present: HOTP software token, TOTP software token, System keys, DTLS, ESP
       Supported protocols: anyconnect (default), nc, gp, pulse

In that case, Wireshark shows the client sending DTLS ClientHello with DTLS 1.0 version in the record layer but DTLS 1.2 (0xfefd) in the handshake.

I'm about to start digging into the code, but hoping this might be "obvious"
to someone with more experience with openconnect and DTLS.

Regards,
MV



More information about the openconnect-devel mailing list