我正在研究Thinktecture IdentityServer v3的演示。目的是让身份服务器在Azure网站下运行它自己的网站。
将有其他(多个)Azure网站将使用身份服务器对用户进行身份验证。
根据入门演练(请参阅https://github.com/thinktecture/Thinktecture.IdentityServer.v3/wiki/Getting-started),我的主要是。
我遇到麻烦的地方是证书。
对于演示,我想创建自己的证书 - 但我不确定我需要做什么。任何指导都会有所帮助。
我对此有其他疑问:
答案 0 :(得分:21)
嗯 - 严格来说,你需要两个证书 - 一个用于SSL,一个用于签名 - 技术上它们可以是相同的 - 但不必。他们也有不同的要求。
对于SSL - 您需要拥有一个位于客户可信列表中的证书。通常,这可以是商业CA的证书 - 也可以是内部PKI。
对于签名证书 - 您可以生成自己的 - 例如使用makecert。
IdSrv在加载证书时非常灵活 - 您可以从任意来源检索它们 - 通常来自Windows证书存储(当您具有管理级别访问服务器时) - 或文件系统,或来自嵌入式资源。
我们的示例主机使用嵌入式资源方法,该方法适用于Azure网站。对于生产方案,您通常需要更大的灵活性(例如,翻转) - 所以我会考虑从例如加载它blob存储。
答案 1 :(得分:11)
扩展最小特权回答我认为“正确”的方法是将它们安装在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示例代码,idsrv3示例证书在我的azure上工作正常:
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);
}