Thinktecture IdentityServer v3指南 - 证书

20

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

将有其他(不止一个) Azure网站使用身份验证服务器来认证用户。

根据入门指南(请参见https://github.com/thinktecture/Thinktecture.IdentityServer.v3/wiki/Getting-started),我已经基本实现了这个目标。

我的问题在于证书。

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

我对此还有其他问题:

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

1
同样有相同的问题。我能够按照入门指南创建服务器,但现在我正在尝试将其托管在我的本地IIS上,但我也迷失在证书部分。 - jpgrassi
2
非常令人沮丧的是,文档假定每个人都是证书专家。 - Simon_Weaver
2个回答

21

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

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

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

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

我们的示例主机使用了嵌入式资源方法,这对于Azure WebSites运作良好。对于生产场景,您通常需要更多的灵活性(例如进行卷动),因此我建议考虑从blob存储等地方进行加载。


根据Trace.log,实际上似乎有一些要求。例如:1)最小长度为2048位。2)如果私钥不可用,则“willBeUseForSigning”应为false。我是对的吗? - Cristian E.
1
@leastprivilege 我克隆了您的IdentityServer3.Samples存储库,我按照安装证书的说明进行操作,但似乎对我不起作用。我不断收到“无法建立信任关系”的错误。我正在尝试运行Simplest.OAuth.Walkthrough示例。我先运行IdSrv,然后运行Client,但在GetClientToken()时出现错误。有什么解决方法吗? - Pepito Fernandez
“无法建立信任”错误来自SSL,与IdentityServer无关。您需要正确设置SSL。 - leastprivilege

11

在 least privilege 的基础上,我认为“正确”的方法是将它们安装在 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()时会因密码问题而失败。

对我来说,在Azure上使用idsrv3示例代码时,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);
        }

1
非常好的答案,谢谢。在部署到 Azure 后,我也无法让我的 OpenSSL 创建的密钥正常工作,直到我添加了这些额外的标志。你有没有确定这些标志的影响? - Joshua
1
微软的文档并没有真正提供帮助。这位仁兄有一个相当易读的讨论,提示#4提供了更多信息:http://paulstovell.com/blog/x509certificate2 - bitcoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接