鉴于下面描述的错误,人们如何在 Ubuntu/Docker 上的 ASP.NET 核心 Web API 中进行身份验证?
How are people authenticated in their ASP.NET Core Web APIs on Ubuntu/Docker given the bug described below?
我遇到了一个我认为是阻止我在 Ubuntu 或 Microsoft 提供的基于 Debian 的 docker 图像上加载 X509Certificate2 的错误。这意味着我无法在这些平台上的 Web API 中初始化 JwtAuthentication,我正在寻求帮助:
- 您是否在 Linux 上成功使用 JwtAuthentication?
- 如果是这样,您如何为 JwtBearerOptions 初始化 X509Certificate?
- 你能看出我正在做的事情有问题吗,或者建议解决方法或解决方案?
我已经将问题记录在 corefx 团队,您可以看到完整的讨论 here,但下面是问题的主要描述:
我在 docker 容器中有一个 Web API 运行。容器是从提供的 1.1.0 包构建的:
FROM microsoft/aspnetcore:1.1.0
和 Web API 二进制文件被复制进来。API 运行正常并且 returns 数据按预期运行,直到我打开身份验证,此时它需要一个 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);
我遇到了一个我认为是阻止我在 Ubuntu 或 Microsoft 提供的基于 Debian 的 docker 图像上加载 X509Certificate2 的错误。这意味着我无法在这些平台上的 Web API 中初始化 JwtAuthentication,我正在寻求帮助:
- 您是否在 Linux 上成功使用 JwtAuthentication?
- 如果是这样,您如何为 JwtBearerOptions 初始化 X509Certificate?
- 你能看出我正在做的事情有问题吗,或者建议解决方法或解决方案?
我已经将问题记录在 corefx 团队,您可以看到完整的讨论 here,但下面是问题的主要描述:
我在 docker 容器中有一个 Web API 运行。容器是从提供的 1.1.0 包构建的:
FROM microsoft/aspnetcore:1.1.0
和 Web API 二进制文件被复制进来。API 运行正常并且 returns 数据按预期运行,直到我打开身份验证,此时它需要一个 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);