【问题标题】:Establishing a SignalR connection when using a self-signed certificate使用自签名证书时建立 SignalR 连接
【发布时间】:2014-10-02 08:57:53
【问题描述】:

我有一个使用自签名证书的自托管 WebAPI Web 服务。我能够使用 URL 成功地与来自其他应用程序的 Web 服务控制器操作进行通信:

https://localhost:5150/...

请注意,我已经成功地将自签名证书绑定到端口 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);
        });

我正在启动我的 HTTP 侦听器,它也被用于 Web API:

_webApp = WebApp.Start<Startup>(baseUrl);

baseUrl 在哪里

https://+:5150/.

我的 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);
    });
};

尝试连接到集线器时,我收到以下错误:

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.

注意 SignalR 连接协商期间的 net::ERR_INSECURE_RESPONSE

奇怪的事情......如果我运行 Fiddler2,那么连接就可以了! (Fiddler 是否为我的网络应用/SignalR 提供了一个不错的证书?)

我怀疑这是由于证书是自签名的(个人证书,受信任证书)。在 WCF 和 WebAPI 客户端中,我总是拦截权限错误并绕过错误:

ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true);

在我的 Angular 应用程序的 SignalR 客户端中是否需要做类似的事情?还是应该这样做?

请注意,我已经看过这个帖子 - SignalR with Self-Signed SSL and Self-Host 仍然不适合我。

【问题讨论】:

    标签: ssl signalr self-signed


    【解决方案1】:

    您不能将 localhost 与 SSL 一起使用,您需要 URL 中的绝对主机名。

    查看您创建的证书中的 ISSUED BY 和 ISSUED TO 字段,ISSUED BY 需要是您机器(使用浏览器访问网页的机器)上“受信任的发布者”列表的一部分,并且 ISSUED TO 需要成为您的 URL 的一部分 .ie证书已颁发给您,并且只有您本人。因此,如果您的 ISSUED TO 字段的值为“HOSTNAME.DOMAINNAME”,其中 HOSTNAMEe 是机器的主机名,DomainName 是托管网站的机器的域,那么您需要使用相同的名称访问您的站点,即 .

    希望这会有所帮助。

    【讨论】:

    • 也不是真的.. 任何证书都可以包含 cn=localhost 甚至 cn=127.0.0.1
    猜你喜欢
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2012-08-14
    相关资源
    最近更新 更多