当启用SSL时,IIS Express默认使用端口44300进行HTTPS。

36
当您最初设置IIS Express以启用SSL时,它默认将端口设置为44300。不幸的是,当我尝试在https://localhost/上访问我的网站时,除非我使用端口号44300- https://localhost:44300/,否则它无法工作。
链接是使用以下内容生成的:
<%= Html.ActionLink("Index", "Index", "Home", new { @action = "https://" + Request.Hostname + Url.Action("Index", "Home") }) %>

虽然不太优雅,@action 关键字可以覆盖生成的路由,但这意味着应用程序似乎需要知道任何非标准端口(例如 44300)。

问题在于,我要编写的东西只解决在开发环境中才会出现的问题。

所以我的问题是... 如何将端口更改为 443 并使 IIS Express 喜欢它?

我的站点配置如下:

<site name="MySite" id="2" serverAutoStart="true">
  <application path="/">
    <virtualDirectory path="/" physicalPath="C:\Inetpub\MySite" />
  </application>
  <bindings>
    <binding protocol="http" bindingInformation=":80:" />
    <binding protocol="https" bindingInformation=":44300:" />
  </bindings>
</site>

非常感谢您提前的帮助。

更新:

这个问题已经被IIS论坛上的Divya回答了。

5个回答

28

这个问题已经在IIS论坛上被Divya 回答

在WebMatrix中为网站启用SSL后,默认端口为44300,并在后台执行所有绑定。我希望你尝试将此端口更改为配置文件中的443。完成并保存后,还需要修改http.sys中的绑定。您需要删除端口44300的现有条目,并添加端口443的条目。 要做到这一点,您可以使用httpcfg(WinXp / Win2003)或'netsh http'(WinVista / Win2K8 / Win7)。 以下是netsh的命令: 1)获取44300现有条目的appid和certhash(我假设您将使用WebMatrix默认安装的相同证书。如果您还想更改证书,请从证书存储中获取证书哈希值):netsh http show sslcert。在输出中搜索端口44300的条目,并复制certhash和appID。 2)删除44300的条目:netsh http delete sslcert ipport=0.0.0.0:44300 3)添加新的443端口条目,其中包含步骤1中复制的certhash和appID。netsh http add sslcert ipport=0.0.0.0:443 certhash=<certhash> appid=<appid> 在配置了http.sys中的条目后,您需要重新启动http服务以使更改生效。 net stop http net start http

正如其他人所指出的那样,有几种不错的方式可以获取SSL证书。

netsh http show sslcert > output.txt

或者(我偏爱的方法):
netsh http show sslcert | clip

1
在我的Win7机器上,netsh http show sslcert 返回了100多个条目,而44300位于顶部。因此,使用命令netsh http show sslcert | morenetsh http show sslcert > output.txt可以让您更轻松地处理事情。 - rymo
3
作为一个辅助方法,您可以使用netsh http show sslcert ipport=0.0.0.0:44300这个命令,该命令将过滤到特定的内容。 - Alpha
1
或者另一种解决方案是:使用netsh http show sslcert | clip命令将结果复制到剪贴板,然后粘贴到文本编辑器中进行搜索。 - Mariusz Pawelski
如果在Dan的这篇文章中的第3步骤中出现“参数不正确”的情况,请尝试使用netsh http add sslcert ipport=0.0.0.0:44300 appid={appid} certhash=<certhash>,参见https://dev59.com/EHRA5IYBdhLWcg3w8SeJ。 - Danniel Little

4

由于我在这个主题上花费了很多时间,所以我想分享我的发现。我正在重新发布我的其他帖子中的一部分,减去了代码。一些背景和解释:

==========================================

