Skip to content
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

Support TLS Resume with client certificates on Linux #102656

Conversation

rzikm
Copy link
Member

@rzikm rzikm commented May 24, 2024

Closes #94561.

This PR enables TLS resume on Linux if client certificate is provided. The feature is triggered if local certificate selection routine manages to select a certificate, i.e. either of these situations:

  • ClientCertificateContext
  • LocalCertificateSelectionCallback returns non-null certificate on first call (otherwise selection based on server cert/acceptable issuers is assumed and fresh SSL_CTX is always used)
  • ClientCertificates collection has at least one certificate (and first one with private key is used)

The feature is enabled by caching SSL_CTX as before, certificate thumbprint has been added to the cache key to mirror what we do on Windows. The caching code has been reused from MsQuicConfiguration cache (and in further PR can be unified with the caching code we have for SslStream credentials on Windows).

I stressed the caching code under a dedicated program, there does not seem to be any leakage.

@rzikm
Copy link
Member Author

rzikm commented May 24, 2024

Looks like TLS 1.3 works as well. (Windows server, Linux client, client cert required)

image

@rzikm rzikm requested a review from wfurt May 24, 2024 13:14
@wfurt
Copy link
Member

wfurt commented May 28, 2024

I need to do a bit more testing (can't test TLS 1.3 resumption against .NET Linux server yet, as we support only stateful resumption yet).

I don't quite understand the comment. I thought we only support stateless e.g. tickets to avoid large server cache. But I would also think that it does not matter e.g. the resumption is possible in either way.

@rzikm
Copy link
Member Author

rzikm commented May 30, 2024

I need to do a bit more testing (can't test TLS 1.3 resumption against .NET Linux server yet, as we support only stateful resumption yet).

I don't quite understand the comment. I thought we only support stateless e.g. tickets to avoid large server cache. But I would also think that it does not matter e.g. the resumption is possible in either way.

I meant that Linux .NET server does not issue resumption tokens in TLS 1.3, so I had to test against different server (Windows in this case).

Edit: my bad, it turns out that the resumption ticket was not transmitted because we close the connection without actually transmitting any user data, adding a ping-pong to the tests fixed the problem.

@rzikm
Copy link
Member Author

rzikm commented Jun 6, 2024

/azp run runtime-coreclr libraries-outerloop

Copy link

No pipelines are associated with this pull request.

@rzikm
Copy link
Member Author

rzikm commented Jun 6, 2024

/azp run runtime-extra-platforms

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@rzikm
Copy link
Member Author

rzikm commented Jun 6, 2024

/azp run runtime-libraries coreclr-outerloop

Copy link

No pipelines are associated with this pull request.

@rzikm
Copy link
Member Author

rzikm commented Jun 6, 2024

/azp list

Copy link

CI/CD Pipelines for this repository:

@rzikm
Copy link
Member Author

rzikm commented Jun 6, 2024

/azp run runtime-libraries-coreclr outerloop

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@rzikm
Copy link
Member Author

rzikm commented Jun 11, 2024

/azp run runtime-extra-platforms

@rzikm
Copy link
Member Author

rzikm commented Jun 11, 2024

/azp run runtime-libraries-coreclr outerloop

Copy link

Azure Pipelines successfully started running 1 pipeline(s).

1 similar comment
Copy link

Azure Pipelines successfully started running 1 pipeline(s).

@rzikm
Copy link
Member Author

rzikm commented Jun 12, 2024

/ba-g Test failures are all unrelated, relevant stages (System.Net.Security.Tests) all pass

@rzikm rzikm merged commit 4a8a95f into dotnet:main Jun 12, 2024
118 of 144 checks passed
@LoopedBard3
Copy link
Member

LoopedBard3 commented Jun 18, 2024

Related regression: dotnet/perf-autofiling-issues#36400 (Only the SSLStreamTests)

Linux Arm64: dotnet/perf-autofiling-issues#36652

@rzikm
Copy link
Member Author

rzikm commented Jun 19, 2024

I realize I did not post any measurements here, so here we are:

// * Summary *

BenchmarkDotNet v0.13.13-nightly.20240311.145, Ubuntu 22.04.4 LTS (Jammy Jellyfish)
Intel Core i9-10900K CPU 3.70GHz, 1 CPU, 20 logical and 10 physical cores
.NET SDK 9.0.100-preview.5.24307.3
  [Host]     : .NET 9.0.0 (9.0.24.30607), X64 RyuJIT AVX2
  Job-DZDDGH : .NET 9.0.0 (42.42.42.42424), X64 RyuJIT AVX2
  Job-HPXMZE : .NET 9.0.0 (42.42.42.42424), X64 RyuJIT AVX2

PowerPlanMode=00000000-0000-0000-0000-000000000000  IterationTime=250ms  MaxIterationCount=20
MinIterationCount=15  WarmupCount=1

| Method                                 | Job        | Toolchain      | Mean      | Error     | StdDev    | Median    | Min        | Max       | Ratio | RatioSD | Allocated | Alloc Ratio |
|--------------------------------------- |----------- |--------------- |----------:|----------:|----------:|----------:|-----------:|----------:|------:|--------:|----------:|------------:|
| DefaultHandshakeContextIPv4Async       | Job-DZDDGH | /9.0.0/corerun |  1.017 ms | 0.0275 ms | 0.0294 ms |  1.008 ms |  0.9759 ms |  1.082 ms |  1.00 |    0.04 |   5.96 KB |        1.00 |
| DefaultHandshakeContextIPv4Async       | Job-HPXMZE | /main/corerun  |  1.054 ms | 0.0207 ms | 0.0213 ms |  1.053 ms |  1.0240 ms |  1.109 ms |  1.04 |    0.03 |   5.96 KB |        1.00 |
|                                        |            |                |           |           |           |           |            |           |       |         |           |             |
| DefaultHandshakeContextIPv6Async       | Job-DZDDGH | /9.0.0/corerun |  1.046 ms | 0.0328 ms | 0.0350 ms |  1.039 ms |  0.9988 ms |  1.130 ms |  1.00 |    0.05 |   5.96 KB |        1.00 |
| DefaultHandshakeContextIPv6Async       | Job-HPXMZE | /main/corerun  |  1.045 ms | 0.0202 ms | 0.0168 ms |  1.050 ms |  1.0154 ms |  1.074 ms |  1.00 |    0.04 |   5.96 KB |        1.00 |
|                                        |            |                |           |           |           |           |            |           |       |         |           |             |
| DefaultMutualHandshakeContextIPv4Async | Job-DZDDGH | /9.0.0/corerun |  1.394 ms | 0.0269 ms | 0.0225 ms |  1.395 ms |  1.3559 ms |  1.441 ms |  1.00 |    0.02 |  10.73 KB |        1.00 |
| DefaultMutualHandshakeContextIPv4Async | Job-HPXMZE | /main/corerun  |  4.792 ms | 0.2019 ms | 0.2244 ms |  4.754 ms |  4.4838 ms |  5.289 ms |  3.44 |    0.17 |   6.27 KB |        0.58 |
|                                        |            |                |           |           |           |           |            |           |       |         |           |             |
| DefaultMutualHandshakeContextIPv6Async | Job-DZDDGH | /9.0.0/corerun |  1.398 ms | 0.0273 ms | 0.0256 ms |  1.394 ms |  1.3611 ms |  1.445 ms |  1.00 |    0.02 |  10.73 KB |        1.00 |
| DefaultMutualHandshakeContextIPv6Async | Job-HPXMZE | /main/corerun  |  4.716 ms | 0.0982 ms | 0.1091 ms |  4.686 ms |  4.5305 ms |  4.914 ms |  3.37 |    0.10 |   6.26 KB |        0.58 |
|                                        |            |                |           |           |           |           |            |           |       |         |           |             |
| DefaultHandshakeIPv4Async              | Job-DZDDGH | /9.0.0/corerun |  5.715 ms | 0.0660 ms | 0.0551 ms |  5.705 ms |  5.6337 ms |  5.832 ms |  1.00 |    0.01 |   9.66 KB |        1.00 |
| DefaultHandshakeIPv4Async              | Job-HPXMZE | /main/corerun  |  5.949 ms | 0.1222 ms | 0.1358 ms |  5.960 ms |  5.7571 ms |  6.177 ms |  1.04 |    0.03 |   9.67 KB |        1.00 |
|                                        |            |                |           |           |           |           |            |           |       |         |           |             |
| DefaultHandshakeIPv6Async              | Job-DZDDGH | /9.0.0/corerun |  5.904 ms | 0.1713 ms | 0.1904 ms |  5.835 ms |  5.6978 ms |  6.335 ms |  1.00 |    0.04 |   9.68 KB |        1.00 |
| DefaultHandshakeIPv6Async              | Job-HPXMZE | /main/corerun  |  5.862 ms | 0.1116 ms | 0.0932 ms |  5.828 ms |  5.7339 ms |  6.003 ms |  0.99 |    0.03 |   9.66 KB |        1.00 |
|                                        |            |                |           |           |           |           |            |           |       |         |           |             |
| DefaultMutualHandshakeIPv4Async        | Job-DZDDGH | /9.0.0/corerun | 10.854 ms | 0.2105 ms | 0.1969 ms | 10.804 ms | 10.5719 ms | 11.251 ms |  1.00 |    0.02 |  17.34 KB |        1.00 |
| DefaultMutualHandshakeIPv4Async        | Job-HPXMZE | /main/corerun  | 11.575 ms | 0.2257 ms | 0.2001 ms | 11.556 ms | 11.2971 ms | 11.996 ms |  1.07 |    0.03 |  17.18 KB |        0.99 |
|                                        |            |                |           |           |           |           |            |           |       |         |           |             |
| DefaultMutualHandshakeIPv6Async        | Job-DZDDGH | /9.0.0/corerun | 10.850 ms | 0.2151 ms | 0.2012 ms | 10.801 ms | 10.5470 ms | 11.177 ms |  1.00 |    0.03 |  17.36 KB |        1.00 |
| DefaultMutualHandshakeIPv6Async        | Job-HPXMZE | /main/corerun  | 11.306 ms | 0.2226 ms | 0.2475 ms | 11.337 ms | 10.8917 ms | 11.872 ms |  1.04 |    0.03 |  15.91 KB |        0.92 |
|                                        |            |                |           |           |           |           |            |           |       |         |           |             |
| DefaultHandshakePipeAsync              | Job-DZDDGH | /9.0.0/corerun |  5.901 ms | 0.1145 ms | 0.1125 ms |  5.894 ms |  5.7267 ms |  6.163 ms |  1.00 |    0.03 |   9.96 KB |        1.00 |
| DefaultHandshakePipeAsync              | Job-HPXMZE | /main/corerun  |  6.032 ms | 0.1747 ms | 0.2012 ms |  6.001 ms |  5.7647 ms |  6.430 ms |  1.02 |    0.04 |   9.98 KB |        1.00 |

The main brach is main excluding this change, 9.0.0 includes this PR and #103720. Notice mainly the Context benchmarks, and the (new, PR to be raised soon) DefaultMutualHandshakeContext* benchmarks, where the new TLS resume shines. The amount of allocations is a bit weird, I might look into these later when I have time.

@rzikm
Copy link
Member Author

rzikm commented Jun 19, 2024

cc @stephentoub, @ManickaP, since this might look well in your future blog posts

@stephentoub
Copy link
Member

already on my list :)

@karelz karelz added this to the 9.0.0 milestone Jun 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Support TLS Resume with client certificates on Linux
7 participants