Ssl Https上的WCF数据服务

Ssl Https上的WCF数据服务,ssl,https,wcf-data-services,wcf-endpoint,Ssl,Https,Wcf Data Services,Wcf Endpoint,我正在开发一个在Windows控制台应用程序中自托管的WCF数据服务。我想通过Https(即SSL)而不是Http激活我的服务。我该怎么做 感谢您首先在Windows上创建CA证书(使用Visual Studio命令提示符): 现在将证书放入Windows密钥存储中的“受信任的根证书颁发机构”。这可以通过MMC实现。为此:运行…->键入“mmc”->输入->选择“证书”控制台->在个人存储中查找您创建的证书,并将其移动到受信任的证书颁发机构存储 现在,我们创建一个由CA证书签名的exchange

我正在开发一个在Windows控制台应用程序中自托管的WCF数据服务。我想通过Https(即SSL)而不是Http激活我的服务。我该怎么做


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

现在将证书放入Windows密钥存储中的“受信任的根证书颁发机构”。这可以通过MMC实现。为此:运行…->键入“mmc”->输入->选择“证书”控制台->在个人存储中查找您创建的证书,并将其移动到受信任的证书颁发机构存储

现在,我们创建一个由CA证书签名的exchange证书:

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

现在,我们向数据服务添加一个Https端点。这可以是
1-通过服务的web.config文件,我们必须在其中输入服务端点:

<endpoint address="https://localhost:8888/" binding="basicHttpsBinding" contract="System.Data.Services.IRequestHandler"></endpoint>
注意:第二种方法中的绑定必须是具有传输安全性的WebHttpBinding。在web.config方法中,它可以是basicHttpsBinding,也可以是启用传输安全性的带有bindingConfiguration的webBinding

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

注意:certhash是exchange证书的指纹,appid是在项目的AssemblyInfo.cs中找到的托管应用程序的GUID。ip 0.0.0.0绑定到所有ip地址,端口是服务的端口。每个地址只需使用一次此命令

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

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

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

参考:

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
<endpoint address="https://localhost:8888/" binding="basicHttpsBinding" contract="System.Data.Services.IRequestHandler"></endpoint>
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)),
                }
                );