开发时使用SSL比用IISExpress更容易

开发时使用SSL比用IISExpress更容易

  • Comments 0

[原文发表地址] Working with SSL at Development Time is easier with IISExpress

[原文发表时间] 2011-04-21 03:59 PM

 

在我Mix 11"An Overview of the MS Web Stack of Love"的演讲中,其中的一个例子就是演示IIS ExpressVisual Studio SP1(以及WebMatrix)如何让使用SSL(安全套接层)更加容易。

 

如果你之前用过Cassini(就是内置的Visual Studio Web Developer Server )你可能已经注意到它并不支持SSL。那么实战的网站有点难搞了。如果想在登录页面和账户管理页面使用安全套接,你通常需要使用安装在本机上或共享服务器上的完全版IIS来完成工作。

 

这里有几种启用SSL的方法。第一种是Visual Studio 2010 SP1中新增的功能,它将允许你在本机的44300或更高的端口上使用SSL。这就意味着你可以在非443端口测试和开发你的SSL网站。我将在最后的步骤里演示给你看。

 

如果你看过Mix视频,你将在最后看到Damian Edwards教我的VS2010SP1中新的SSL功能。我不知道VS2010SP1WebMatrix也有这特性)中安装了那些自签名证书和组件以及启用它们的选项,然而,就如我在视频里面指出的那样,这些都只是针对例如44300+那样的“奇怪”的���数字端口,因此如果你想使用标准端口,那么我的那些比较复杂的例子对你来说仍然是有价值的。

简单的方法- 使用IIS Express VS2010 WebMatrix的本地SSL

如果你有IIS Express VS2010SP1你现在就可以按照下面的步骤来做。在Visual Studio中创建一个新的ASP . NET网站。

右击解决方案中的项目,选择Use IIS Express。你也可以通过:Tools | Options | Projects and Solutions | Web Projects。设置IIS Express为默认设置

Description: The "Use IIS Express" option in Visual Studio

下一步,点击是, VS将会在IIS Express上“创建一个新的网站”。这个意味着什么呢?

Create a new IIS Web Site?

点击Yes,让我们来看看。

记住,IISExpress是真正的IIS服务器。它只是一个“本地个人的,而不是一个服务型”IIS服务器。这意味着IISExpress将会把它的配置文件放置在C:\Users\YOU\Documents\IISExpress\config路径上,而不是在某些影响整台机器的位置。

我将项目命名为“MvcApplication18”,因此我可以打开ApplicationHost.config文件寻找 “MvcApplication18” 项目。你也可以这样做。我的网站就在IISExpress's applicationHost.config:

<site name="MvcApplication18" id="39">

  <application path="/" applicationPool="Clr4IntegratedAppPool">

    <virtualDirectory path="/" physicalPath="c:\users\scottha\documents\visual studio 2010\Projects\MvcApplication18\MvcApplication18" />

  </application>

  <bindings>

    <binding protocol="http" bindingInformation="*:15408:localhost" />

  </bindings>

</site>

请注意绑定部分。可以看到我的网站将显示在http://localhost:15408

回到Visual Studio,选中你创建的项目并按F4打开项目属性窗口。你也可以按Ctrl-W,再按P,或选择View | Property窗口。

因为我使用了IIS Express且已经安装了VS2010 SP1,我有了一个新的选项,“SSL Enabled。”如果单击它,一个使用从我之前提到的端口池中选择了一个新端口号的新的“SSL URL”窗口将显示出来。

Description: Look at that! It's an option for SSL Enabled = True. Crazy.

如果你想知道实际发生了什么,请回到你的ApplicationHost.config配置文件。

<site name="MvcApplication18" id="39">

  <application path="/" applicationPool="Clr4IntegratedAppPool">

    <virtualDirectory path="/" physicalPath="c:\users\scottha\documents\visual studio 2010\Projects\MvcApplication18\MvcApplication18" />

  </application>

  <bindings>

    <binding protocol="http" bindingInformation="*:15408:localhost" />

    <binding protocol="https" bindingInformation="*:44302:localhost" />

  </bindings>

看到新的绑定部分了吗?那是当我们点击启用SSL时为我们创建的。

运行你的网站。分别访问带和不带SSL的。不要忘记端口号!你现在运行在SSL本地上,但你被提示为坏人,因为这个证书不受信任。不过你还是可以创建一个应用程序,勾选一个选择框你就获得了本地SSL

Description: You are a bad person, says IE9. You have an untrusted certificate.

好了,我们如何让它以稍好一点的方式运行呢?我希望是这样:

*    友好的机器名称而不是localhost.

*    人们可以从外部访问我的IIS Express实例

