Repository navigation
Closed
Labels
area-System.Securityin-prThere is an active PR which will close this issue when it is mergedThere is an active PR which will close this issue when it is mergedos-macosmacOS aka OSXmacOS aka OSX
Milestone
Description
Something changed in macOS 14.4 (compared to 14.3) that caused PEM cert export to start raising Interop+AppleCrypto+AppleCFErrorCryptographicException: The operation couldn’t be completed. (OSStatus error -67738 - CSSM Exception: -2147415780 CSSMERR_CSP_INVALID_KEYATTR_MASK).
The original repro uses dotnet dev-certs to generate and export a self-signed cert aspnetcore uses during local development, but I've included a self-contained repro below.
[Original description below]
Is there an existing issue for this?
- I have searched the existing issues
Describe the bug
Generating https development certificates using this commands throws an exception.
dotnet dev-certs https -v -ep ./test.pem --format Pem --no-password
Interop+AppleCrypto+AppleCFErrorCryptographicException: The operation couldn’t be completed. (OSStatus error -67738 - CSSM Exception: -2147415780 CSSMERR_CSP_INVALID_KEYATTR_MASK)
Full output:
[1] Listing certificates from CurrentUser\My
[2] Found certificates: 1 certificate
1) 9633C9DBE09859140B6AE1051D35540809AD6293 - CN=localhost - Valid from 2024-03-11 23:31:20Z to 2025-03-11 23:31:20Z - IsHttpsDevelopmentCertificate: true - IsExportable: true
[3] Checking certificates validity
[4] Valid certificates: 1 certificate
1) 9633C9DBE09859140B6AE1051D35540809AD6293 - CN=localhost - Valid from 2024-03-11 23:31:20Z to 2025-03-11 23:31:20Z - IsHttpsDevelopmentCertificate: true - IsExportable: true
[5] Invalid certificates: no certificates
[6] Finished listing certificates.
[1] Listing certificates from CurrentUser\My
[2] Found certificates: 1 certificate
1) 9633C9DBE09859140B6AE1051D35540809AD6293 - CN=localhost - Valid from 2024-03-11 23:31:20Z to 2025-03-11 23:31:20Z - IsHttpsDevelopmentCertificate: true - IsExportable: true
[3] Checking certificates validity
[4] Valid certificates: 1 certificate
1) 9633C9DBE09859140B6AE1051D35540809AD6293 - CN=localhost - Valid from 2024-03-11 23:31:20Z to 2025-03-11 23:31:20Z - IsHttpsDevelopmentCertificate: true - IsExportable: true
[5] Invalid certificates: no certificates
[6] Finished listing certificates.
[1] Listing certificates from LocalMachine\My
[2] Found certificates: no certificates
[3] Checking certificates validity
[4] Valid certificates: no certificates
[5] Invalid certificates: no certificates
[6] Finished listing certificates.
[8] Filtered certificates: 1 certificate
1) 9633C9DBE09859140B6AE1051D35540809AD6293 - CN=localhost - Valid from 2024-03-11 23:31:20Z to 2025-03-11 23:31:20Z - IsHttpsDevelopmentCertificate: true - IsExportable: true
[9] Excluded certificates: no certificates
[14] Valid certificates: 1 certificate
1) 9633C9DBE09859140B6AE1051D35540809AD6293 - CN=localhost - Valid from 2024-03-11 23:31:20Z to 2025-03-11 23:31:20Z - IsHttpsDevelopmentCertificate: true - IsExportable: true
[15] Selected certificate: 9633C9DBE09859140B6AE1051D35540809AD6293 - CN=localhost - Valid from 2024-03-11 23:31:20Z to 2025-03-11 23:31:20Z - IsHttpsDevelopmentCertificate: true - IsExportable: true
[23] Saving certificate '9633C9DBE09859140B6AE1051D35540809AD6293 - CN=localhost - Valid from 2024-03-11 23:31:20Z to 2025-03-11 23:31:20Z - IsHttpsDevelopmentCertificate: true - IsExportable: true' to ./test.pem with private key.
[24] Exporting certificate with private key but no password.
[25] Creating directory ..
[26] An error has occurred while exporting the certificate: Interop+AppleCrypto+AppleCFErrorCryptographicException: The operation couldn’t be completed. (OSStatus error -67738 - CSSM Exception: -2147415780 CSSMERR_CSP_INVALID_KEYATTR_MASK)
at Interop.AppleCrypto.TrySecKeyCopyExternalRepresentation(SafeSecKeyRefHandle key, Byte[]& externalRepresentation)
at System.Security.Cryptography.RSAImplementation.RSASecurityTransforms.ExportParameters(Boolean includePrivateParameters)
at System.Security.Cryptography.RSA.WritePkcs1PrivateKey()
at System.Security.Cryptography.RSA.TryExportRSAPrivateKey(Span`1 destination, Int32& bytesWritten)
at System.Security.Cryptography.RSA.WritePkcs8PrivateKey()
at System.Security.Cryptography.RSA.TryExportEncryptedPkcs8PrivateKey(ReadOnlySpan`1 password, PbeParameters pbeParameters, Span`1 destination, Int32& bytesWritten)
at System.Security.Cryptography.AsymmetricAlgorithm.ExportArray[T](ReadOnlySpan`1 password, PbeParameters pbeParameters, TryExportPbe`1 exporter)
at Microsoft.AspNetCore.Certificates.Generation.CertificateManager.ExportCertificate(X509Certificate2 certificate, String path, Boolean includePrivateKey, String password, CertificateKeyExportFormat format).
[26] An error has occurred while exporting the certificate: Interop+AppleCrypto+AppleCFErrorCryptographicException: The operation couldn’t be completed. (OSStatus error -67738 - CSSM Exception: -2147415780 CSSMERR_CSP_INVALID_KEYATTR_MASK)
at Interop.AppleCrypto.TrySecKeyCopyExternalRepresentation(SafeSecKeyRefHandle key, Byte[]& externalRepresentation)
at System.Security.Cryptography.RSAImplementation.RSASecurityTransforms.ExportParameters(Boolean includePrivateParameters)
at System.Security.Cryptography.RSA.WritePkcs1PrivateKey()
at System.Security.Cryptography.RSA.TryExportRSAPrivateKey(Span`1 destination, Int32& bytesWritten)
at System.Security.Cryptography.RSA.WritePkcs8PrivateKey()
at System.Security.Cryptography.RSA.TryExportEncryptedPkcs8PrivateKey(ReadOnlySpan`1 password, PbeParameters pbeParameters, Span`1 destination, Int32& bytesWritten)
at System.Security.Cryptography.AsymmetricAlgorithm.ExportArray[T](ReadOnlySpan`1 password, PbeParameters pbeParameters, TryExportPbe`1 exporter)
at Microsoft.AspNetCore.Certificates.Generation.CertificateManager.ExportCertificate(X509Certificate2 certificate, String path, Boolean includePrivateKey, String password, CertificateKeyExportFormat format)
at Microsoft.AspNetCore.Certificates.Generation.CertificateManager.EnsureAspNetCoreHttpsDevelopmentCertificate(DateTimeOffset notBefore, DateTimeOffset notAfter, String path, Boolean trust, Boolean includePrivateKey, String password, CertificateKeyExportFormat keyExportFormat, Boolean isInteractive).
There was an error exporting HTTPS developer certificate to a file.
.NET Version
8.0.201
Anything else?
> dotnet --info
.NET SDK:
Version: 8.0.201
Commit: 4c2d78f037
Workload version: 8.0.200-manifests.3097af8b
Runtime Environment:
OS Name: Mac OS X
OS Version: 14.4
OS Platform: Darwin
RID: osx-arm64
Base Path: /usr/local/share/dotnet/sdk/8.0.201/
.NET workloads installed:
There are no installed workloads to display.
Host:
Version: 8.0.2
Architecture: arm64
Commit: 1381d5ebd2
.NET SDKs installed:
8.0.201 [/usr/local/share/dotnet/sdk]
.NET runtimes installed:
Microsoft.AspNetCore.App 8.0.2 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 8.0.2 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
Other architectures found:
x64 [/usr/local/share/dotnet/x64]
Environment variables:
Not set
global.json file:
Not found
Reacted by Waldek Mastykarz
Metadata
Metadata
Assignees
Labels
area-System.Securityin-prThere is an active PR which will close this issue when it is mergedThere is an active PR which will close this issue when it is mergedos-macosmacOS aka OSXmacOS aka OSX
Activity
cpboyd commentedon Mar 13, 2024
Also facing the same issue. Removing
--no-passwordallows the command to succeed, but this option is used in several SPA projects generated by Visual Studio.Edit: Ah, the issue is with exporting the private
.keyfile. Without--no-password, it doesn't generate the.keyfile.Specifying
--password testinstead results in the same error.Even trying to run the commands as
sudostill results in the same error.cpboyd commentedon Mar 13, 2024
Ok. I've found a workaround.
First, find the trusted cert file:
Next, use
opensslto extract the info (replace<cert-ID>with the unique ID):When prompted for a password, just press Return/Enter.
Then you need to further split the
PRIVATE KEYblock into its own file<filename>.key:And the
CERTIFICATEas well into a matching<filename>.cert:It's not very straight-forward, but it seems like
dotnet dev-certshas been deprecated and hasn't seen updates in quite some time: https://www.nuget.org/packages/dotnet-dev-certsholm-dk commentedon Mar 13, 2024
You can also generate the self-signed SSL certificate for localhost and key using openssl:
Only that NuGet package is deprecated,
dotnet dev-certsis not (it's no longer a "tool").cpboyd commentedon Mar 13, 2024
@thj-dk I guess the main thing that the dotnet cert is supposed to add over that is that it's trusted by the system. (Which, yes, you could manually trust the cert generated via openssl as well.)
amcasey commentedon Mar 13, 2024
Yep, the in-box version of
dotnet dev-certsis still very much supported, though the tool itself is fairly simple and doesn't change very often.The call in question appears to be https://github.com/dotnet/aspnetcore/blob/702ba39ace967037a3f726765732e3e63f80907e/src/Shared/CertificateGeneration/CertificateManager.cs#L506
Unfortunately, Apple appears to use that error code for a number of different conditions, making it hard to debug by inspection. We may need to pull in https://github.com/dotnet/runtime for their understanding of the PAL.
amcasey commentedon Mar 13, 2024
I tried pulling out the important calls from dev-certs. Does this throw the same exception?
I'd ask for a copy of the cert, but exporting seems to be the crux of the issue. 😆
amcasey commentedon Mar 13, 2024
Huh, a colleague happened to be on 14.3 and it didn't repro there, but it did start failing in this way after upgrading to 14.4. Didn't see that coming.
amcasey commentedon Mar 13, 2024
Self-contained repro
[-]Error generating https certificate on macOS Sonoma 14.4[/-][+]Error exporting https certificate on macOS Sonoma 14.4[/+]vcsjones commentedon Mar 14, 2024
Thanks for the self-contained repro @amcasey. I'll take a look.
4 remaining items
jachin84 commentedon Mar 14, 2024
I just hit this as well Sonoma 14.4.
vcsjones commentedon Mar 14, 2024
I think I got a fix. Doing validation.
vcsjones commentedon Mar 14, 2024
The gist of the problem is that Apple changed the error code returned here
runtime/src/libraries/Common/src/Interop/OSX/System.Security.Cryptography.Native.Apple/Interop.SecKeyRef.cs
Line 144 in b181ed5
Instead of errSecPassphraseRequired, we are getting errSecInvalidKeyAttributeMask back, so our error handling doesn't happen.
waldekmastykarz commentedon Mar 14, 2024
We're also affected by this issue in Dev Proxy, and it's preventing us from inspecting HTTPS traffic. Can't wait to try the fix. Thank you so much for patching it so quickly! 👏
vcsjones commentedon Mar 14, 2024
Reopened for backports.
vcsjones commentedon Mar 25, 2024
This has been fixed. The fix will be available in 8.0.4, 7.0.18, and 6.0.29. Since back ports are complete, I am going to close this out.
johndobrien commentedon Apr 3, 2024
Where can I get 8.0.4?
vcsjones commentedon Apr 3, 2024
It is not released yet. It will be part of the April release of .NET, which I think is in the next week or two.
aintabb commentedon Apr 3, 2024
@johndobrien In the meantime, you could use the solution mentioned here temporarily, #99735 (comment)
It worked for me.
jaspreetsinghmahal commentedon Apr 7, 2024
My God this issue has been driving me crazy for last 2 hours, thanks finally for this