SSL介绍

SSL 介绍、使用及免费SSL 申请教程2012年07月15日 ⁄ 免费资源, 博文记事⁄ 共 11571字 ⁄ 暂无评论⁄ 被围观 6 分享到:似乎不少使用国外主机的站长都想弄个 https://

SSL 介绍、使用及免费SSL 申请教程

2012年07月15日 ⁄ 免费资源, 博文记事⁄ 共 11571字 ⁄ 暂无评论⁄ 被围观 6

分享到:

似乎不少使用国外主机的站长都想弄个 https:// “玩”,但是许多人对

SSL/TLS、HTTPS 、证书等概念了解有限,而中文互联网上相关的教程也不是很完备,各种杂乱。正好,本人这几天花了点时间研究了一下,给自己的站也部署了 HTTPS ,写成这篇《Apache WordPress SSL 完全指南》,以飨中文读者。本文较长,但是我会尽量写得清楚明白的。

,

一、基本术语及证书原理介绍

本部分有点枯燥,不愿意读的读者可以直接跳过。以下出现的缩写鼠标悬浮于上可查看全称。

HTTPS

HTTPS 就是“超文本安全传输协议”,通俗地说就是建立在 SSL/TLS 上的 HTTP。 SSL/TLS

理论上讲这是两个协议,后者是前者的继任者,但其实 SSL 3.0 和 TLS 1.0 的差异很小,所以两者很多时候是混为一谈的„„这两个都是传输层协议,在他们的基础上可以建议应用层的协议如 FTP 和 Telnet,上面说的 HTTPS 就是建立在 SSL/TLS 基础上的 HTTP。

证书

,

这里的证书主要指使用公私钥对加密的证书。下面主要会涉及到两种证书,一个是 S/MIME 证书,另一个就是 SSL/TLS 证书了。前者可以用在电子邮件上,这里用作“服务器身份识别”,可以理解为取代传统的“用户名 密码”的认证方式的一把“钥匙”。后者一般用于服务器加密(网页、邮件服务等),也就是我们部署 HTTPS 时所必须的。

本文出现的证书都是用公私钥加密的证书。这涉及到 [[非对称加密]] 技术,每张证书都由一个公钥和一个私钥组成,两个拼在一起才是一套。其中,正如它们的名字所暗示的,公钥是可以随便发给别人看的,而私钥一定是要保密的,如果私钥被偷了,后果很严重。

信任链与 CA

CA 就是“数字证书认证中心”,是证书的签发机构。证书的世界里有一套信任体系,信任了一家机构之后,此机构签发的证书都是受信的。在我们的操作系统和浏览器中,内置了几家靠谱的 CA 的根证书,并列为可信任的证书。而这些 CA 签署的证书,由于信任链的关系,也是默认被信任的。比如中国招商银行的网银页面就是用的 VeriSign 签署的的证书。由于 VeriSign 是一家老牌的靠谱 CA,大部分操作系统和浏览器默认都是信任 VeriSign 的根证书的,当然也就默认信任招商银行用的证书了。

如果有一家 CA,比较年轻,发展得还不够大,那么就会面临有的地方信任,有的地方不信任的问题。比如 CACert.org 就是这样一家 CA。这是一家靠社区驱动的 CA,它的根证书受到 Arch Linux 等一些 Linux 发行版的信任,但是却不受 Windows 和 OS X 的信任(完整的受信任列表见这里),所以它的网站(用了它自己的证书)若是用 https:// 浏览的话(点击这里),一些 Linux 用户会毫无压力地进入,而 Windows 和 OS X 用户则会看到证书警告说该网站的证书不受信任。以下两张截图便显示了这一点:

,

而如果有一家 CA 完全就像街头的“办证”广告那样完全胡来,那自然是没有任何一家去信任它的证书了,比如下面这个:

,

大家都懂的„„

不过需要说明的是,如果你使用自签名证书的话,对用户来说默认都是不受信任的。

二、部署 HTTPS 的前提条件

以下是部署 HTTPS 的前提:

最好是 VPS 甚至独立服务器。如果是共享主机的,则需要主机商提供 SSL/TLS 功能(有的面板有这样的功能),否则不行。

服务器上必须开启了 mod_ssl 。(共享主机的话,主机商一般都开启了)

最好有独立 IP。如果没有,则需要主机打开 SNI 功能(见 RFC 4366),但 XP IE8 及以下是不支持 SNI 的,会报证书错误。(PS :Showfom 注,也有比较高级的证书是支持多域名的,比如 CloudFlare 在使用的 GlobalSSL ,如图) 最好去申请/购买一张正规的第三方知名 CA 签署的证书,不要像铁道部那样胡

,

乱搞一个。不过,如果你只是为了测试用途或是对网站数据进行特殊加密自己私下使用的话(你懂的),自签名的证书也是可以的。

推荐有一个 Linux 运行环境。如果已经是 Linux 服务器的话,直接 SSH 进服务器执行命令也是可以的。

三、自签名证书