*    真实的基于443端口的SSL.

*    我的ASP.NET程序在我登录的时候自动转换成SSL.

*    让我自签名的证书变得受信任这样我就不会碰到警告.

*    在一些地方用PowerShell,没什么特别的理由,就是很酷.

我们开始吧。

困难忍者的方法 基于443端口和IIS Express的本地SSL及命令行操作

这些步骤可能看起来有一点可怕,但是知道这些很有用,正是这些即将进行的(或已经进行的)步骤让前面提到的简单的方法。我将向你展示如何自己做,然后我会给你演示一种未公开的的方法,它使部分困难的方法变得更容易。当你从管理员命令提示符下运行随机命令时,知道到底发生了什么和为什么发生,这很重要,对吗?

1.通过80端口来使用IISExpress服务外部网

我将机器命名为HANSELMAN-W500,随后我会用这个名称。你可以更新你的hosts文件,使用一个更友好的名称。现在开始,请使用你的机器名。如果你不知道你的机器名,那么你太糊涂了。打开命令提示符并键入“HOSTNAME”可以得到你的机器名。

首先,我们需要通过"Url Reservation"在内核级告诉HTTP.SYS允许所有人访问这个URL。“在管理员命令提示符”键入以下命令:

netsh http add urlacl url=http://hanselman-w500:80/ user=everyone

接下来,由于我想从外部网访问IIS Express(我网络上的用户,等等。不仅仅是本地主机)那么我需要在防火墙设置允许IIS Express。我可以使用Windows图形界面方式操做,或输入命令:

netsh firewall add portopening TCP 80 IISExpressWeb enable ALL

最后,我需要确保我的项目使用80端口。这可以使用如下两种方法中的任何一种来完成。我可以手动编辑applicationHost.config文件并添加绑定(这是我推荐的方式):

<site name="MvcApplication18" id="39">

  <application path="/" applicationPool="Clr4IntegratedAppPool">

    <virtualDirectory path="/" physicalPath="c:\users\scottha\documents\visual studio 2010\Projects\MvcApplication18\MvcApplication18" />

  </application>

  <bindings>

    <binding protocol="http" bindingInformation="*:15408:localhost" />

    <binding protocol="https" bindingInformation="*:44302:localhost" />

    <binding protocol="http" bindingInformation="*:80:hanselman-w500" />

  </bindings>

</site>

或者,也可以通过命令行做!虽然这有一点令人担心。但是没有关系,即使我修改坏了也可以在ApplicationHost.config文件中验证我的修改。

"c:\Program Files (x86)\IIS Express\appcmd.exe" set site /site.name:MvcApplication18 /+bindings.[protocol='http',bindingInformation='*:80:hanselman-w500']

注意我使用的是IIS Expressappcmd.exe。如果我有完全版IIS,我可不想破坏它。

1.   制作SSL证书,挂钩到IISExpress并使它受信任。

让我们自己建一个自己的SSL证书。注意我这里使用CN=.我的电脑名,但是你也可以使用nerddinner.com或其他任何你喜欢的名称。最好让它和你已经使用过的名字保持一致性。

makecert -r -pe -n "CN=HANSELMAN-W500" -b 01/01/2000 -e 01/01/2036 -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localMachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12

现在,一个需要注意的部分。到Certificate Manager中找到这个证书。运行MMC.exe,打开File | Add/Remove Snap In,,然后选择Certificates。选中Computer Account.。(这就是你为什么不能仅运行certmgr.msc命令的原因)然后添加。

Description: Adding a Computer Cert

 Personal Certificates1/1/2036过期的证书很可能就是我们要找的这个。双击此证书。转到Details,并滚动到Thumbprint。拷贝到粘贴板,用于标识我们的新证书。

Description: Console1 - [Console Root_Certificates (Local Computer)_Personal_Certificates] (68)

Thumbprint哈希值中删除所有空格。如果你不大熟练可以使用记事本删除这些空格,或如果你够棒你可以用PowerShell删除。

C:\>"41 d8 50 95 11 0e 1d f6 8c 89 84 97 55 25 a8 60 59 35 23 0a" -replace " "
41d85095110e1df68c8984975525a8605935230a

将得到的哈希值插入到此命令的末尾:

netsh http add sslcert ipport=0.0.0.0:443 appid={214124cd-d05b-4309-9af9-9caa44b2b74a} certhash=YOURCERTHASHHERE

AppId不用太在乎,它只是一个GUID(全球唯一标识符)。它告诉HTTP.SYS我们在使用这个证书。保持Certificate Manager MMC打开。

现在,告诉HTTP.SYS我们也用端口443(之前我们也说过使用端口80,还记得吗?):

