我运行自托管的WCF服务,我希望使用自签名SSL证书进行保护。为此,我需要将此SSL证书与某个端口绑定。有几种方法可以做到:
根据这个http://msdn.microsoft.com/en-us/library/ms733791.aspx我可以使用netsh
并且它可以工作,但我不希望依赖netsh并从.NET代码中做所有事情。
所以我找到了以下代码段:
using (ServerManager manager = new ServerManager())
{
Site site = manager.Sites.FirstOrDefault(i => i.Applications.Cast<Application>().Any());
Application app = site.Applications.Cast<Application>().First();
site.Bindings.Add(":*:PORTN", cert.GetCertHash(), store.Name);
manager.CommitChanges();
}
它可以工作,但这需要安装IIS。否则我得到以下异常:
使用CLSID检索组件的COM类工厂 {2B72133B-3F5B-4602-8952-803546CE3344}由于以下原因而失败 错误:80040154未注册类(HRESULT异常: 0x80040154(REGDB_E_CLASSNOTREG))..
所以,问题是 - 有没有办法在托管代码中实现这一点,但无需安装IIS?
答案 0 :(得分:1)
找到我问题的正确答案:Binding an SSL certificate to a port programmatically
我不需要使用像ServerManager
这样的托管类,而是需要依赖P / Invoking本机API,例如HttpSetServiceConfiguration
。
答案 1 :(得分:0)
有没有办法在托管代码中完成此操作,但无需安装IIS?
是的,并且假设您作为一项具有足够权限的服务运行,可以根据需要使用Process.Start和WaitForExit调用NETSH来执行允许和禁止,并且可以在您的问题中实现所需。
NETSH的命令行语法http://technet.microsoft.com/en-us/library/cc725882(WS.10).aspx允许您执行所需的一切。
如果你想弄清楚所有的P / Invoke,但它听起来像是一个额外的麻烦,但这听起来像学术练习,更容易出现内存泄漏等等。
如果您在Windows XP上运行并担心NETSH无法满足您的需求,那么您也可以在此处获取Microsoft的HTTPCFG http://msdn.microsoft.com/en-us/library/windows/desktop/aa364478%28v=vs.85%29.aspx