-
Notifications
You must be signed in to change notification settings - Fork 4.8k
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
OpenSSL error with Ubuntu 22.04 on Arm32 architecture #66310
Comments
Tagging subscribers to this area: @dotnet/ncl, @vcsjones Issue DetailsWhen attempting to run a .NET app that makes an HTTPS connection with the upcoming release of Ubuntu 22.04 on the Arm32 architecture, it results in an OpenSSL error. This issue will block our upcoming support for Ubuntu 22.04 (see dotnet/core#7038). This only happens in Arm32. Using Arm64 works fine. The easiest way to reproduce this is with a Docker container. But because .NET doesn't work with QEMU, emulation from an x64 machine won't allow you to repro this. You'll need an Arm machine. I've repro'd this on my Raspberry Pi 4 machine. But it also repros on the .NET Docker team's Jetson build machines which are Arm64. Repro
Expected Results:
Actual Results:
|
@dotnet/ncl, @vcsjones - This issue is time-sensitive in order to have support for the upcoming release of Ubuntu 22.04. I'd like to make sure it's triaged soon. |
@mthalman I can reproduce it using the steps you provided on Graviton2 ARM64 instance. I can run Attached is a tcpdump (opens in Wireshark just fine). dump.bin.zip (Learning how to get a tcpdump from a docker container, to a remote VM, to my host was a fun exercise). |
Possibly worth pointing out: this docker image has OpenSSL 3.0.1 on it. |
@mthalman is there a repro machine (the ARM64 one) we could use? I don't think we have arm32 Raspberry Pis handy for investigation :( |
We have build machines at https://dev.azure.com/dnceng/public/_settings/agentqueues?queueId=125&view=agents. I don't have info on how to SSH into these machines. If you need to SSH, you'll need to contact DDFun. |
Information on available Dev systems can be found at https://github.com/dotnet/core-eng/wiki/%5BFR-Operations%5D---Tracking-of-Hardware-not-in-Helix. |
So the problem is that between OpenSSL 1.1 and OpenSSL 3 there has been change in the type of the argument to Hypotesis confirmed with following crude fix (which in turn, breaks arm32 with OpenSSL 1.1) static void SSL_CTX_set_options_fixed(SSL_CTX* ctx, u_int32_t op)
{
void (*func)(SSL_CTX* ctx, u_int64_t op) = (void(*)(SSL_CTX*, u_int64_t))SSL_CTX_set_options;
func(ctx, op);
} |
Probably this can be handled in apibridge? runtime/src/native/libs/System.Security.Cryptography.Native/apibridge.c Lines 781 to 786 in 7414af2
|
that seems like good place. cc: @bartonjs |
apibridge would make it easy for 1.0.2 to call the 3.0 API, but I'm not sure what we'd do for 1.1.x calling it the 3.0 way. We'd need to do something like @rzikm suggested, but detecting the runtime environment to know how to target the call. static uint64_t SSL_CTX_set_options_dynamic(SSL_CTX* ctx, uint32_t options)
{
#ifdef WHATEVER_THE_PORTABLE_DEFINE_IS
if (some 3.0 sentinel function)
{
uint64_t (*func)(SSL_CTX* ctx, u_int64_t op) = (uint64_t(*)(SSL_CTX*, u_int64_t))SSL_CTX_set_options;
return func(ctx, options);
}
else
{
uint32_t (*func)(SSL_CTX* ctx, u_int32_t op) = (uint32_t(*)(SSL_CTX*, u_int32_t))SSL_CTX_set_options;
return func(ctx, options);
}
#else
return SSL_CTX_set_options(ctx, options);
#endif
} |
@mthalman Do you think this is worth backporting to 6.0 so that we can support Ubuntu 22.04 on arm32 earlier than .NET 7 release? |
It's a requirement. And not only for 6.0 but for 5.0 and 3.1 as well. Each of these versions is specified in dotnet/core#7038. |
Opening for backporting |
Release date of Ubuntu 22.04 is April 21, 2022. .NET 5 will reach End of support on May 8, 2022. Do we need backport to .NET 5? |
Probably not. But it'd be worthwhile to post to dotnet/core#7038 indicating what the intention is. |
I think if there is not going to be another release of .NET 5 in those 17 days, we can skip the backport. Just wanted to point out the short window that we have there. |
3.1 is also not relevant, as we don't support OpenSSL 3 with that release. |
We also don't need to fix every bug IMHO. This decision should come from ship room. |
True but this bug effectively makes .NET unusable on this platform for all but the most basic applications. |
amd64 has same issue. "The SSL connection could not be established" .NET SDK (reflecting any global.json): Runtime Environment: |
@skytech-cyber Is the issue on the same callstack and with the same message? I was using OpenSSL 3 locally several times (although on different distro) and have not run into this issue. |
The bug has been fixed in main and in 6.0.5. Backporting to other versions is not needed: .NET 5 is near EOL and .NET 3.1 does not support OpenSSL 3.0. |
When attempting to run a .NET app that makes an HTTPS connection with the upcoming release of Ubuntu 22.04 on the Arm32 architecture, it results in an OpenSSL error. This issue will block our upcoming support for Ubuntu 22.04 (see dotnet/core#7038).
This only happens in Arm32. Using Arm64 works fine. The easiest way to reproduce this is with a Docker container. But because .NET doesn't work with QEMU, emulation from an x64 machine won't allow you to repro this. You'll need an Arm machine.
I've repro'd this on my Raspberry Pi 4 machine. But it also repros on the .NET Docker team's Jetson build machines which are Arm64.
Repro
Get an Arm machine with Docker installed.
Save the following contents to a file named
Dockerfile
in an empty directory:Set the current directory to the directory where the Dockerfile is located.
$ docker build -t test
$ docker run --rm test
Expected Results:
Hello World!
Actual Results:
The text was updated successfully, but these errors were encountered: