Thinktecture IdentityServer v3 指南 - 证书

Posted

技术标签:

【中文标题】Thinktecture IdentityServer v3 指南 - 证书【英文标题】:Guidance on Thinktecture IdentityServer v3 - certificates 【发布时间】:2014-12-26 13:21:33 【问题描述】:

我正在制作 Thinktecture IdentityServer v3 的演示。目的是让身份服务器在 Azure 网站下作为它自己的网站运行。

会有其他(不止一个)Azure 网站使用身份服务器对用户进行身份验证。

根据入门演练(请参阅https://github.com/thinktecture/Thinktecture.IdentityServer.v3/wiki/Getting-started),我大部分都在工作。

我遇到问题的地方是证书。

对于演示,我想创建自己的证书 - 但我不确定我需要做什么。任何指导都会有所帮助。

我对此还有其他问题:

    是否可以使用自签名证书? 在生产场景中,是否可以接受自签名证书,或者它们真的需要由受信任的根授权机构签名? 如何将这些证书安装到 Azure 网站(或者我可以从磁盘加载)

【问题讨论】:

也有同样的疑问。我能够按照入门指南创建服务器,但我现在正尝试将它托管在我的本地 IIS 上,但我也迷失在证书部分。 非常令人沮丧的是文档如何假设每个人都是证书专家 【参考方案1】:

嗯 - 严格来说,您需要两个证书 - 一个用于 SSL,一个用于签名 - 从技术上讲,它们可能是相同的 - 但不是必须的。他们也有不同的要求。

对于 SSL - 您需要有一个在您的客户端的受信任列表中的证书。通常,这要么是来自商业 CA 的证书,要么来自内部 PKI。

对于签名证书 - 您可以生成自己的 - 例如使用 makecert。

IdSrv 在加载证书方面非常灵活 - 您可以从任意来源检索它们 - 通常来自 Windows 证书存储(当您对服务器具有管理员级别的访问权限时) - 或文件系统,或来自嵌入式资源。

我们的示例主机使用嵌入式资源方法,该方法适用于 Azure 网站。对于生产场景,您通常需要更大的灵活性(例如翻转) - 所以我会考虑从例如加载它Blob 存储。

【讨论】:

其实根据Trace.log,好像有一些要求。例如:1) 最小长度 = 2048 位。 2) 如果私钥不可用,'willBeUseForSigning' 应该为 false。我说的对吗? @leastprivilege 我克隆了您的 IdentityServer3.Samples 存储库,我按照有关如何安装证书的说明进行操作,但它似乎对我不起作用。我不断收到“无法建立信任关系”。我正在尝试运行 Simplest.OAuth.Walkthrough 示例。我运行 IdSrv,然后运行客户端,在 GetClientToken() 处出现错误。有什么解决办法吗? “无法建立信任”错误来自 SSL,与 IdentityServer 无关。您需要正确设置 SSL。【参考方案2】:

扩展最低权限的答案,我认为“正确”的方法是将它们安装在 Azure 信任库中,但在我的情况下,我从嵌入式资源中提供它们,如 idsrv3 示例中所示。

这里有一些对我有用的细节。创建自签名证书:

        "C:\Program Files (x86)\Windows Kits\8.1\bin\x64\makecert.exe" -r -pe -n "CN=MyAppIdentity" -sky signature MyApp.cer -sv MyApp.pvk
        "C:\Program Files (x86)\Windows Kits\8.1\bin\x64\pvk2pfx.exe" -pvk MyApp.pvk -spc MyApp.cer -pfx MyApp.pfx -pi MyPassword -po MyPassword

尽管有 pvk2pfx.exe 文档,但我发现如果未提供 -po,则 pfx 不会保留与 pvk 相同的密码,并且 X509Certificate2() 会因密码问题而失败。

idsrv3 示例证书在我的 Azure 上运行良好,使用 idsrv3 示例代码:

        var assembly = typeof(Certificate).Assembly;
        using (var stream = assembly.GetManifestResourceStream("MyCompany.Identity.Website.Config.idsrv3test.pfx"))
        
            return new X509Certificate2(ReadStream(stream), "idsrv3test");
        

但是,当我使用上面的代码制作自己的证书时,它在本地测试中运行良好,但在 Azure 上,我必须添加一些额外的标志才能使其正常工作。我不一定确定使用这些的含义,但它们有效,所以这是一个开始:

        using (var stream = assembly.GetManifestResourceStream("MyCompany.Identity.Website.Config.MyApp.pfx"))
        
            return new X509Certificate2(ReadStream(stream), 
                "MyPassword", 
                X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);
        

【讨论】:

很好的答案,谢谢。在我添加这些附加标志之前,我也无法让我的密钥(使用 OpenSSL 创建)一旦部署到 Azure 就可以工作。你确定过这些标志的含义吗? MS 文档并没有真正的帮助。这个家伙有一个非常易读的讨论,提示 #4 提供了更多信息:paulstovell.com/blog/x509certificate2

以上是关于Thinktecture IdentityServer v3 指南 - 证书的主要内容,如果未能解决你的问题,请参考以下文章

在 web api 中验证 Thinktecture OAuth 令牌

如何在 Thinktecture Identity Server 中加密 JWT 令牌?

Thinktecture 身份服务器与授权服务器

Thinktecture IdentityServer v3 和 SAML

Thinktecture IdentityServer v3 指南 - 证书

.NET开源OpenID和OAuth解决方案Thinktecture IdentityServer