runtime: WindowsCryptographicException when using symlink as X509Certificate source
Hi there!
I’d like to use a symlink for constructing my X509Certificate. Currently I’m encoutering a Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Unspecified error
with the following code :
var file = "C:\\ProgramData\\Docker\\secrets\\link.pfx"; // symlink to a pfx file
var cert = new X509Certificate2(File.ReadAllBytes(file)); // <-- works well
Console.WriteLine(cert.ToString());
var cert2 = new X509Certificate2(file); // <-- exception thrown here
Console.WriteLine(cert2.ToString());
I know that this issue is already known (although I can’t find the issue in this repo) as @bartonjs which seems to be responsible of the System.Security area already replied about it on stackoverflow (see here)
The work around suggested work BUT let me show you a use case that become much more complicated :
When working with AspNet Core using Kestrel in a Windows container orchestrated by Docker Swarm, I would love to use secrets for my SSL certificates (SSL Offloading on a proxy is not an option in my case). Unfortunately, Docker secrets are symbolic links. Therefore, to make it work I have to go from just declaring the secret and an environment variable (Kestrel__Certificates__Default__Path) to tuning Kestrel and load manually the certificate.
Do you plan to fix this ? My guess is, that’s coming from CryptQueryObject in crypt32.
Just in case it’s needed :
C:\ProgramData\Docker\secrets>dotnet --info
SDK .NET Core (reflétant tous les global.json) :
Version: 2.1.500-preview-009335
Commit: f73e21a7d8
Environnement d'exécution :
OS Name: Windows
OS Version: 10.0.17134
OS Platform: Windows
RID: win10-x64
Base Path: C:\Program Files\dotnet\sdk\2.1.500-preview-009335\
Host (useful for support):
Version: 2.1.5
Commit: 290303f510
and
Internal.Cryptography.CryptoThrowHelper+WindowsCryptographicException: Unspecified error
at Internal.Cryptography.Pal.CertificatePal.FromBlobOrFile(Byte[] rawData, String fileName, SafePasswordHandle password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(String fileName, String password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(String fileName, String password)
About this issue
- Original URL
- State: open
- Created 6 years ago
- Reactions: 2
- Comments: 15 (9 by maintainers)
For people stuck on this issue (maybe I’m not alone trying to do this?), here is a workaround : Instead of using the path of the secret such as
"C:\\ProgramData\\Docker\\secrets\\<mySecretName>", it is possible to use the “internal” path"C:\\ProgramData\\Docker\\internal\\secrets\\<mySecretId>"However, as explained in the doc here, it shouldn’t be relied upon. Use with care.