我正在开发一个在 Windows 控制台应用程序中自托管的 WCF 数据服务。我想通过 Https(即 SSL)而不是 Http 激活我的服务。我怎样才能做到这一点?
谢谢
我正在开发一个在 Windows 控制台应用程序中自托管的 WCF 数据服务。我想通过 Https(即 SSL)而不是 Http 激活我的服务。我怎样才能做到这一点?
谢谢
首先在 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 certash=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 颁发证书,这是一个仅在本地网络中使用的名称。如果您将 CN 设置为域名,则不会发生这种情况。
参考: http: //www.codeproject.com/Articles/24027/SSL-with-Self-hosted-WCF-Service