From OpenSSL 3.2, OpenSSL features support for making QUIC connections as a client.
Users interested in using the new QUIC functionality are encouraged to look at some of the following resources:
demos/guide
.doc/designs/ddd
.demos/http3
, which provides an HTTP/3 client example
using the nghttp3 HTTP/3 library.QUIC is a state-of-the-art secure transport protocol carried over UDP. It can serve many of the use cases of SSL/TLS as well as those of DTLS.
QUIC delivers a number of advantages such as support for multiple streams of communication; it is the basis for HTTP/3 RFC 9114; fast connection initiation; and connection migration (enabling a connection to survive IP address changes). For a more complete description of what QUIC is and its advantages see the QUIC Introduction in the OpenSSL Guide.
For a comprehensive overview of OpenSSL's QUIC implementation, see the openssl-quic(7) manual page.
There are many HTTP/3 implementations in C available. The use of one such HTTP/3
library with OpenSSL QUIC is demonstrated via the demo found in demos/http3
.
The OpenSSL Guide provides introductory examples for how to make use of OpenSSL QUIC.
The openssl-quic(7) manual page and the Demo-Driven Design (DDD) demos may also be helpful to illustrate the changes needed if you are trying to adapt an existing application.
openssl s_client
?There is basic support for single-stream QUIC using openssl s_client
:
$ openssl s_client -quic -alpn myalpn -connect host:port
In the above example replace host
with the hostname of the server (e.g.
www.example.com
) and port
with the port for the server (e.g. 443
). Replace
myalpn
with the Application Layer Protocol to use (e.g.h3
represents
HTTP/3). IANA maintains a standard list of ALPN ids that can be used.
This example connects to a QUIC server and opens a single bidirectional stream. Data can be passed via stdin/stdout as usual. This allows test usage of QUIC using simple TCP/TLS-like usage. Note that OpenSSL has no direct support for HTTP/3 so connecting to an HTTP/3 server should be possible but sending an HTTP/3 request or receiving any response data is not.