我正在开发一个在Windows控制台应用程序中自托管的WCF DataService。我想通过Https(即SSL)而不是Http来激活我的服务。我怎么能这样做?
由于
答案 0 :(得分: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-或者使用DataServiceHost对象的“AddServiceEndpoint”以编程方式添加端点:
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)会反对为localhost颁发证书,localhost是仅在本地网络中使用的名称。如果将CN设置为域名,则不会发生这种情况。
参考:http://www.codeproject.com/Articles/24027/SSL-with-Self-hosted-WCF-Service