【问题标题】:ASP.NET Core OpenIdConnectServer data protection keys locationASP.NET Core OpenIdConnectServer 数据保护密钥位置
【发布时间】:2017-02-17 15:26:44
【问题描述】:

你好,

在我的 ASP.NET Core 应用程序中,我使用 OpenIdConnectServer 进行 Api 身份验证。一切正常。

但有一件事我无法解决 - 如何设置自定义文件夹以保存令牌签名密钥?

在服务配置中我有:

services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"keys/"));

第一次运行后,会在那里创建一个应用程序密钥。 但是 OpenIdServer 以某种方式自行管理密钥。

app.UseOpenIdConnectServer(options => {
    ...
    options.DataProtectionProvider = app.ApplicationServices.GetDataProtectionProvider();
    ...
});

尽管如此,凭证签名密钥是在默认位置创建的:

 A new RSA key ... persisted on the disk: /home/.../.aspnet/aspnet-contrib/oidc-server/<some guid>.key.

这是错误还是功能?如何强制服务器将密钥也存储在 keys/ 文件夹中?


摘要 - 我为什么要这样做

我的想法是从 n 的 docker 镜像构建一个 API,将其隐藏在负载均衡器后面并在云中的某个地方运行。问题是 - 当 docker 中的每个实例创建它自己的应用程序和签名密钥时,加密的身份验证令牌将不适用于任何其他实例,除了已创建并使用其密钥签署令牌的实例。 因此,我试图将相同的密钥分发给每个运行的 docker 映像。如果可能,到预定义的应用程序文件夹。

或者有没有更好的方法或最佳实践?


提前谢谢你。

【问题讨论】:

  • 仅供参考,OIDC 服务器中间件不会改变 DataProtection 密钥的管理方式,但它并不是它使用的唯一密钥,因为实际上有 2 个单独的序列化机制,如 stackoverflow.com/questions/38541772/authorize-via-jwt-token/… 中所述。您看到的调试消息由内部 RSA 密钥生成功能记录,该功能为 id_token 签名创建非对称密钥。请注意,此功能主要用于开发目的,将在下一个测试版(beta7)中删除。

标签: c# asp.net-core asp.net-core-1.0 openid-connect aspnet-contrib


【解决方案1】:

好吧,我想通了。

首先,我们必须生成一个 x509 证书(带有私钥),如 here 所述

openssl genrsa -out private.key 1024
openssl req -new -x509 -key private.key -out publickey.cer -days 365
openssl pkcs12 -export -out certificate.pfx -inkey private.key -in publickey.cer

将其复制到您喜欢的文件夹中,在本例中为key/certificate.pfx

然后,轻轻地将您的新证书插入 OpenIdConnectServer:

appsettings.json

"Keys": {
    "CertificatePath": "keys/certificate.pfx",
    "CertificatePassword": "<password you provider>"
}

Startup.cs

private X509Certificate2 CreateOauthCertificate(){
        var path = Configuration["Keys:CertificatePath"];
        var password = Configuration["Keys:CertificatePassword"];
        return new X509Certificate2(path, password);
    }

Starup.cs - 配置

app.UseOpenIdConnectServer(
    ...
    options.SigningCredentials.AddCertificate(CreateOauthCertificate());
    ...
});

现在我很好奇是否有更好的方法。

但这行得通。

问候

【讨论】:

  • 我想知道一点。如果您将CertificatePathCertificatePassword 存储到环境变量中(或使用秘密管理工具存储)而不是appsettings.json,它不会按预期工作吗?
  • 这完全是正确的做法(它甚至会成为 beta7 的强制要求,因为 RSA 密钥生成功能将被删除)。
  • @ademcaglin 我想这也应该有效。这里我选择了json方式进行清晰的演示。
  • 谢谢@rudolfdobias。我只是想了解使用 appsettings 是否有特殊原因(我想知道这是否是 docker 特定情况)。
  • @ademcaglin 在这种情况下 - 我在 CI 构建时从 AWS S3 加载配置文件和密钥。证书以某种二进制格式存储,无论如何我都无法放入 env 变量。 json 中有很多设置可以在 envs 中定义它。更好的方法是通过 AWSSDK.S3 文件系统直接从应用程序启动连接到 S3。
猜你喜欢
  • 1970-01-01
  • 2016-06-17
  • 2019-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
相关资源
最近更新 更多