pro*_*erj 5 ssl self-signed signalr
我有一个使用自签名证书的自托管 WebAPI Web 服务。我能够使用以下 URL 成功地与其他应用程序的 Web 服务控制器操作进行通信:
https://localhost:5150/...
Run Code Online (Sandbox Code Playgroud)
请注意,我已成功将自签名证书绑定到端口 5150,并为我的应用程序的所有 IP 保留该端口,这都是通过使用适当的netsh命令实现的。
我正在尝试将 SignalR 集线器集成到此 Web 服务中。我在启动代码中使用以下内容配置具有 CORS 支持的集线器:
// Configure the SignalR hub that will talk to the browser
appBuilder.Map("/signalr", map =>
{
map.UseCors(CorsOptions.AllowAll);
HubConfiguration hubConfig = new HubConfiguration();
hubConfig.EnableDetailedErrors = true;
hubConfig.EnableJavaScriptProxies = false;
map.RunSignalR(hubConfig);
});
Run Code Online (Sandbox Code Playgroud)
我正在启动我的 HTTP 侦听器,它也用于 Web API:
_webApp = WebApp.Start<Startup>(baseUrl);
Run Code Online (Sandbox Code Playgroud)
其中 baseUrl 是
https://+:5150/.
Run Code Online (Sandbox Code Playgroud)
我的 SignalR 初始化代码在我的 Angular 控制器中是:
var initialize = function () {
//Getting the connection object
connection = $.hubConnection("/signalr", { useDefaultPath: false });
// Url signalr scripts should hit back on the server
connection.url = ENV.SIGNALR.protocol + '://' + ENV.SIGNALR.server + ':' + ENV.SIGNALR.port + '/' + ENV.SIGNALR.url;
// Turn on client-side logging
connection.logging = ENV.SIGNALR.logging;
// Get proxy based on Hub name (must be camel-case)
proxy = connection.createHubProxy('dashboardHub');
// Setup event handlers for messages we get from the server.
proxy.on('rxDiagnosticMessage', function (msg) {
//console.log('Received rxDiagnosticMessage');
$rootScope.$broadcast("rx-diagnostic-message", msg);
});
//Starting connection
connection.start()
.done(function () { console.log('SignalR connection started'); })
.fail(function (err) { console.log('SignalR connection failed - ' + err); });
// Display errors to console
connection.error(function (err) {
console.log('SignalR error - ' + err);
});
};
Run Code Online (Sandbox Code Playgroud)
当尝试连接到集线器时,我收到以下错误:
15:04:43 GMT-0400 (Eastern Daylight Time)] SignalR: Auto detected cross domain url. jquery.signalR-2.1.0.js:81
[15:04:43 GMT-0400 (Eastern Daylight Time)] SignalR: Client subscribed to hub 'dashboardhub'. jquery.signalR-2.1.0.js:81
[15:04:43 GMT-0400 (Eastern Daylight Time)] SignalR: Negotiating with 'https://localhost:5150/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%7B%22name%22%3A%22dashboardhub%22%7D%5D'. jquery.signalR-2.1.0.js:81
GET https://localhost:5150/signalr/negotiate?clientProtocol=1.4&connectionData=%5B%7B%22name%22%3A%22dashboardhub%22%7D%5D&_=1407524683014 net::ERR_INSECURE_RESPONSE jquery-2.1.1.js:8623
SignalR error - Error: Error during negotiation request. AppSignalR.js:43
SignalR connection failed - Error: Error during negotiation request. AppSignalR.js:39
[15:04:43 GMT-0400 (Eastern Daylight Time)] SignalR: Stopping connection.
Run Code Online (Sandbox Code Playgroud)
请注意SignalR 连接协商期间的net::ERR_INSECURE_RESPONSE 。
奇怪的是......如果我运行 Fiddler2 那么连接就可以了!(Fiddler 是否为我的网络应用程序/SignalR 提供了一个很好的证书?)
我怀疑这是由于证书是自签名的(个人中的证书,受信任的证书颁发机构)。在WCF和WebAPI客户端中,我总是拦截权限错误并绕过错误:
ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);
Run Code Online (Sandbox Code Playgroud)
我的 Angular 应用程序的 SignalR 客户端中是否需要执行类似的操作?或者这应该有效?
请注意,我已经看到这个线程 - SignalR with Self-Signed SSL and Self-Host仍然不适用于我。
小智 -2
您不能将 localhost 与 SSL 一起使用,您需要 URL 中的绝对主机名。
查看您创建的证书中的 ISSUED BY 和 ISSUED TO 字段,ISSUED BY 需要属于您的计算机(使用浏览器访问网页的计算机)上的“受信任的发布者”列表的一部分,而 ISSUED TO 需要属于您的 URL。即证书已颁发给您并且仅颁发给您。因此,如果您的 ISSUED TO 字段的值为“HOSTNAME.DOMAINNAME”,其中 HOSTNAMEe 是计算机的主机名,DomainName 是托管网站的计算机的域,那么您需要使用相同的名称(即 )访问您的站点。
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
4083 次 |
| 最近记录: |