虽然不一定受信,但是证书的确是人人都可以自己制作的。有的时候,我们使用 HTTPS 只是为了数据的加密,仅供自己使用,不用管别人信任与否,这时候就可以用到自签名证书。在这种情况下,你可以把自己创建的证书加入到自己的桌面电脑的信任列表,这样就不会再有错误提示了。

Apache 的文档中有 Creating self-signed certificates 这一节教你怎么创建自签名证书,简单明了,十分傻瓜:

用包管理器安装 ssl -cert 这个包,再执行

sudo make-ssl -cert /usr/share/ssl-cert/ssleay.cnf /path/to/cert.pem 命令,按照提示输入一个 Common Name(CN ,保持和主机名相同),便能按照 /usr/share/ssl-cert/ssleay.cnf 这个默认模板生成一份证书,这份证书是公钥和私钥合并在一个文件里的,用文本编辑器打开将看到这样的结构: -----BEGIN PRIVATE KEY-----

MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC3Y VVgZ0R tjV rH4ZAE4EnGhDUPSe GHNFvz9SwpRl/hoCvlclTyV/kZwFC6gS1Gx3wIOM6eBFIMb 16koaOaXWsCNP9LZUjCNj8V497SVvdHqovzx7ztCrKzOcUMK6VwsF/ynJYor6oYQ jdVvLuCnb/fw1Na 9w5fVUees7lVXBY60TRvAS82yyzuwRaZcJHWqTzysKNz01Mk zhcNughh9ONfRC6Q0AeKVLWw

-----END PRIVATE KEY-----

-----BEGIN CERTIFICATE-----

MIICpDCCAYwCCQDdTk8KetUkFTANBgkqhkiG9w0BAQUFADAUMRIwEAYDVQQDEwls b2NhbGhvc3QwHhcNMTIwNjEwMTE1NDUwWhcNMjIwNjA4MTE1NDUwWjAUMRIwEAYD 6JWaSpkY1WJ8XPMwc/eAdFi0b58GQtv5uMXwVnjGy/P1TKoP76REt4TVwKXuiTPB 4m/ZyTVbJ81JfSjm0xxTQl39kJjhzNenYOBSOy/1YH2vSRAVnuoy/aFSyXggUz2 PpZt4UZ0c7g=

-----END CERTIFICATE-----

前面那段是私钥,后面那段是证书信息和公钥。这份证书默认的有效期是 3650 天(十年)。

其实刚才那个傻瓜式的命令实质上是执行了这个:

sudo openssl req -new -x509 -days 3650 -nodes -out /path/to/cert.pem -keyout /path/to/cert.pem

各参数的意义:

openssl req -new:用 OpenSSL 套件生成新的证书请求

-x509:使用 X.509(PEM 编码的一种实现)

-days 3650:有效期是十年,可以自己改

-nodes :这个不是英文单词 “nodes ”,而是 “No DES ” 的意思,代表不用 DES 加密私钥,否则私钥默认是用 DES 加密的,每次启动 Apache 要输入密码 -out :证书(包括证书信息和公钥)的文件名

-keyout :私钥的文件名,如果此项和上一项同名的话,那么公钥和私钥是合并

,

在同一文件里的(正如上面所贴的)

执行这个命令会让你输入一系列信息,比如 Common Name (CN)、公司名、地理位置、联系方式等,除了 CN 必须要和网站域名匹配之外,其他可以按照你的喜好自由填写。

证书生成好后,便是在 Apache 的配置文件中指定它了。具体的配置文件写法可以参考它自带的 /etc/apache2/sites-available/default-ssl 配置文件,主要是以下这几行要修改:

SSLEngine on

SSLCertificateFile /path/to/cert.crt

SSLCertificateKeyFile /path/to/cert-key.key

并且如果按照上文,把公钥和私钥放在同一个文件里的话,那只要提供

SSLCertificateFile 就好了,后面的 KeyFile 不用填(保持它们的注释状态)。 插播:Linux 是不分辨文件扩展名的,所以理论上上面的这些公钥婆钥私钥的扩展名都是可以随便起的,甚至不填也可以,但是为了方便自己弄清楚,我习惯上是这样命名的:只包含证书信息和公钥的文件扩展名为 crt,同时包含了公钥和私钥的文件扩展名为 pem,只包含私钥的文件扩展名为 key。

保存配置文件后,用 sudo a2ensite 来启用它,再执行一下 sudo a2enmod ssl 确保 mod_ssl 已经开启(如果使用虚拟主机的话,还需要在 apache2.conf 加上 NameVirtualHost *:443 这一条),然后执行 sudo service apache2 restart 来重启 Apache。如果没有出现奇怪的错误的话,那么现在你的网站已经可以通过 https:// 协议访问了。当然,由于这个证书是不受信任的,浏览器会弹出安全警告,不用管,虽然证书是不受信任的,但是毕竟是 TLS,所以传输的内容已经是加密过的了,第三方无法知道你访问的网站内容。如果不想每次都看到证书警告的话,可以把这个证书导入到系统中,设为信任。在 Firefox 中也可以选择“添加例外”。

四、第三方签名证书

