2013-07-01 65 views
2

我正在开发一个WCF DataService,它是在Windows控制台应用程序内自行托管的。我想通过Https(即SSL)而不是Http激活我的服务。我怎样才能做到这一点?通过HTTPS的WCF DataService

感谢

回答

1

首先在Windows上创建CA证书(使用Visual Studio命令提示符):

makecert -sv SignRoot.pvk -cy authority -r signroot.cer -a sha1 -n "CN=Dev Certification Authority" -ss my -sr localmachine 

现在把证书在Windows密钥存储 “受信任的根证书颁发机构”。这可以通过MMC完成。要做到这一点:运行... - >输入“mmc” - >输入 - >选择“证书”控制台 - >在个人存储中找到您创建的证书并将其移动到受信任的证书颁发机构存储。

现在我们创建由CA证书签署交换证书

makecert -iv SignRoot.pvk -ic signroot.cer -cy end -pe -n CN="localhost" -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 

注意:该EKU OID是用于服务器身份验证
注意:在CN(通用名)应该与服务将被调用的名称相同。

现在我们为数据服务添加一个Https端点。这可以是
1-通过的web.config文件服务,在此我们将不得不进入一个服务端点:

<endpoint address="https://localhost:8888/" binding="basicHttpsBinding" contract="System.Data.Services.IRequestHandler"></endpoint> 

2或与添加端点编程方式使用“ AddServiceEndpoint”的DataServiceHost对象的:

host.AddServiceEndpoint(
       new ServiceEndpoint(ContractDescription.GetContract(typeof(TestODataService.DemoDataService))) 
       { 
        Address = new EndpointAddress("https://localhost:8888/"), 
        Binding = new WebHttpBinding(WebHttpSecurityMode.Transport), 
        Contract = ContractDescription.GetContract(typeof(IRequestHandler)), 
       } 
       ); 

:在第二种方法中的结合是必然与运输安全的WebHttpBinding。在web.config方法中,它可以是basicHttpsBinding,也可以是带有bindingConfiguration的webBinding,以实现传输安全性。

现在我们将交换证书绑定到服务的端口。为了使WCF Web服务器使用交换证书响应客户端,我们需要使用netsh命令将证书绑定到服务的地址: netsh http add sslcert ipport = 0.0.0.0:8000 certhash = 0000000000003ed9cd0c315bbb6dc1c08da5e6 appid = {00112233-4455-6677-8899-AABBCCDDEEFF}

:所述CERTHASH是交换证书的指纹,并且APPID处于的AssemblyInfo.cs发现宿主应用程序的GUID的项目。 IP 0.0.0.0绑定到所有的IP地址,端口是服务的端口。每个地址只能使用该命令一次。

注意:当使用服务的IP地址进行呼叫时,即使交换证书将CN设置为服务的IP地址,某些移动设备也可能无法验证服务的身份。在这种情况下,证书的CN应该是域名。

注意:为了使移动设备信任服务的交换证书,CA证书应安装在受信任的CA证书存储在移动。

注意:某些浏览器(例如Chrome)会反对为本地主机颁发证书,这是本地网络中仅使用的名称。如果您将CN设置为域名,则不会发生这种情况。

参考:http://www.codeproject.com/Articles/24027/SSL-with-Self-hosted-WCF-Service