SignalR在一台计算机上工作但不在其他计算机上

我们有一个托管SignalR的Windows服务。 相同的代码在不同的计算机上运行,​​结果不同。

如果我在笔记本电脑上访问此链接,它可以正常工作:

https://localhost/signalr/negotiate

响应: { "Url":"/signalr", "ConnectionToken":"AQAAANCMnd8BFdERjHoAwE/...==", "ConnectionId":"0a09e290-c8af-48d6-b791-f05e3b8930b0", "KeepAliveTimeout":20.0, "DisconnectTimeout":30.0, "ConnectionTimeout":110.0, "TryWebSockets":false, "ProtocolVersion":"1.2", "TransportConnectTimeout":5.0, "LongPollDelay":0.0 }如果我在桌面上转到同一个链接,我会得到这个:

在此处输入图像描述

我检查了IE设置,我的笔记本电脑和桌面之间的TLS设置是相同的。 我还检查了许多其他IE设置。

编辑 :在好的PC上,在浏览器中获取证书警告。 不在非工作PC上发生。

以下是运行SignalR的代码:

  protected override void OnStart() { LogUtility.LogInformation("SignalRHubHostController::OnStart()"); string url = this.Application.Configuration.SignalRHubHostController.HostUrl; UriBuilder uri = new UriBuilder(url); string schemeOverride = this.Application.Configuration.SignalRHubHostController.UriSchemeOverride; if (!String.IsNullOrWhiteSpace(schemeOverride)) uri.Scheme = schemeOverride; LogUtility.LogInformation(String.Format(CultureInfo.InvariantCulture, "Using [{0}] as the SignalR hub URL.", uri.Uri.ToString())); this._disposableWebServer = WebApp.Start(uri.Uri.ToString()); } internal class Startup { public void Configuration(IAppBuilder app) { app.UseCors(CorsOptions.AllowAll); app.MapSignalR(); } } 

我得到了这个工作。 显然,现有证书设置使用端口443是一个问题。我不知道为什么这是一个问题,但以下步骤导致事情开始为我工作。

注意:Rick Strahl的博客帮助: 在SSL / https下托管SignalR

  1. 在IIS中专门为此目的创建证书:

在此处输入图像描述

注意:我没有必要使用MMC将证书从个人文件夹复制到受信任的根文件夹。 它已经在受信任的根文件夹中。

  1. 删除专用于端口443的现有证书:

netsh http delete sslcert 0.0.0.0:443

注意:我最初尝试添加证书并收到错误,因为已经为端口443指定了证书。这就是为什么删除就在这里。

  1. 为端口443添加我的新证书:

netsh http add sslcert ipport = 0.0.0.0:443 appid = {12345678-db90-4b66-8b01-88f7af2e36bf} certhash = hashGoesHere

注意:Rick Strahl的博客说总是使用那个appid。 我不知道appid在证书环境中意味着什么。 所以,是的,不管……

  1. 运行我的应用程序并成功连接:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

注意:我需要使用真正的证书并信任它,所以我不再收到警告。 但这不是这个答案的重点。 我只想展示我如何使用SignalR。

因此,虽然这使得工作有效,但我不知道为什么专用于端口443的原始证书无效。 也许它不在根店里。 我无法弄清楚如何根据PC上的哈希找到该证书。

编辑

为了完整起见,我想分享一下如何获得cert哈希值。 您可以通过查看IIS中的证书来手动键入它,也可以通过在MMC中查找它来复制它。 它是证书的Thumbprint属性。 你只需要删除空格。

在此处输入图像描述