SSL连接/使用IISExpress时连接重置

189

我第一次使用新版的Visual Studio 2013和IISExpress(之前在VS2010上使用ASP.net开发服务器)。我在调试项目时遇到了问题。

这是我在Chrome浏览器中看到的错误信息:

无法与服务器建立安全连接。这可能是服务器出现了问题,也可能是服务器要求客户端认证证书,而你没有该证书。 错误代码:ERR_SSL_PROTOCOL_ERROR

我更新了我的Properies->web文件,使项目URL现在使用一个https URL。但是,在进行更改后,我在启动时遇到了新的错误:

连接到本地主机被中断。 错误代码:ERR_CONNECTION_RESET

谢谢


查看我对类似问题的答案: https://dev59.com/5Yfca4cB1Zd3GeqPhVNg#29848227 - Bogac
3
在此发布是因为以下答案可能很容易被忽略。如果已接受的答案对您无效,请尝试使用此链接:https://dev59.com/4mIj5IYBdhLWcg3wpWlx - IWriteApps
更改端口号,对我有效。 - torun
我学会了在尝试被投票最多的答案之前先尝试被接受的答案,哈哈;如果我尝试了这个顺序 - 我就可以节省一些时间,而不是在这个神奇的计算机科学问题上浪费几个小时。无论如何,感谢你提出这个问题! - gawkface
27个回答

495
我之前遇到了ERR_CONNECTION_RESET错误,因为我的Visual Studio 2013/IIS Express应用程序端口号不在范围内:44300-:44398。(我不记得需要忽略任何警告来离开这个范围。)将端口号更改为此范围内的某个数字就可以让它正常工作。

我在审查netsh http show sslcert > sslcert.txt输出后发现这一点,并结合我最近阅读的与端口号相关的信息理解了其中的道理。


71
我很遗憾只能给这篇帖子一个赞。在 Stack Overflow 之前,我是如何解决这种无聊的问题的呢? - quillbreaker
10
您也可以使用“netsh http add sslcert…”命令来添加您想要使用的端口。在某些情况下非常有用。 - brazilianldsjaguar
5
天哪,这花了我很多永远都无法挽回的时间... netsh 来拯救,这值得写一篇博客文章... - Jim
3
我发现,在《处理IIS Express中的URL绑定故障》文档的“使用自定义SSL端口”章节中记录了这个端口号范围。该文档链接为:https://learn.microsoft.com/en-us/iis/extensions/using-iis-express/handling-url-binding-failures-in-iis-express#using-a-custom-ssl-port。 - Schmalls
3
数年的准备,痛苦的动力,数小时的坚持和一点幸运! - Jason Kleban
显示剩余13条评论

113
确保删除以前的'localhost'证书,因为它们可能与由IIS Express生成的证书发生冲突。我曾经遇到这个相同的错误(ERR_SSL_PROTOCOL_ERROR),在尝试了许多“解决方案”后,花费了很多时间才最终找出问题所在。我的错误是我创建了自己的'localhost'证书,而且有两个。我不得不删除两个并让IIS Express重新创建。

以下是如何检查和删除'localhost'证书:

  • 在开始菜单中键入 → mmc.exe
  • 文件 → 添加/删除插件...
  • 选择证书 → 添加> → 计算机帐户 → 本地计算机
  • 在证书 > 个人 > 证书下检查
  • 确保存在的localhost证书具有友好名称“IIS Express Development Certificate”。如果没有,请删除它。或者如果有多个,请全部删除。

在Visual Studio中,选择项目,在属性选项卡下启用SSL=true。保存、构建和运行。IIS Express将生成一个新的'localhost'证书。

注意: 如果上述方法无效,请尝试:在删除'localhost'证书之前,确保在VS项目中禁用IIS Express,并停止所有正在运行的应用程序。此外,您可以进入“控制面板→程序”并修复IIS Express。


