以编程方式将证书导入 IIS?

Posted

技术标签:

【中文标题】以编程方式将证书导入 IIS?【英文标题】:Programmatically import cert into IIS? 【发布时间】:2011-05-28 18:01:32 【问题描述】:

我有一个用于 SSL 的 .pem 证书,我想在 MSI 中将它与我的 Web 应用程序一起分发(必须在客户的计算机上运行)。然后我需要将它导入(到一些凭据存储中?)并告诉我的站点绑定使用它。但是我怎么能在代码中做到这一点?我发现了 Microsoft.Web.Administration,但不知道从那里去哪里……

顺便说一句,这是在 IIS7 中。

编辑:这里的目标是拥有一个客户可以在他们的 Intranet 上运行的 Web 应用程序。它主要充当 iPhone 应用程序的 API。 (也许这不是最好的设计,但我们现在被锁定了。)所以客户安装了 MSI,瞧,他们有一个网络服务。现在需要在 iPhone 和 Web 服务之间进行密码验证;最简单的方法似乎是在 https 中进行。所以我做了一个自签名证书。

我知道重新分发单个证书通常不是一个好主意,但我们只是想在这里击败临时黑客……这将仅限于 Intranet,并且仅限于企业,似乎不太可能有人会这样做做的事情太疯狂了,而且 API 严格限制了你可以对数据库做的坏事的数量。

所以我们开始了,目标是在 Intranet Web 应用程序上进行密码验证,一键安装。 :-D

【问题讨论】:

有趣的问题,但您真的想重复使用 SSL 证书吗?即使这是为您自己的 Web 应用程序服务的大型集群的一键式部署,您也可能希望对您的证书更加小心。 请注意,使用自签名证书仍然可以进行中间人操作,除非所有客户端电话在联系 API 之前都在其受信任的根证书存储中预先安装了此证书。 【参考方案1】:

亲爱的读者,答案是这样的:

// Assume 'site' is already set to your site via something like 
// Site site = mgr.Sites.Add(siteName, directory, 443);

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);

// Here, directory is my install dir, and (directory)\bin\certificate.pfx is where the cert file is.
// 1234 is the password to the certfile (exported from IIS)
X509Certificate2 certificate = new X509Certificate2(directory + @"\bin\certificate.pfx", "1234");

store.Add(certificate);

var binding = site.Bindings.Add("*:443:", certificate.GetCertHash(), store.Name);
binding.Protocol = "https";
store.Close();

感谢这个随机线程:http://forums.iis.net/t/1163325.aspx

【讨论】:

别忘了调用 mgr.CommitChanges()。【参考方案2】:

您需要缩小问题范围。 (确切地)使用的证书是什么?

如果您的证书用于客户端身份验证(在服务器上对客户端进行身份验证),那么将其与您的应用程序一起分发会使此类身份验证毫无用处,因为您将泄露密钥。

如果您需要验证服务器的证书(并且您已经在 PEM 文件中获得了服务器的证书或证书链),那么这可以工作,但为什么需要将证书安装到证书存储?

您应该注意,Windows 或 .NET 库本身不支持 PEM 格式,因此您需要在部署之前将其转换为 PFX,然后导入 PFX 或仅基于 PFX 在内存中创建存储(您会发现通过在 *** 上查找 PFX 或 PKCS#12 来获取大量信息)。

更新:每次安装应用程序时生成证书并让用户拥有自己的证书是一种更好的方法(例如,他们可能已经拥有其网站的有效证书)。

【讨论】:

抱歉,凌晨 2 点含糊不清; ) 以上编辑。 嗯,好点;虽然我猜你总是会被浏览器中的自签名证书确认对话框卡住?我不喜欢这种方法......但是我该如何在代码中做到这一点? (我是 Windows 编程菜鸟 :-D)编辑:这里的想法是安装此软件的人不了解计算机,所以如果这一切都是自动化的,那将是最好的。 @Dave 避免浏览器确认用户需要从已知证书颁发机构之一(globalsign、comodo、thawte、verisign 等)获取证书。至于证书生成 - 请参阅 ***.com/questions/3770233/… 以及我们的 Secureblackbox 产品以及其他功能提供完整的 PKI 基础架构支持,包括证书生成和签名 (eldos.com/sbb/desc-pki.php)。

以上是关于以编程方式将证书导入 IIS?的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式将带有证书链的 pfx 导入证书存储区?

在 C# 中以编程方式将证书和私钥转换为 .PFX

如何以编程方式将证书导入我的iOS应用程序的钥匙串,并在需要时将身份传递给服务器?

以编程方式,在对SAP的调用中使用X.509客户端证书需要做什么?

以编程方式将 IIS 应用程序池标识“用户”分配给组

如何使用 c# 以编程方式将证书安装到本地机器存储中?