虽然自签名证书默认是不受操作系统或浏览器的信任的,但是这并不影响它能够加密传输内容的本质。自签名证书给自己用是足够了,如果嫌证书警告烦人的话,自己添加为信任就好了,甚至在一小撮人中用也是足够了——你把证书发给你的朋友们,让他们也设为信任,这样他们访问你的网站的时候也不会弹警告了。但是如果要全世界大部分人访问你的网站的时候都不会弹证书警告的话,就要找一些靠谱的第三方 CA,让它们帮你签名证书,由于大部分人的操作系统或浏览器都是信任这些靠谱 CA 的,所以由他们签名的你的证书也是受信任的,这样访问你网站的时候就不会弹证书警告了。

注意:第三方签名证书不代表比自签名证书的加密更强悍更可靠!TLS 的加密强度由加密的位数决定,与证书是谁签名的无关。找第三方签名只是为了不弹证书警告。如果你只是自己用或是一小撮人用的话(思路提醒:twip ),用自签名就足够了。

要使用第三方签名证书,首先同样要创建私钥:

openssl genrsa 1024 > ssl.key

各参数含义:

openssl genrsa 1024:用 OpenSSL 来生成一个 1024 位 RSA 加密的私钥(Generate RSA),这个位数是可以改的

,

> ssl.key:通过重定向命令,把生成的私钥保存到 ssl.key 这个文件中

生成好了之后用一些图形化的证书查看器查看大概是这个样子的(当然,指纹肯定不一样„„)

然后你也得告诉第三方 CA 你的 CN、地址、联系方式等,这时需要使用

Certificate Request,就是“证书请求”,它是私钥和证书信息的整合,把它交给第三方 CA,他们可以读取这个文件中的私钥和证书信息,然后帮你签名。这个 Certificate Request 文件的扩展名一般用 csr。

在刚才私钥的基础上生成证书请求的命令是这个:

openssl req -new -key ssl.key > ssl.csr

执行了之后也会要求你输入证书的信息,然后把最终生成的结果放到 ssl.csr 中。如果用文本编辑器打开这个文件,看到的是类似这样的东西:(我省略了一部分字符)

-----BEGIN CERTIFICATE REQUEST-----

MIIBhDCB7gIBADBFMQswCQYDVQQGEwJBVTETMBEGA1UECAwKU29tZS1TdGF0ZTEh MB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMIGfMA0GCSqGSIb3DQEB

,

AQUAA4GNADCBiQKBgQDXRbfQQP TulvM8Qz5d/IhzLxav6VcX/Zhy5HTftCKeIhH B0bNH6PDxg5tmqY9g9hzgl5OLhkkTYEYsYugKYxdAx/aK3XXAGruguzSbc4fA2Rx leo0Ow9DQGo=

-----END CERTIFICATE REQUEST-----

把这个文件传给 CA,他们签名之后会给你颁发公钥证书,然后把它添加到 Apache 的配置文件中了:

SSLEngine on

SSLCertificateFile /path/to/cert.crt

SSLCertificateKeyFile /path/to/cert-key.key

SSLCertificateChainFile /path/to/chain.pem

因为这是第三方 CA 签名的,所以要有一个把你的证书和它的根证书相连接的过程。如下图:

那个 ChainFile 就是中间那一环。当然了,正如 KeyFile 可以和主证书文件合并一样,这个 ChainFile 也是可以和主文件合并的,这三个全部首尾相连地并成一个文件也是没有问题的,这样就只要填一个 SSLCertificateFile 就好了。 改好配置之后,像上面自签名那样,也重启一下 Apache,就可以用 https:// 协议访问了。并且,由于是大家都信任的靠谱 CA 签名的,这样的证书是不会弹证书警告的。

五、WordPress HTTPS 免插件部署指南

解决“混合内容”问题

这一节主要讲一下 WordPress 的 HTTPS 实现。在 WordPress 的插件库中,有一个叫 Force SSL 的插件,它的作用是当用户用 https:// 访问的时候,实时解析页面中所有的 URI,把 http:// 换成 https://。本来我觉得那插件还是不错的,后来我把 php 的内存限量稍微改小一些,就大量出现 500 错误,一看错误日志,竟然全是那个插件“试图分配超过限额的内存”,这才觉得这插件实在太耗资源了!所以我果断删除了那个插件,开始尝试无插件实现 WordPress 的 HTTPS 访问。

如果按照上面的教程,把证书什么的都设置好了的话,这时候 WordPress 已经可以通过 https:// 协议访问了,但是有问题:页面中的图片、CSS 、JavaScript 的 URI 都是 http:// 的,所以会有“混合内容”的问题,在 Chromium/Chrome 里是一个难看的红叉叉(高危内容,如 JavaScript)或灰色的锁上有个黄三角

,

(低危内容,如图片),在 Internet Explorer 里则是显示为“混合内容”,弹出大量烦人的警告窗口。那个 Force SSL 插件的两大作用之一就是把这种资源的 URI 改成 https:// 的。

但是,让我们手工来改吧。这里要介绍一下“协议级相对路径“,例子可以见 Google HTML/CSS Style Guide 的建议:

Omit the protocol from embedded resources.

Omit the protocol portion (http:, https:) from URLs pointing to images and other media files, style sheets, and scripts unless the respective files are not available over both protocols.

标签: