考虑到下面描述的错误,人们如何在Ubuntu/Docker上的ASP.NET核心Web API中进行身份验证



我遇到了一个错误,我认为它阻止我在Ubuntu或微软提供的基于Debian的docker映像上加载X509Certificate2。这意味着我无法在这些平台上的web API中初始化JwtAuthentication,我正在寻求帮助:

  1. 您在Linux上成功使用JwtAuthentication了吗
  2. 如果是,您如何初始化JwtBearerOptions的X509证书
  3. 你能看到我正在做的事情有问题吗,或者建议一个变通办法或解决方案吗

我已经与corefx团队记录了这个问题,你可以在这里看到完整的讨论,但下面是问题的主要描述:


我有一个Web API在docker容器中运行。该集装箱由提供的1.1.0包装制成:

FROM microsoft/aspnetcore:1.1.0

和Web API二进制文件被复制到中。API运行良好,并按预期返回数据,直到我打开身份验证,此时它需要X509SecurityKey来设置TokenValidationParameters.IssuerSigningKey值。当它试图从字符串值初始化X509Certificate2时,会引发异常:

string certValue = certificate.Value;
byte[] byteCert = Encoding.ASCII.GetBytes(certValue);
return new X509Certificate2(byteCert);

引发OpenSslCryptographicException:

Unhandled Exception: System.Exception: Failed to extract the Token Signing certificate from the Federation metadata. ---> 
Interop+Crypto+OpenSslCryptographicException: error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error
at Internal.Cryptography.Pal.CertificatePal.FromBlob(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] data)
at Mercury.Shared.Rest.Authentication.AdfsFederationMetadata.GetSigningCertificate()

X509Certificate2的初始化字符串值为:

MIIC4jCCAcqgAwIBAgIQHWt3kGySgJxPtsalC0EoKzANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDEyJBREZTIFNpZ25pbmcgLSBzdHMuYWxsYW5ncmF5LmNvLnphMB4XDTE2MDkwNzA5MDQyM1oXDTE3MDkwNzA5MDQyM1owLTErMCkGA1UEAxMiQURGUyBTaWduaW5nIC0gc3RzLmFsbGFuZ3JheS5jby56YTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANdq9BEuBRPsTdpngeFyXbfH5lBg5WyENQW0qz2FtDw3AvZhiPdFyvTPZIeZDc4vhg+gPuG8pCxhFa6hPqNIwnLSVuyhUi4/CtZrLghF2wVVcyriijvirzdVp2m56nO31NB5HXbSerTmey1gJsgumr+MiaM2CEI9z5ctwAp66jqM9jVv7kzqIwB33irSck+X97jUa9XVa0/0QPBdrSVUR0i4rmfZ9orRdTKC3IA13bD9duk2Kc9V7t8t/woo80Kbbb3ZseYk5N8AI+7RRw9+oSAm8zZQzBYkNkAMeI1mto1faXsm9Aea4HXbyCbvVOx/JGj5Ki7YK/BtzWAyCgRu0TkCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAd9rdJ1V9te8njMHiEuvr1DLVUBt2YdpZ8qGFC2rWDKeEW8iARrMfbtrlQovvE1radxoZ2gWR1AaaoEqzmLvF9fEAZ7xjR2P2UlT+ZgntfMn/c+3j7gWnfGNHIjosaYiyF72q4k6bgOx1TV8X08kD2AMBH27utXeeUQTZTd0bUWaWpr76NrDB95k4P6d0t5bkYsguiQjV+2t5/dSvrbTPVbXQmWGyC53IS2OI37AI2bIaeCCDkRHDoxu+L/DtgH8N60k2CLfa+pf0/cxQCR39p4Z+tquVKfYgJIsdZLD6bbrqK9VdpSR2vyUcDLMTGnO0tuDuzBd/xdhJ0GKbnBv3+g==

同样的代码在Windows上运行时没有问题,使用相同的字符串生成证书。

编辑:注意,虽然我最初在运行docker映像时遇到了这个问题,但随后的测试表明,使用Ubuntu 14.04+.NET Core 1.1时也会出现这个问题

这里的问题是传递给构造函数的是键的base64表示形式的字节,而不是键本身的字节。

如果这段代码在Windows上有效,那么在.net核心github中创建一个引用这个问题的问题可能是个好主意。

谢谢你的回答。对于那些想复制和粘贴的人:

var certificateWithoutHeaderAndFooter = certificateString
.Replace("\n","")
.Replace("-----BEGIN CERTIFICATE-----", "") 
.Replace("-----END CERTIFICATE-----", "");
var certificateBytes = Convert.FromBase64String(certificateWithoutHeaderAndFooter);
var certificate = new X509Certificate2(certificateBase64Bytes);

最新更新