
Native Go implementation of DTLS 1.2 and 1.3 with ECDHE and PSK key exchange, AEAD ciphers, connection IDs, session resumption, 0-RTT, and Encrypted Client Hello.
Native DTLS 1.2 and DTLS 1.3 implementation in the Go programming language.
A long term goal is a professional security review, and maybe an inclusion in stdlib.
Pion DTLS supports DTLS 1.2 and DTLS 1.3. We welcome contributions and bug fixes.
psk_ke and psk_dhe_ke, supporting SHA-256 and SHA-384ResumeWithECH (RFC 9849)Conn.AddPath, Path.Probe, and Path.SwitchConn.UpdateKeysThe library enables DTLS 1.2 and DTLS 1.3 by default, preferring DTLS 1.3.
Use WithMaxVersion(protocol.Version1_2) to restrict a connection to DTLS 1.2,
or WithMinVersion(protocol.Version1_3) to require DTLS 1.3.
For a DTLS server that listens on 127.0.0.1:4444
go run examples/listen/selfsign/main.go
For a DTLS client that connects to 127.0.0.1:4444
go run examples/dial/selfsign/main.go
Pion DTLS can connect to itself and OpenSSL.
// Generate a certificate
openssl ecparam -out key.pem -name prime256v1 -genkey
openssl req -new -sha256 -key key.pem -out server.csr
openssl x509 -req -sha256 -days 365 -in server.csr -signkey key.pem -out cert.pem
// Use with examples/dial/selfsign/main.go
openssl s_server -dtls1_2 -cert cert.pem -key key.pem -accept 4444
// Use with examples/listen/selfsign/main.go
openssl s_client -dtls1_2 -connect 127.0.0.1:4444 -debug -cert cert.pem -key key.pem
DTLS 1.3 supports session ticket resumption with optional 0-RTT early data.
Resumption only allows psk_dhe_ke (PSK with ephemeral ECDHE).
The resumption example demonstrate a certificate-authenticated
first connection, encrypted session storage, and subsequent connections with resumption
and optional early data. See its README for run instructions and the session store's
single-use Claim requirement for 0-RTT.
The State/Resume API also supports restoring established DTLS 1.3
connections without a new handshake. See Resume.
DTLS 1.3 supports external PSKs with psk_ke (PSK-only) and psk_dhe_ke
(PSK with ephemeral ECDHE), using SHA-256 or SHA-384. Clients can offer multiple
PSK identities per handshake for the server to select from.
The PSK examples use DTLS 1.3 by default, with TLS_AES_128_GCM_SHA256.
go run examples/listen/psk/main.go
go run examples/dial/psk/main.go
To use DTLS 1.2 with TLS_PSK_WITH_AES_128_CCM_8, pass -dtls12 to both: