-
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
Jose.JoseException: Unable to sign content #94959
Comments
Tagging subscribers to this area: @dotnet/area-system-security, @bartonjs, @vcsjones Issue DetailsDescriptionHi there, After upgrading to .net 8.0, I am getting above error, I am using ES256 algorithm to sign the JWT using jose-jwt library here is a full stack: [17:12:14 ERR] HTTP POST /api/v1/auth/login responded 500 in 291.7296 ms I already checked #59703 but it didn't help. Kindly review and any help would be appreciated. Thanks, Reproduction Stepsvar payload = new Dictionary<string, object> Crashing when running JWT.Encode() methode Expected behaviorIt should sign the JWT and should not throw exception Actual behaviorThrowing exception when calling JWT.Encode method: Regression?No response Known WorkaroundsNo response ConfigurationRuntime Environment: .NET workloads installed: Host: .NET SDKs installed: .NET runtimes installed: Other architectures found: Other informationNo response
|
I attempted to reproduce the issue with the following code and was unable to. using System;
using System.Collections.Generic;
using System.Security.Cryptography;
var payload = new Dictionary<string, object>
{
{ "iss", "kevin's console application" },
{ "aud", "production" },
{ "sub", "42" },
{ "iat", DateTimeOffset.UtcNow.ToUnixTimeSeconds() },
{ "exp", DateTimeOffset.UtcNow.AddMinutes(3600).ToUnixTimeSeconds() }
};
var privateKey = ECDsa.Create(ECCurve.NamedCurves.nistP256);
string encoded = Jose.JWT.Encode(payload, privateKey, Jose.JwsAlgorithm.ES256);
Console.WriteLine(encoded); <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="jose-jwt" Version="4.1.0" />
</ItemGroup>
</Project> Does that code crash for you as well? A particular question comes to mind - how are you loading Any additional information you can provide to help reproduce the issue would be greatly appreciated. |
This issue has been marked |
Hi Kevin Thanks for the updates. Here is how I am creating a private key: _jwtSettings = jwtSettings; Attaching the pfx file for reference. I am not sure but I am on macos 14.1.1 if that makes any difference. Thanks, |
I can reproduce this now. It looks like we have a lifetime issue with the private key. Steps to reproduce: using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using ECDsa ca = ECDsa.Create(ECCurve.NamedCurves.nistP256);
CertificateRequest req = new("CN=potatos", ca, HashAlgorithmName.SHA256);
X509Certificate2 cert = req.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddDays(3));
X509Certificate2 loaded = new X509Certificate2(cert.Export(X509ContentType.Pkcs12, "carrots"), "carrots");
ECDsa signingKey = loaded.GetECDsaPrivateKey()!;
loaded.Dispose();
signingKey.SignHash(new byte[32]); This throws for me. The ECDsa key's lifetime is not independent of the certificate. @binoypatel you can work around this by not disposing of the |
Works like a charm! Thank you so much Kevin, it works with the suggestion you made. Kind regards, |
@binoypatel I am going to keep this open because this is not supposed to be happening. I think there is something that needs to be addressed for .NET 9 or even fixed for .NET 8. But I am glad you are unblocked for now. |
This comment was marked as off-topic.
This comment was marked as off-topic.
Thanks Kevin, not an expert in this field but yes you are right using supposed to be working as in .net 7, and should be addressed in either.net 8 or .net 9. |
I did a quick bisect and determined that this bug was introduced by 28f958d in PR #82205. Using this unit test [Fact]
public static void Repo94959()
{
using ECDsa ca = ECDsa.Create(ECCurve.NamedCurves.nistP256);
CertificateRequest req = new("CN=potatos", ca, HashAlgorithmName.SHA256);
X509Certificate2 cert = req.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddDays(3));
X509Certificate2 loaded = new X509Certificate2(cert.Export(X509ContentType.Pkcs12, "carrots"), "carrots");
ECDsa signingKey = loaded.GetECDsaPrivateKey()!;
loaded.Dispose();
signingKey.SignHash(new byte[32]);
} Before revert:
Then do After reverting the test passes. /cc @filipnavara |
The reference counting strikes again. I am not sure when I will be able to look into it. Having the test helps a lot though, thanks! |
@filipnavara I will try to look at this in parallel with you. Just looping you in incase anything immediately came to mind. |
I don't suppose Apple has given us a way to make SecIdentity(Ref) without a keychain, yet? :) |
Nope. There's a private API ( PR #82205 fixed several reference counting mismatches which resulted both in extra decrements and extra increments, so this only worked by accident. All the
I would prefer the former. |
This is more or less what we were doing before with the
It might be messy, but I feel that it would generally be more well understood and easier to reason about it. It would not require special casing on the key's exportability, either. |
|
Description
Hi there,
After upgrading to .net 8.0, I am getting above error, I am using ES256 algorithm to sign the JWT using jose-jwt library
here is a full stack:
[17:12:14 ERR] HTTP POST /api/v1/auth/login responded 500 in 291.7296 ms
Jose.JoseException: Unable to sign content.
---> Interop+AppleCrypto+AppleCFErrorCryptographicException: The operation couldn’t be completed. (OSStatus error 100000 - CSSM Exception: 100000 UNIX[Undefined error: 0])
at Interop.AppleCrypto.NativeCreateSignature(SafeSecKeyRefHandle privateKey, ReadOnlySpan1 dataHash, PAL_HashAlgorithm hashAlgorithm, PAL_SignatureAlgorithm signatureAlgorithm) at Interop.AppleCrypto.CreateSignature(SafeSecKeyRefHandle privateKey, ReadOnlySpan1 dataHash, PAL_HashAlgorithm hashAlgorithm, PAL_SignatureAlgorithm signatureAlgorithm)
at System.Security.Cryptography.ECDsaImplementation.ECDsaSecurityTransforms.SignHash(Byte[] hash)
at System.Security.Cryptography.ECDsa.SignData(Byte[] data, Int32 offset, Int32 count, HashAlgorithmName hashAlgorithm)
at Jose.netstandard1_4.EcdsaUsingSha.Sign(ECDsa privateKey, Byte[] securedInput)
at Jose.netstandard1_4.EcdsaUsingSha.Sign(Byte[] securedInput, Object key)
--- End of inner exception stack trace ---
at Jose.netstandard1_4.EcdsaUsingSha.Sign(Byte[] securedInput, Object key)
at Jose.JWT.EncodeBytes(Byte[] payload, Object key, JwsAlgorithm algorithm, IDictionary2 extraHeaders, JwtSettings settings, JwtOptions options) at Jose.JWT.Encode(String payload, Object key, JwsAlgorithm algorithm, IDictionary2 extraHeaders, JwtSettings settings, JwtOptions options)
at Jose.JWT.Encode(Object payload, Object key, JwsAlgorithm algorithm, IDictionary`2 extraHeaders, JwtSettings settings, JwtOptions options)
I already checked #59703 but it didn't help. Kindly review and any help would be appreciated.
Thanks,
Binoy
Reproduction Steps
var payload = new Dictionary<string, object>
{
{ "iss", _jwtSettings.Issuer! },
{ "aud", _jwtSettings.Audience! },
{ "sub", userId },
{ ApplicationClaims.FullName, displayName! },
{ ApplicationClaims.ProductKind, productKind },
{ ApplicationClaims.Timezone, timezone },
{ "email", email },
{ ApplicationClaims.TenantId, tenantId },
{ "iat", DateTimeOffset.UtcNow.ToUnixTimeSeconds() },
{ "exp", DateTimeOffset.UtcNow.AddMinutes(_jwtSettings.Validity).ToUnixTimeSeconds() }
};
return Jose.JWT.Encode(payload, _privateKey, Jose.JwsAlgorithm.ES256);
Crashing when running JWT.Encode() methode
Expected behavior
It should sign the JWT and should not throw exception
Actual behavior
Throwing exception when calling JWT.Encode method:
Jose.JoseException: Unable to sign content.
---> Interop+AppleCrypto+AppleCFErrorCryptographicException: The operation couldn’t be completed. (OSStatus error 100000 - CSSM Exception: 100000 UNIX[Undefined error: 0])
Regression?
No response
Known Workarounds
No response
Configuration
Runtime Environment:
OS Name: Mac OS X
OS Version: 14.1
OS Platform: Darwin
RID: osx-arm64
Base Path: /usr/local/share/dotnet/sdk/8.0.100/
.NET workloads installed:
Workload version: 8.0.100-manifests.6c33ef20
There are no installed workloads to display.
Host:
Version: 8.0.0
Architecture: arm64
Commit: 5535e31
.NET SDKs installed:
8.0.100 [/usr/local/share/dotnet/sdk]
.NET runtimes installed:
Microsoft.AspNetCore.App 8.0.0 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 8.0.0 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Other architectures found:
x64 [/usr/local/share/dotnet/x64]
registered at [/etc/dotnet/install_location_x64]
Other information
No response
The text was updated successfully, but these errors were encountered: