-
-
Notifications
You must be signed in to change notification settings - Fork 7k
feature ssls-export for SSL session im-/export #15924
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
Closed
Changes from all commits
Commits
Show all changes
9 commits
Select commit
Hold shift + click to select a range
c9a2cc2
feature ssls-export for SSL session im-/export
icing 3901a88
fix type, add curl_get_line.[ch] to generate.bat
icing c8d86f5
rename tracing feat to 'ssls' for consistency, added supported TLS ba…
icing e0a9f0c
remove stray
icing 302373d
ngtcp2: update `time_appconnect` on earlydata when handshake really h…
icing a7db96c
added USE_SSLS_EXPORT in cmake documentation and option list
icing 51f5396
fix syntax in CMakeLists.txt
icing 860efb8
move USE_SSLS_EXPORT around and add Default info
icing 0897d61
remove terrible, trailing ws
icing File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -779,6 +779,7 @@ src | |
| SRP | ||
| SRWLOCK | ||
| SSL | ||
| SSLS | ||
| ssl | ||
| SSLeay | ||
| SSLKEYLOGFILE | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,35 @@ | ||
| --- | ||
| c: Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. | ||
| SPDX-License-Identifier: curl | ||
| Long: ssl-sessions | ||
| Arg: <filename> | ||
| Protocols: TLS | ||
| Help: Load/save SSL session tickets from/to this file | ||
| Added: 8.12.0 | ||
| Category: tls | ||
| Multi: single | ||
| See-also: | ||
| - tls-earlydata | ||
| Example: | ||
| - --ssl-sessions sessions.txt $URL | ||
| --- | ||
|
|
||
| # `--ssl-sessions` | ||
|
|
||
| Use the given file to load SSL session tickets into curl's cache before | ||
| starting any transfers. At the end of a successful curl run, the cached | ||
| SSL sessions tickets are save to the file, replacing any previous content. | ||
|
|
||
| The file does not have to exist, but curl reports an error if it is | ||
| unable to create it. Unused loaded tickets are saved again, unless they | ||
| get replaced or purged from the cache for space reasons. | ||
|
|
||
| Using a session file allows `--tls-earlydata` to send the first request | ||
| in "0-RTT" mode, should an SSL session with the feature be found. Note that | ||
| a server may not support early data. Also note that early data does | ||
| not provide forward secrecy, e.g. is not as secure. | ||
|
|
||
| The SSL session tickets are stored as base64 encoded text, each ticket on | ||
| its own line. The hostnames are cryptographically salted and hashed. While | ||
| this prevents someone to easily see the hosts you contacted, they could still | ||
| check if a specific hostname matches one of the values. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -10,6 +10,7 @@ Multi: boolean | |
| See-also: | ||
| - tlsv1.3 | ||
| - tls-max | ||
| - ssl-sessions | ||
| Example: | ||
| - --tls-earlydata $URL | ||
| --- | ||
|
|
||
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,172 @@ | ||
| --- | ||
| c: Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al. | ||
| SPDX-License-Identifier: curl | ||
| Title: curl_easy_ssls_export | ||
| Section: 3 | ||
| Source: libcurl | ||
| See-also: | ||
| - CURLOPT_SHARE (3) | ||
| - curl_share_setopt (3) | ||
| - curl_easy_ssls_import (3) | ||
| Protocol: | ||
| - All | ||
| TLS-backend: | ||
| - GnuTLS | ||
| - OpenSSL | ||
| - BearSSL | ||
| - wolfSSL | ||
| - mbedTLS | ||
| Added-in: 8.12.0 | ||
| --- | ||
|
|
||
| # NAME | ||
|
|
||
| curl_easy_ssls_export - export SSL sessions | ||
|
|
||
| # SYNOPSIS | ||
|
|
||
| ~~~c | ||
| #include <curl/curl.h> | ||
|
|
||
| typedef CURLcode curl_ssls_export_function(CURL *handle, | ||
| void *userptr, | ||
| const char *session_key, | ||
| const unsigned char *shmac, | ||
| size_t shmac_len, | ||
| const unsigned char *sdata, | ||
| size_t sdata_len, | ||
| curl_off_t valid_until, | ||
| int ietf_tls_id, | ||
| const char *alpn, | ||
| size_t earlydata_max); | ||
|
|
||
| CURLcode curl_easy_ssls_export(CURL *handle, | ||
| curl_ssls_export_function *export_fn, | ||
| void *userptr); | ||
| ~~~ | ||
|
|
||
| # DESCRIPTION | ||
|
|
||
| This function iterates over all SSL session tickets that belong to the | ||
| easy handle and invokes the **export_fn** callback on each of them, as | ||
| long as the callback returns **CURLE_OK**. | ||
|
|
||
| The callback may then store this information and use curl_easy_ssls_import(3) | ||
| in another libcurl instance to add SSL session tickets again. Reuse of | ||
| SSL session tickets may result in faster handshakes and some connections | ||
| might be able to send request data in the initial packets (0-RTT). | ||
|
|
||
| From all the parameters passed to the **export_fn** only two need to be | ||
| persisted: either **session_key** or **shamc** and always **sdata**. All | ||
| other parameters are informative, e.g. allow the callback to act only | ||
| on specific session tickets. | ||
|
|
||
| Note that SSL sessions that involve a client certificate or SRP | ||
| username/password are not exported. | ||
|
|
||
| # Export Function Parameter | ||
|
|
||
| ## Session Key | ||
|
|
||
| This is a printable, 0-terminated string that starts with **hostname:port** | ||
| the session ticket is originating from and also contains all relevant | ||
| SSL parameters used in the connection. The key also carries the name | ||
| and version number of the TLS backend used. | ||
|
|
||
| It is recommended to only persist **session_key** when it can be protected | ||
| from outside access. Since the hostname appears in plain text, it would | ||
| allow any third party to see how curl has been used for. | ||
|
|
||
| ## Salted Hash | ||
|
|
||
| A binary blob of **shmac_len** bytes that contains a random salt and | ||
| a cryptographic hash of the salt and **session_key**. The salt is generated | ||
| for every session individually. Storing **shmac** is recommended when | ||
| placing session tickets in a file, for example. | ||
|
|
||
| A third party may brute-force known hostnames, but cannot just "grep" for | ||
| them. | ||
|
|
||
| ## Session Data | ||
|
|
||
| A binary blob of **sdata_len** bytes, **sdata** contains all relevant | ||
| SSL session ticket information for a later import - apart from **session_key** | ||
| and **shmac**. | ||
|
|
||
| ## valid_until | ||
|
|
||
| Seconds since EPOCH (1970-01-01) until the session ticket is considered | ||
| valid. | ||
|
|
||
| ## TLS Version | ||
|
|
||
| The IETF assigned number for the TLS version the session ticket originates | ||
| from. This is **0x0304** for TLSv1.3, **0x0303** for 1.2, etc. Session | ||
| tickets from version 1.3 have better security properties, so an export | ||
| might store only those. | ||
|
|
||
| ## ALPN | ||
|
|
||
| The ALPN protocol that had been negotiated with the host. This may be | ||
| **NULL** if negotiation gave no result or had not been attempted. | ||
|
|
||
| ## Early Data | ||
|
|
||
| The maximum amount of bytes the server supports to receive in early data | ||
| (0-RTT). This is 0 unless the server explicitly indicates support. | ||
|
|
||
| # %PROTOCOLS% | ||
|
|
||
| # EXAMPLE | ||
|
|
||
| ~~~c | ||
| CURLcode my_export_cb(CURL *handle, | ||
| void *userptr, | ||
| const char *session_key, | ||
| const unsigned char *shmac, | ||
| size_t shmac_len, | ||
| const unsigned char *sdata, | ||
| size_t sdata_len, | ||
| curl_off_t valid_until, | ||
| int ietf_tls_id, | ||
| const char *alpn, | ||
| size_t earlydata_max) | ||
| { | ||
| /* persist sdata */ | ||
| return CURLE_OK; | ||
| } | ||
|
|
||
| int main(void) | ||
| { | ||
| CURLSHcode sh; | ||
| CURLSH *share = curl_share_init(); | ||
| CURLcode rc; | ||
| CURL *curl; | ||
|
|
||
| sh = curl_share_setopt(share, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); | ||
| if(sh) | ||
| printf("Error: %s\n", curl_share_strerror(sh)); | ||
|
|
||
| curl = curl_easy_init(); | ||
| if(curl) { | ||
| curl_easy_setopt(curl, CURLOPT_SHARE, share); | ||
|
|
||
| rc = curl_easy_ssls_export(curl, my_export_cb, NULL); | ||
|
|
||
| /* always cleanup */ | ||
| curl_easy_cleanup(curl); | ||
| } | ||
| curl_share_cleanup(share); | ||
| } | ||
| ~~~ | ||
|
|
||
| # %AVAILABILITY% | ||
|
|
||
| # RETURN VALUE | ||
|
|
||
| This function returns a CURLcode indicating success or error. | ||
|
|
||
| CURLE_OK (0) means everything was OK, non-zero means an error occurred, see | ||
| libcurl-errors(3). If CURLOPT_ERRORBUFFER(3) was set with curl_easy_setopt(3) | ||
| there can be an error message stored in the error buffer when non-zero is | ||
| returned. |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.