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

时间:2010-12-21 10:28:08

标签: c# iis iis-7 ssl certificate

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

这是在IIS7 btw。

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

我知道重新分发单一证书通常是一个坏主意,但我们只是想在这里击败偶然的黑客......这只是内联网而且只针对企业,似乎没有人会去做任何太疯狂的事情,并且API严重限制了你能够对数据库做的坏事的数量。

所以,我们的目标是在Intranet Web应用程序上进行密码身份验证,只需单击(ish)安装即可。 :-D

2 个答案:

答案 0 :(得分:25)

亲爱的读者,答案是:

// 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

答案 1 :(得分:1)

您需要缩小搜索范围。用于(确切)的证书是什么?

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

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

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

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