在调研后,我通过重写Controller类的OnAuthorization方法(参考文献#1)解决了与IIS Express相关的问题。我还采用了Hanselman推荐的方法(参考文献#2)。但由于以下两个原因,这两种解决方案都不能让我完全满意:
1. 参考文献#1的OnAuthorization仅适用于操作级别,而不适用于控制器类级别; 2. 参考文献#2需要进行大量设置(Win7 SDK for makecert)、netsh命令,而且为了使用80端口和443端口,我需要以管理员身份启动VS2010,这让我感到不满意。
因此,我提出了以下解决方案,具有以下简单条件:
  1. 我希望能够在控制器类或操作级别使用RequireHttps属性
  2. 当存在RequireHttps属性时,我希望MVC使用HTTPS,并在缺少该属性时使用HTTP
  3. 我不想必须以管理员身份运行Visual Studio
  4. 我希望能够使用IIS Express分配的任何HTTP和HTTPS端口
  5. 我可以重复使用IIS Express的自签名SSL证书,并且不介意看到无效的SSL提示

=========================================

你可以在这里找到我的解决方案/代码 ==> 仅在生产环境中使用ASP.NET MVC RequireHttps

3
端口号44300是顺序的:00表示您已配置为启用SSL的第一个应用程序;01将是第二个,依此类推。
由于我还要求我的网站只能通过添加[RequireHttps]全局属性在HTTPS中工作,所以我在调试时遇到了一些问题。当启动时,它会自动重定向到https://localhost/。
要解决此问题,在调试网站时,我只需创建一个指定端口的新RequireHttpsAttribute即可。
#if DEBUG
public class RequireHttpsAttribute : System.Web.Mvc.RequireHttpsAttribute
{
    protected override void HandleNonHttpsRequest(System.Web.Mvc.AuthorizationContext filterContext)
    {
        base.HandleNonHttpsRequest(filterContext);

        var result = (RedirectResult)filterContext.Result;

        var uri = new UriBuilder(result.Url);
        uri.Port = 44301;

        filterContext.Result = new RedirectResult(uri.ToString());
    }
}
#endif

只有在调试时才使用此类。当部署到IIS7时,您应该使用Url重写将其重定向到HTTPS。


2
当部署时,您可以依赖IIS已经提供的经过验证和可信的方法,但在调试时,这是非常有用的。 - Pierre-Alain Vigeant
当然可以。我可能会在代码中添加调试区域,以避免发布非生产代码。 - Dan Atkinson
1
我正在添加#if DEBUG以强调仅用于调试的部分。 - Pierre-Alain Vigeant
这个想法不能用于团队开发或在不同机器上的开发:使用的端口没有保存在解决方案或项目配置文件中,只保存在本地IIS-Express安装中。 - springy76
@springy76 你确定吗?因为我在我的项目文件中清楚地看到 <IISExpressSSLPort>44301</IISExpressSSLPort> - Pierre-Alain Vigeant
显示剩余2条评论

0

Dan的答案是正确的,但如果您仍然在配置IIS Express以在标准端口上使用http和https为您的网站提供服务方面遇到问题,这里有一个很好的教程,可以逐步指导您:

http://www.lansweeper.com/kb/54/How-to-configure-SSL-in-IIS-Express.html

在我的情况下,我不小心删除了IIS Express证书。我认为它是在Visual Studio中第一次使用SSL时生成的(在选定项目上按F4以获取属性窗口并选中“启用SSL”复选框)。这个教程指导我如何创建证书并修复它。

0
创建类
public class RequireSSLAttribute: RequireHttpsAttribute
    {
        protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
        {
            base.HandleNonHttpsRequest(filterContext);

             if (filterContext.HttpContext.Request.Url.Host.ToLower().Equals("localhost"))
            {
                // redirect to HTTPS version of page
                string localhostSSLPort = System.Configuration.ConfigurationManager.AppSettings["localhostSSLPort"];
                string url = "https://" + filterContext.HttpContext.Request.Url.Host + ":" + localhostSSLPort + filterContext.HttpContext.Request.RawUrl;
                filterContext.Result = new RedirectResult(url);
            }           
        }
    }

在你的 Web.config 文件中添加类似以下的内容

<appSettings>    
    <add key="localhostSSLPort" value="44300"/>
  </appSettings>

然后你可以像这样使用它

    [RequireSSL]            
    public class AdminController : Controller
    {
              ...
    }

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