第 7 章在存储库中没有源代码示例,因为本章主要涉及设置 SSL 证书。
HTTPS 是今天所有网络服务器的一个要求。出于这个原因,我把关于 HTTPS 的章节放在这里,这样它就不会被忽略,也不会作为“可选阅读”留在书的最后。本章将向您展示如何创建自己的证书,以使 HTTPS 能够与您的 web 服务器通信。创建您自己的证书需要用户接受一个未知的发行者证书,但是,对于如何设置您的 web 服务器来处理 HTTPS,这仍然是有帮助的。
请注意,这些说明是为 Visual Studio 2012 和 Windows 7 编写的。
SSL 证书有三个级别:
- 域验证
- 组织验证
- 扩展验证
除其他外,证书提供的验证越多,获得证书的成本就越高。
域验证(DV)建立了对网站的基线信任级别,确保您正在访问的网站确实是您打算访问的网站。这是我们将在这里创建的证书。该证书的缺点是很容易获得,并且只能保证浏览器和服务器之间的通信。
组织验证(OV)是一种更安全的证书,因为它需要验证一些公司信息以及域和所有者信息。除了加密数据之外,你还对运营网站的公司增加了信任度。
扩展验证(EV)级别的认证要求公司经历一个审查过程,在这个过程中,公司的所有细节都得到验证。只有通过彻底审查的公司才能使用这种级别的证书。
在这个过程中,我们将制作自己的证书。因为我们不是证书颁发机构,浏览器还是会质疑证书是否合法。当你第一次访问你的网页服务器上的一个页面时,它会这样做。创建您自己的证书对测试很有用,并且可以启用 SSL,这样至少可以加密客户端的数据。
这里描述的步骤看起来令人望而生畏,但已经过彻底的测试,如果您精确地遵循它们,您应该不会有任何问题。
首先,启动 Visual Studio 命令行提示符。例如,如果您在 Windows 7 中使用 VS2012,请单击开始菜单上的所有程序。选择微软 Visual Studio 2012 ,点击 Visual Studio 工具,选择vs 2012开发者命令提示符。
图 15:开发人员命令提示符
在控制台窗口中,键入以下内容(全部在一行中),但用您的计算机名或域名替换[computername]。您可以在 MSDN 上阅读更多关于makecert选项的信息。
Makecert -r -pe -n CN="[computername]" -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -sky exchange -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12代码清单 57
例如(我用的是"test"和电脑名称):
图 16: Makecert 示例
在控制台窗口中,创建证书后,键入 MMC 启动微软管理控制台。
从文件菜单中,选择添加/删除管理单元。
图 17:添加证书管理单元
选择证书,点击添加。
图 18:选择证书
选择电脑账号。
图 19:选择电脑账号
然后点击下一步 > 完成 > 确定。
双击个人文件夹,然后双击证书文件夹。
双击证书,您应该会看到一个对话框,说明“此 CA 根证书不受信任。”
图 20:证书信息
如果您收到任何其他消息,证书将无法正常工作。
点击详情选项卡,向下滚动选择指纹字段。将该值复制到记事本中,因为这将在以后使用:
图 21:证书指纹
使用记事本的搜索和替换功能删除所有空白:
图 22:删除空白
- 在同一详细信息选项卡中,单击复制到文件。
- 点击下一步。
- 点击下一步(不要导出私钥)。
- 点击下一步 (DER 编码二进制 X.509)。
- 输入您的证书的文件名,如c:\ temp \迈锡特. cer 。
- 点击完成。
- 点击确定关闭证书对话框。
现在,打开可信根证书颁发机构\证书文件夹。
图 23:证书文件夹
右键单击证书文件夹,选择所有任务 > 导入。
图 24:进口证书
- 点击下一步。
- 输入刚刚导出的证书的文件名。
- 点击下一步。
- 单击下一步(将所有证书放入以下存储:可信根证书颁发机构)。
- 点击完成。
回到个人/证书文件夹,双击您之前创建的证书。确认您现在看到“本证书用于以下目的:”。
图 25:验证证书是否可信
在我们之前打开的 VS2012 命令行控制台窗口中,使用netsh(您可以在 MSDN 上了解更多信息),将证书绑定到所有 IP 地址和 SSL 端口,用我们获得的指纹替换[yourhash]:
netsh http add sslcert ipport=0.0.0.0:443 certhash=[yourhash] appid={[your app ID]}代码清单 58
[your app ID]的值应该是与您的应用相关联的 GUID。例如,我使用了属性\AssemblyInfo.cs 文件夹中的 GUID 作为assembly: Guid键。
因此,您的netsh命令,使用我们从应用获取的指纹和 GUID,看起来像这样(都在一行上):
netsh http add sslcert ipport=0.0.0.0:443 certhash=c92f416b22913000b670f937c95a9e3ecb7baac4 appid={1a1af1ff-1663-4e58-915a-6ea844508a33}代码清单 59
您的计算机现在已经准备好响应 HTTPS 的网络请求(假设您设置了网络服务器来监听 HTTPS)。第一次浏览页面时,Windows 会提示您接受来自未知机构的证书。例如,Opera 会给你这样的信息:
图 26:证书警告
为了避免此警告,您必须从可信机构获得证书,例如 Verisign 。有各种各样的权威机构,证书的价格差异很大,所以调查这些差异是值得的。此外,您的主机提供商也可能提供 SSL 证书。
但是,我们必须设置我们的 web 服务器来侦听 SSL 请求,这些请求默认位于端口 443:
listener.Prefixes.Add("https://localhost:443/");代码清单 60
正如本章开头所述,HTTPS 是当今所有网络服务器的一项要求——不仅仅是处理信用卡信息(例如,如果你正在建立一个商家网站),而且是处理浏览器和服务器之间所有数据交易的理想选择。然而,在保护用户数据的安全方面,使用 HTTPS 并不是最终目的:例如,您可能会考虑加密敏感数据,或者如果数据永远不需要解密(密码就是一个很好的例子),您可能会使用单向哈希。根据您的网站处理的数据类型,您还需要熟悉一些法律要求。
安全应该是网站的首要考虑因素,这一点怎么强调都不为过,因为网站包括所有可以拦截数据的级别,从浏览器开始,到传输层,再到服务器和任何敏感信息的持久存储。