netsh http add urlacl url=https://hanselman-w500:443/ user=Everyone

回到你的applicationHost.config配置文件并为你的网站添加443端口绑定:

<site name="MvcApplication18" id="39">

  <application path="/" applicationPool="Clr4IntegratedAppPool">

    <virtualDirectory path="/" physicalPath="c:\users\scottha\documents\visual studio 2010\Projects\MvcApplication18\MvcApplication18" />

  </application>

  <bindings>

    <binding protocol="http" bindingInformation="*:15408:localhost" />

    <binding protocol="https" bindingInformation="*:44302:localhost" />

    <binding protocol="http" bindingInformation="*:80:hanselman-w500" />

    <binding protocol="https" bindingInformation="*:443:hanselman-w500" />

  </bindings>

</site>

如果我单击IIS Express托盘图标,选择“显示所有站点”,我将看到我的网站和与它们绑定的URLs

Description: IIS Express (73)

现在我可以访问https://hanselman-w500但会再次出现证书错误。

Description: Certificate Error

返回到证书管理中心MMC,然后将你自签名的SSL证书从个人证书拖动到受信任的根证书下。

Description: Move my cert into trusted certs

我本地的SSD站点突然就变的合法了!太棒了!

Description: No more certificate error

3.ASP.NET 通过URL重写规则的强制使用SSL

CassiniVisual Studio Web Developer Server)不能做UrlRewriting。我希望当我碰到/account/logon /account/register时我的应用程序能强制使用SSL。我将把这个添加进我的应用程序配置文件web.configsystem.webServer的第一个节点。

<rewrite>

  <rules>

    <rule name="Redirect to HTTPS" stopProcessing="true">

      <match url="^account/logon$|^account/register$" />

      <conditions>

        <add input="{HTTPS}" pattern="^OFF$" />

      </conditions>

      <action type="Redirect" url="https://{HTTP_HOST}/{R:0}" redirectType="Permanent" />

    </rule>

  </rules>

</rewrite>

如果我愿意,我也可以使用控制中的RequireHttps属性来配置。

附录Z: 一个完全非正式方法,能部分简化这一过程,如果你使用请自负风险

IISExpress目录里有一个命令行帮助深藏不露,那是我之前从没向你提过的。我们从来没讲过这事啊!我不认识你啊。我是谁?别再打电话来了!J

C:\Program Files (x86)\IIS Express>IisExpressAdminCmd.exe
Usage: iisexpressadmincmd.exe <command> <parameters>
Supported commands:
      setupFriendlyHostnameUrl -url:<url>
      deleteFriendlyHostnameUrl -url:<url>
      setupUrl -url:<url>
      deleteUrl -url:<url>
      setupSslUrl -url:<url> -CertHash:<value>
      setupSslUrl -url:<url> -UseSelfSigned
      deleteSslUrl -url:<url>

示例:

1)    Configure "http.sys" and "hosts" file for friendly hostname "contoso":
iisexpressadmincmd setupFriendlyHostnameUrl -url:http://contoso:80/
2) Remove "http.sys" configuration and "hosts" file entry for the friendly
hostname "contoso":
iisexpressadmincmd deleteFriendlyHostnameUrl -url:http://contoso:80/

 

在命令行中使用此实用程序,我可以通过一个命令快速安装我的hosts文件及HTTP.SYS Url ACL

C:\Program Files (x86)\IIS Express>IisExpressAdminCmd.exe setupFriendlyHostnameU
rl -url:http://daddyisawesome:80/
Command 'setupFriendlyHostnameUrl' completed.

也能删除他们:

C:\Program Files (x86)\IIS Express>IisExpressAdminCmd.exe deleteFriendlyHostname
Url -url:http://daddyisawesome:80/
Command 'deleteFriendlyHostnameUrl' completed.

现在,你只需要用正确地更新IISExpress applicationHost. Config文件中的绑定。你也可以通过IISExpressAdminCmd setupSslUrl来使用已经预留的SSL端口。然而,我还是认为困难的方法是最好的,因为你可以确切看到它怎么运行,并且你可以对它有更多的控制。

让它停下!

怎样撤销所做的这一切?在CertMgr删除证书,或在管理控制台运行以下命令:

netsh http delete sslcert ipport=0.0.0.0:443
netsh http delete urlacl url=http://hanselman-w500:80/
netsh http delete urlacl url=https://hanselman-w500:443/

如果你在HTTP.sys注册了SSLCerts,那么将这些命令需要略作调整。

希望你能喜欢!感谢CarlosAG在我写作这篇文章时提供的帮助。

 

Leave a Comment
  • Please add 4 and 5 and type the answer here:
  • Post