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

C# 以编程方式将证书导入IIS?,c#,iis,iis-7,ssl,certificate,C#,Iis,Iis 7,Ssl,Certificate,我有一个SSL的.pem证书,我想在MSI中与我的web应用程序一起分发它(必须在客户端的计算机上运行)。然后我需要导入它(到一些凭证存储?),并告诉我的站点绑定使用它。但是我怎样才能在代码中做到这一点呢?我发现了Microsoft.Web.Administration,但不确定从那里可以走到哪里 这里是IIS7 btw 编辑:这里的目标是拥有一个客户可以在其内部网上运行的web应用程序。它主要充当iPhone应用程序的API。(也许这不是最好的设计,但我们现在被锁定了。)所以客户安装了MSI,

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

这里是IIS7 btw

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

我知道重新分发一个证书通常是个坏主意,但我们只是想在这里击败偶尔的黑客……这将是仅限于企业内部网的,似乎不太可能有人会做任何太疯狂的事情,而且API严格限制了您对数据库所能做的坏事的数量


因此,我们的目标是通过一键(ish)安装,在intranet web应用程序上进行密码验证:-你需要缩小你的问题范围。这个证书(确切地说)是用来干什么的

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

如果您需要验证服务器的证书(并且您的PEM文件中已经为您提供了服务器的证书或证书链),那么这是可行的,但是为什么您需要将证书安装到证书存储中呢

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


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

亲爱的读者们,答案是:

// 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();

感谢这个随机线程:

有趣的问题,但是您真的想重新使用SSL证书吗?即使这是一个为您自己的web应用提供服务的大型群集的按钮式推出,您也可能希望更加小心地使用您的证书。请注意,中间人仍然可以使用自签名证书,除非所有客户端手机在联系API之前都在其受信任的根证书存储中预安装了此证书。抱歉,凌晨2点模糊;)上面编辑过。嗯,好的观点;虽然我猜你总是会被浏览器中的自签名证书确认对话框卡住?我对这种方法感到失望。。。但是如何在代码中实现呢?(我是Windows编程高手:-D)编辑:这里的想法是安装此软件的人不了解计算机,因此如果这一切都是自动化的,那将是最好的。@Dave为了避免浏览器确认,用户需要从已知的证书颁发机构(globalsign、comodo、thawte、verisign等)获得证书。至于证书生成-请参阅,我们的SecureBackbox产品以及其他功能提供了完整的PKI基础设施支持,包括证书生成和签名()。不要忘记调用mgr.CommitChanges()。