2
在我的情况下,IIS证书设置丢失了,但是证书仍然在磁盘上。设置SSL证书并更新网站上的HTTPS绑定有所帮助。即使在组合框中已经选择了SSL证书,重新设置https绑定也很重要。 - opewix
24
需要修复IIS Express,现在正常工作了。谢谢。 - Homam
1
谢谢。在我的情况下,我不小心从电脑中删除了证书。当我尝试执行此命令时,它会抛出以下错误:"SSL证书添加失败,错误:1312指定的登录会话不存在。可能已经被终止。"netsh http delete sslcert ipport=0.0.0.0:443 netsh http add sslcert ipport=0.0.0.0:443 appid="{GUID-APP-ID}" certhash="THUMBPRINTOFMYCERTIFICATEINHEXADECIMAL" - UKM
2
我不得不关闭并重新打开Visual Studio,然后才能获得对话框以接受新证书。 - Mathemats
在我的情况下,证书管理器中没有"localhost"证书。我在"程序 > IIS 10.0 Express"中使用修复功能,然后出现了本地主机证书。谢谢! - AFract
显示剩余4条评论

52
如果您正在使用web.config中的URLRewrite强制SSL连接,则可能会将您的本地主机地址重写为强制使用https。如果您不需要启用SSL进行调试并且正在使用URLRewrite,请考虑在web.config文件的重写部分中添加<add input="{HTTP_HOST}" pattern="localhost" negate="true" />。这将停止任何本地主机地址的重写,但在生产环境中仍然保持不变。
如果您未使用URLRewrite或需要使用SSL进行调试,则http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx可能会有所帮助。它适用于VS2010,但对于VS2013也足够。

8
我通过将该行代码添加到URLrewrite并将端口更改为“:44300-:44398”的范围,使其工作。(请参见uosef下面的答案) - MonkeyDreamzzz
是的!在经历了几个小时的近乎崩溃之后,这就是帮助我的东西! - waka

49

我总结了帮助我解决这个问题的步骤:

  1. 确保 SSL 端口范围(由 IIS Express 使用)为 44300-44398

在安装过程中,IIS Express 使用 Http.sys 为 SSL 使用保留端口 44300 到 44399。这使得没有提升特权的标准用户可以配置和使用 SSL。有关更多详细信息,请参阅此处

  1. 以管理员身份在命令提示符下运行以下命令。这将输出计算机中的 SSL 证书绑定。从列表中找出 IIS Express 用于相应端口的证书:

netsh http show sslcert > sslcert.txt

  1. 在 sslcert.txt 中查找以下项目(在我的情况下,IIS express 正在运行的端口是 44300)

IP:port : 0.0.0.0:44300

Certificate Hash : eb380ba6bd10fb4f597cXXXXXXXXXX

Application ID : {214124cd-d05b-4309-XXX-XXXXXXX}

  1. 还要在 IIS Express 管理控制台中查找(RUN (Ctrl+R) -> inetmgr.exe),并查看相应端口的证书是否存在于服务器证书中

(单击 ServerRoot -> 在 IIS () 部分下打开"Server Certificates")

  1. 如果默认情况下您的本地主机使用与步骤 3 中列出的不同的证书,请继续执行以下步骤

netsh http delete sslcert ipport=0.0.0.0:44300

网上重定向(HTTP)删除44300端口的SSL证书。

netsh http add sslcert ipport=0.0.0.0:44300 certhash=无空格的新证书哈希值 appid={214124cd-d05b-4309-XXX-XXXXXXX}

网上重定向(HTTP)添加44300端口的SSL证书,并将其关联到您本地主机中的默认证书(在步骤4中找到),或者将其作为新证书添加。

附注:感谢uosɐſ提供的答案(帮助我解决了这个问题)。


9
哈,将端口从53xxx更改为44300对我有效。 - cdonner
2
更改端口对我也起作用了。有人知道为什么端口必须在这个范围内以及它在哪里配置吗? - Jim
端口修改要成功!Jim的评论为什么需要在44300-44398范围内使用端口也是如此! - TChadwick
在安装过程中,IIS Express使用Http.sys来保留端口44300到44399以供SSL使用。这使得IISExpress的标准用户(没有提升的特权)能够配置和使用SSL。有关更多详细信息,请参见此处-> https://learn.microsoft.com/en-us/iis/extensions/using-iis-express/running-iis-express-without-administrative-privileges#using-ssl - Karthik
还要在IIS Express管理控制台中查找(运行(Ctrl+R)-> inetmgr.exe)。嗯...在我的系统上,运行“inetmgr.exe”会启动“IIS管理控制台”,而不是“IIS Express管理控制台”(这种东西真的存在吗?)。 - Heinzi
显示剩余2条评论

