使用WebSockets的自托管WCF无法使用SSL
我在控制台应用程序中有此代码。 我试图从开发工具chrome连接,但得到此错误,虽然问题肯定在WCF方面:
WebSocket connection to 'wss://127.0.0.1:5650/Echo' failed: Error in connection establishment: net::ERR_CONNECTION_RESET
WSS没有达到我的服务器代码,没有例外,甚至没有日志。 最小修改的WS工作正常。 我使用nuget的Microsoft.WebSockets来简化代码:
WebSocketHost server = new WebSocketHost(typeof(EchoWSService), new Uri("https://127.0.0.1:5650/Echo")); var bindingSsl = WebSocketHost.CreateWebSocketBinding(true); server.AddWebSocketEndpoint(bindingSsl); server.Open();
我已经尝试过自定义证书validation器,但正如我所说它没有达到我的代码。
现在我有一个相同的代码,除了使用ServiceRoute的ASP.net应用程序中的server.Open() ,它工作得很好! 是的SSL和VS为IIS Express生成的自签名证书:
RouteTable.Routes.Add(new ServiceRoute("Echo", new TRWebSocketServiceFactory(), typeof(EchoWSService)));
浏览器方面只有:
var ws = new WebSocket('wss://127.0.0.1:5650/Echo')
在web.config我没有超过
那么为什么地狱不能在一个简单的控制台应用程序中运行我自己托管的WCF呢?
好吧,最后我使用自签名证书和COMODO颁发的证书。 我调查了IIS的作用并模仿它,它在操作系统级别绑定端口和主机。 我将此结果基于此代码项目post 。
1.在主机中安装证书。 对于测试提议,我使用的是使用VS for IIS生成的自签名证书。 您可以使用另一个或使用makecert.exe自行创建。 将其安装在个人→证书中 。
2.固定sockets。 以管理员身份运行命令行:
netsh http add sslcert ipport=0.0.0.0:5650 certhash=xxxxxxx.. appid={xxxx-xxx..} certstorename=MY netsh http add sslcert hostnameport=domainnamne:5650 certhash=xxxxxxx.. appid={xxxx-xxx..} certstorename=MY
哪里:
- ipport和hostnameport = ip,host或domain和port是否绑定到证书。
- certhash =证书的拇指打印没有空格。
- appid =是什么GUID,它应该识别哪个应用程序正在使用它。
- certstorename =证书的路径,在这种情况下,MY表示个人→证书
在Windows Server 2008中,我们可以使用* httpcfg.exe ***来获得相同的提议。 一旦它成功结合我们可以通过运行来审查:
netsh http show sslcert
我们将得到:
Hostname:port : domainname:5650 Certificate Hash : xxxxxxx.. Application ID : {xxxx-xxx..} Certificate Store Name : MY Verify Client Certificate Revocation : Enabled …
3.在浏览器端接受证书。 如果我们拥有有效的可信证书, 则不需要此步骤 。
因此,要使浏览器接受证书,请导航到https:// domainname:5650 (域名必须与您在步骤2中用于绑定的域名相匹配)然后我们得到对话框以接受证书,在chrome中可能需要导航到https:// domainname:5650 /服务 。
和Voila,在控制台中你可以尝试:
ws = new WebSocket('wss://domainname:5650/Service');
也不例外。