xref: /curl/docs/CIPHERS.md (revision 6238888c)
1<!--
2Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
3
4SPDX-License-Identifier: curl
5-->
6
7## curl cipher options
8
9With curl's option
10[`--tls13-ciphers`](https://curl.se/docs/manpage.html#--tls13-ciphers)
11or
12[`CURLOPT_TLS13_CIPHERS`](https://curl.se/libcurl/c/CURLOPT_TLS13_CIPHERS.html)
13users can control which cipher suites to consider when negotiating TLS 1.3
14connections. With option
15[`--ciphers`](https://curl.se/docs/manpage.html#--ciphers)
16or
17[`CURLOPT_SSL_CIPHER_LIST`](https://curl.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html)
18users can control which cipher suites to consider when negotiating
19TLS 1.2 (1.1, 1.0) connections.
20
21By default, curl may negotiate TLS 1.3 and TLS 1.2 connections, so the cipher
22suites considered when negotiating a TLS connection are a union of the TLS 1.3
23and TLS 1.2 cipher suites. If you want curl to consider only TLS 1.3 cipher
24suites for the connection, you have to set the minimum TLS version to 1.3 by
25using [`--tlsv1.3`](https://curl.se/docs/manpage.html#--tlsv13)
26or [`CURLOPT_SSLVERSION`](https://curl.se/libcurl/c/CURLOPT_SSLVERSION.html)
27with `CURL_SSLVERSION_TLSv1_3`.
28
29Both the TLS 1.3 and TLS 1.2 cipher options expect a list of cipher suites
30separated by colons (`:`). This list is parsed opportunistically, cipher suites
31that are not recognized or implemented are ignored. As long as there is at
32least one recognized cipher suite in the list, the list is considered valid.
33
34For both the TLS 1.3 and TLS 1.2 cipher options, the order in which the
35cipher suites are specified determine the preference of them. When negotiating
36a TLS connection the server picks a cipher suite from the intersection of the
37cipher suites supported by the server and the cipher suites sent by curl. If
38the server is configured to honor the client's cipher preference, the first
39common cipher suite in the list sent by curl is chosen.
40
41## TLS 1.3 cipher suites
42
43Setting TLS 1.3 cipher suites is supported by curl with
44OpenSSL (1.1.1+, curl 7.61.0+), LibreSSL (3.4.1+, curl 8.3.0+),
45wolfSSL (curl 8.10.0+) and mbedTLS (3.6.0+, curl 8.10.0+).
46
47The list of cipher suites that can be used for the `--tls13-ciphers` option:
48```
49TLS_AES_128_GCM_SHA256
50TLS_AES_256_GCM_SHA384
51TLS_CHACHA20_POLY1305_SHA256
52TLS_AES_128_CCM_SHA256
53TLS_AES_128_CCM_8_SHA256
54```
55
56### wolfSSL notes
57
58In addition to above list the following cipher suites can be used:
59`TLS_SM4_GCM_SM3` `TLS_SM4_CCM_SM3` `TLS_SHA256_SHA256` `TLS_SHA384_SHA384`.
60Usage of these cipher suites is not recommended. (The last two cipher suites
61are NULL ciphers, offering no encryption whatsoever.)
62
63## TLS 1.2 (1.1, 1.0) cipher suites
64
65Setting TLS 1.2 cipher suites is supported by curl with OpenSSL, LibreSSL,
66BoringSSL, mbedTLS (curl 8.8.0+), wolfSSL (curl 7.53.0+),
67Secure Transport (curl 7.77.0+) and BearSSL (curl 7.83.0+). Schannel does not
68support setting cipher suites directly, but does support setting algorithms
69(curl 7.61.0+), see Schannel notes below.
70
71For TLS 1.2 cipher suites there are multiple naming schemes, the two most used
72are with OpenSSL names (e.g. `ECDHE-RSA-AES128-GCM-SHA256`) and IANA names
73(e.g. `TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256`). IANA names of TLS 1.2 cipher
74suites look similar to TLS 1.3 cipher suite names, to distinguish them note
75that TLS 1.2 names contain `_WITH_`, while TLS 1.3 names do not. When setting
76TLS 1.2 cipher suites with curl it is recommended that you use OpenSSL names
77as these are most widely recognized by the supported SSL backends.
78
79The complete list of cipher suites that may be considered for the `--ciphers`
80option is extensive, it consists of more than 300 ciphers suites. However,
81nowadays for most of them their usage is discouraged, and support for a lot of
82them have been removed from the various SSL backends, if ever implemented at
83all.
84
85A shortened list (based on [recommendations by
86Mozilla](https://wiki.mozilla.org/Security/Server_Side_TLS)) of cipher suites,
87which are (mostly) supported by all SSL backends, that can be used for the
88`--ciphers` option:
89```
90ECDHE-ECDSA-AES128-GCM-SHA256
91ECDHE-RSA-AES128-GCM-SHA256
92ECDHE-ECDSA-AES256-GCM-SHA384
93ECDHE-RSA-AES256-GCM-SHA384
94ECDHE-ECDSA-CHACHA20-POLY1305
95ECDHE-RSA-CHACHA20-POLY1305
96DHE-RSA-AES128-GCM-SHA256
97DHE-RSA-AES256-GCM-SHA384
98DHE-RSA-CHACHA20-POLY1305
99ECDHE-ECDSA-AES128-SHA256
100ECDHE-RSA-AES128-SHA256
101ECDHE-ECDSA-AES128-SHA
102ECDHE-RSA-AES128-SHA
103ECDHE-ECDSA-AES256-SHA384
104ECDHE-RSA-AES256-SHA384
105ECDHE-ECDSA-AES256-SHA
106ECDHE-RSA-AES256-SHA
107DHE-RSA-AES128-SHA256
108DHE-RSA-AES256-SHA256
109AES128-GCM-SHA256
110AES256-GCM-SHA384
111AES128-SHA256
112AES256-SHA256
113AES128-SHA
114AES256-SHA
115DES-CBC3-SHA
116```
117
118See this [list](https://github.com/curl/curl/blob/master/docs/CIPHERS-TLS12.md)
119for a complete list of TLS 1.2 cipher suites.
120
121### OpenSSL notes
122
123In addition to specifying a list of cipher suites, OpenSSL also accepts a
124format with specific cipher strings (like `TLSv1.2`, `AESGCM`, `CHACHA20`) and
125`!`, `-` and `+` operators. Refer to the
126[OpenSSL cipher documentation](https://docs.openssl.org/master/man1/openssl-ciphers/#cipher-list-format)
127for further information on that format.
128
129### Schannel notes
130
131Schannel does not support setting individual TLS 1.2 cipher suites directly.
132It only allows the enabling and disabling of encryption algorithms. These are
133in the form of `CALG_xxx`, see the [Schannel `ALG_ID`
134documentation](https://docs.microsoft.com/windows/desktop/SecCrypto/alg-id)
135for a list of these algorithms. Also, (since curl 7.77.0)
136`SCH_USE_STRONG_CRYPTO` can be given to pass that flag to Schannel, lookup the
137[documentation for the Windows version in
138use](https://learn.microsoft.com/en-us/windows/win32/secauthn/cipher-suites-in-schannel)
139to see how that affects the cipher suite selection. When not specifying the
140`--chiphers` and `--tl13-ciphers` options curl passes this flag by default.
141
142## Examples
143
144```sh
145curl \
146  --tls13-ciphers TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256 \
147  --ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:\
148ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305 \
149  https://example.com/
150```
151Restrict ciphers to `aes128-gcm` and `chacha20`. Works with OpenSSL, LibreSSL,
152mbedTLS and wolfSSL.
153
154```sh
155curl \
156  --tlsv1.3 \
157  --tls13-ciphers TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256 \
158  https://example.com/
159```
160Restrict to only TLS 1.3 with `aes128-gcm` and `chacha20` ciphers. Works with
161OpenSSL, LibreSSL, mbedTLS, wolfSSL and Schannel.
162
163```sh
164curl \
165  --ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:\
166ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305 \
167  https://example.com/
168```
169Restrict TLS 1.2 ciphers to `aes128-gcm` and `chacha20`, use default TLS 1.3
170ciphers (if TLS 1.3 is available). Works with OpenSSL, LibreSSL, BoringSSL,
171mbedTLS, wolfSSL, Secure Transport and BearSSL.
172
173## Further reading
174- [OpenSSL cipher suite names documentation](https://docs.openssl.org/master/man1/openssl-ciphers/#cipher-suite-names)
175- [wolfSSL cipher support documentation](https://www.wolfssl.com/documentation/manuals/wolfssl/chapter04.html#cipher-support)
176- [mbedTLS cipher suites reference](https://mbed-tls.readthedocs.io/projects/api/en/development/api/file/ssl__ciphersuites_8h/)
177- [Schannel cipher suites documentation](https://learn.microsoft.com/en-us/windows/win32/secauthn/cipher-suites-in-schannel)
178- [BearSSL supported crypto](https://www.bearssl.org/support.html)
179- [Secure Transport cipher suite values](https://developer.apple.com/documentation/security/1550981-ssl_cipher_suite_values)
180- [IANA cipher suites list](https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4)
181- [Wikipedia cipher suite article](https://en.wikipedia.org/wiki/Cipher_suite)
182