35
我遇到的问题与我在某个时间点启用了本地主机的HSTS有关,但没有意识到这会破坏我的IIS Express中的http://localhost:someport
HSTS告诉浏览器(在我的情况下是Chrome)始终使用HTTPS请求URL。因此,即使我还没有为我的MVC 5应用程序启用SSL,浏览器仍然会尝试使用URL中的HTTPS访问我的站点,而不是HTTP。
解决方法?
  1. 浏览至chrome://net-internals/#hsts
  2. 在删除部分中,输入“localhost”并从Chrome中删除该记录。

1
是的,HSTS可能是这个问题的原因。这对我有用,谢谢。 - Kosmo
这个可以用,但我认为每次 Chrome 更新后你需要重新做一遍。 - hhk

14

以上所有选项对我都没用。我不得不按照以下步骤操作:

  1. 卸载了IIS Express 8.0
  2. 删除了我的文档目录中所有的IIS Express配置
  3. 重新安装了IIS Express 8.0
  4. 在本地机器上删除了该项目,并下载了TFS的干净版本
  5. 运行该项目 - 现在它在SSL上运行,我可以进行调试

我从这个帖子中得到了这些步骤。

希望这有所帮助。


4
我刚刚卸载了IIS Express,然后重新安装了它。现在它可以正常工作了。 - Xin
6
对我来说,只需要修复控制面板中的IIS安装即可。 - romanoza
人们还要为这付钱给微软?软件设计得有多糟糕,以至于唯一的解决方法是完全卸载并重新安装! - Jez
@Jez - 不,它是免费的。 - Eric Kelly

13
我遇到的问题与@Jason Kleban的答案有关,但是我在Visual Studio的IIS Express属性设置中有一个小问题。
确保在将端口更改为44300到44399范围内之后,地址也以HTTPS开头。

输入图像说明


哇塞,太感谢了!在其他评论中尝试了好几个小时都没解决问题。而答案就在这里,如此简单!只是少了一个字符! - Ricardo Almeida
我也曾经感到困惑,但很高兴我能帮助其他遇到同样问题的人 :) - Newteq Developer

10

对我来说,使用这里提供的解决方案有效。

C:\Program Files (x86)\IIS Express\IisExpressAdminCmd.exe setupsslUrl -url:https://localhost:44387/ -UseSelfSigned

使用您的项目用于 HTTPS 的端口。


我使用了你建议的命令,并且以管理员身份启动了Visual Studio。这就解决了问题!我甚至还能够为我的网站HTTPS URL设置自定义端口。 - Vitox

6
在我的情况下,我创建了一个自签名证书并让它工作,但是在浏览器中出现了错误,因为证书不受信任。所以,我将证书移到了“受信任的根证书颁发机构”>“证书”文件夹中。它工作了,然后我关闭了Visual Studio。
第二天,我启动项目时收到了原始问题中提到的错误。问题在于,您使用IISExpress配置的证书必须存在于“个人”>“证书”文件夹中,否则HTTPS将停止工作。一旦IIS Express成功启动,您可以将证书拖回到可信位置。它将继续工作,直到您重新启动IIS Express。
我不想每次来回拖动证书,所以我只是在两个位置放置了证书的副本,现在一切都正常工作。

2
您可以像普通文件一样将证书复制粘贴到证书管理器中。我花了好几年才发现这个功能。 - Simon_Weaver

6
我在Visual Studio 2015中遇到了同样的问题。因为我在web.config中使用了SSL绑定。
<rewrite>
   <rules>   
     <rule name="HTTP to HTTPS Redirect" stopProcessing="true">
       <match url="(.*)" />
       <conditions>
          <add input="{HTTPS}" pattern="off" />
       </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Found" />
     </rule>
   </rules>
</rewrite>

为您翻译:我可以通过djroedger先生的答案来解决问题。通过替换

即可。
<add input="{HTTPS}" pattern="off" />

将以下文本从英语翻译成中文:

<add input="{HTTP_HOST}" pattern="localhost" negate="true" />

添加到我的web.config文件中,这样我的代码就是:
<rewrite>
  <rules>   
    <rule name="HTTP to HTTPS Redirect" stopProcessing="true">
      <match url="(.*)" />
      <conditions>
         <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
         <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="Found" />
    </rule>
 </rules>
</rewrite>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接