Nginx 开启 HTTPS 的话还是挺简单的,现在也有很多自动化工具能帮忙干这些事情,对于只想写博客或者是对技术或 Nginx 配置不太了解的人来说,经常是开启了 HTTPS 这个功能就了事了,但是很多时候这么做是不够的,因为 HTTPS 大家常说的缺点就是开启了会让网站变慢。其实这也不能全怪 HTTPS,有时候我们能只要做一下小小的优化,对网站速度的影响也是可以降下来的~
一、开启 HTTPS 的一般配置
在介绍后面的优化方法之前,我们先看看 Nginx 开启了 HTTPS 之后的一般配置:
server { listen 443 ssl http2 listen [::]:443 ssl http2 server_name example.com; index index.html index.htm index.php default.html default.htm default.php; root /home/example.com; ssl on; ssl_certificate /usr/local/nginx/ssl/example.crt; ssl_certificate_key /usr/local/nginx/ssl/example.key; }
首先要开启 HTTPS,我们一般是需要找到你网站对应的 Nginx 配置文件,在 443 端口进行配置(默认 HTTPS 服务使用的是 443 端口)。这个文件的存放位置根据个人的设置可能有所不同,一般都是 example.com.conf 这样或者类似的文件。
在上面的例子中,最后的那三行就是来开启 HTTPS 的:
ssl on; ssl_certificate /usr/local/nginx/ssl/example.crt; ssl_certificate_key /usr/local/nginx/ssl/example.key;
对于开启 HTTPS 的有关说明,我就不详细说了,这里只是让大家了解一下。
通过上面的例子,我们知道开启 HTTPS 还是很简单的,但是这往往是不够的,因为开启了并不就是一了百了,很多时候或者说是大多数时候,我们还是要进行一番优化或者详细配置的,不然很可能就会让你的网站变慢,所以下面我们就来说其中一项你可以选择做的——开启 OCSP Stapling。
二、OCSP Stapling 介绍
这一部分,咱们就不说那些技术类的东西了,懂的人都懂,不懂的人说了也不容易懂,而且我也不是很懂~所以我就按照自己的理解来跟大家解释了。
首先我们要了解,现代的浏览器在遇到 HTTPS 的网站时,都会有一个实时查询你网站用的 HTTPS 证书是否有效的行为,这个查询到哪里去查呢?根据你使用的证书是哪一家的来判断,你用的哪一家的证书,就到那家的官方查询地址去查。这种行为,叫做 OCSP。
如果你能看懂我上面说的,你应该就会发现,这很显然就会存在一些问题:
- 这种查询是要经过第三方的,而第三方不一定在全球都有服务器提供查询。在查询完成之前,你的服务器和用户的浏览器没法进行后续的连接动作,也就是说你网站的打开速度中间受到了第三方网站的查询速度影响
- 对于在国内的用户来说,还存在查询地址被墙导致的额外一些问题
- 会让你证书颁发机构的查询网站知道你的网站访客信息
而为了解决这些问题,便有了 OCSP Stapling 的存在。
OCSP Stapling 是什么呢?其实它也是在做上面 OCSP 的事情,所不同的事,它不是由你网站的用户那边进行的,而是用你的服务器定时去查询你证书的状态并缓存下来,然后在和访客的浏览器连接的时候,直接在连接过程中向它返回你证书的查询结果,而不用再去请求第三方的查询。当然,这个是需要浏览器的支持的,不过现代的浏览器一般都支持就是了。
通过 OCSP Stapling,我们可以解决的问题:
- 网站的打开速度基本不会再被第三方查询网站影响,和网站自己的服务器连接通信体验比较统一,且不必实时查询状态,服务器方面会缓存结果
- 隐私方面的保护
- 降低墙的影响。
什么?你网站也被墙了,那你用第三方的能查询又有什么用呢?
三、配置 OCSP Stapling
很显然,OCSP Stapling 是能帮助你提高网站的打开速度的,所以我们来说说怎么配置。
根据上面开启 HTTPS 的配置,在 443 端口的配置中,加入一些额外的配置项目:
server { listen 443 ssl http2 listen [::]:443 ssl http2 server_name example.com; index index.html index.htm index.php default.html default.htm default.php; root /home/example.com; ssl on; ssl_certificate /usr/local/nginx/ssl/example.crt; ssl_certificate_key /usr/local/nginx/ssl/example.key; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /xxx/full_chain.pem; }
多出来的是需要你添加在原配置中的:
ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /xxx/full_chain.pem;
注意!这个是要添加在 443 端口的配置中,不要添加到 80 端口的去了,那个是 HTTP 的。
关于上面的三行内容,我们一个一个来说明一下:
- ssl_stapling on
很简单就能理解,开启 OCSP Stapling 功能。
- ssl_stapling_verify on
开启查询验证的功能。一般我们在开启 HTTPS 用的证书是只包含站点证书和中间证书的,而 OCSP Stapling 要能完美的工作,需要提供包括站点证书,中间证书和根证书,一样都不能少,这样才能正常的通过验证。
- ssl_trusted_certificate /xxx/full_chain.pem
在这里指定你完整证书文件保存的路径,完整证书不需要包含用户证书,只需要包含你网站的证书所使用到的所有中间证书和根证书。
四、OCSP Stapling 所需要的证书说明
是不是被上面提到的证书弄懵了?特别提醒,这里用到的证书和你开启 HTTPS 用到的证书不太一样,下面来给大家详细说明下。
首先以博主自己的网站 HTTPS 证书为例,点击博客的 HTTPS 证书,并选择查看证书,在点击查看详细信息:
注意上图的证书结构,可以看到博主所使用的证书有三层:DST 根证书→Let’s Encrypt 中间证书→网站自己的网站证书。
如果我的博客要开启 OCSP Stapling,我填的证书内容里就需要填写有 Let’s Encrypt 中间证书 →DST 根证书(不包含网站证书)。这里特别说明下,注意博主说的顺序,你的证书文件里的内容是不能乱写顺序的,要按照子证书在前,父证书在后的顺序填写。
用我的 HTTPS 证书举例让大家了解下:DST 根证书是 Let’s Encrypt 中间证书的父证书,Let’s Encrypt 中间证书是 DST 根证书的子证书。Let’s Encrypt 中间证书是网站证书的父证书,网站证书是 Let’s Encrypt 中间证书的子证书。
那么我 OCSP Stapling 中要用到的证书填写顺序就应该是:先填写 Let’s Encrypt 中间证书的内容,后面再接 DST 根证书的内容,网站证书不需要填入。
PS:如果你的中间证书不是像我的一样只存在一个,那也不需要担心,和上面讲的同理,按照顺序加入就可以了,最终加入的证书始终要是根证书。
说了这么多,可能有人要问了,顺序我么知道了,那这个证书到底该怎么得到或者生成呢?其实很简单,你只需要用文本编辑器生成一个文件(用 Windows 的朋友们,慎用记事本来创建,建议用专业些的文本编辑器),并用文本编辑器打开你的中间证书和根证书文件,把里面的内容按照前面说的顺序复制粘贴到你生成的文件里面,并把生成的文件保存为 UTF-8 无 BOM 格式的 .pem 文件,上传你服务器某个目录下保存好就行了。
关于中间证书和根证书的获取:
- 中间证书
我们一般在签发机构得到的 HTTPS 证书,里面的内容会包含有中间证书,以博主的证书举例,完整的证书链本来是有三层证书的,但是如果博主我用文本编辑器打开 HTTPS 证书,很可能只能看到两段内容,前面一段是网站证书,后面一段是 Let’s Encrypt 中间证书(和前面我们要填写的顺序是一样的先后次序)。把后面一段的内容粘贴到我们生成的新文件里就行了。
三层证书的结构举例(需要复制的是后一段内容):
-----BEGIN CERTIFICATE----- XXXXXXXXXXXXXXXXXXXXXXXXXXX -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- XXXXXXXXXXXXXXXXXXXXXXXXXXX -----END CERTIFICATE-----
四层证书的结构距离(需要复制的是后两段内容):
-----BEGIN CERTIFICATE----- XXXXXXXXXXXXXXXXXXXXXXXXXXX -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- XXXXXXXXXXXXXXXXXXXXXXXXXXX -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- XXXXXXXXXXXXXXXXXXXXXXXXXXX -----END CERTIFICATE-----
一般 HTTPS 证书里面的内容和我们要生成的 OCSP Stapling 需要使用的证书里面的内容顺序是一致的,不需要你自己再去辨别先后顺序,把除了第一段内容以外的全部内容复制粘贴到 OCSP Stapling 需要使用的证书开头就可以了。
注意和你 HTTPS 证书的完整证书链对比观察有几段内容,一般都是比完整证书链要少一层(不包含根证书)。少两层甚至只有一段内容:不包含中间证书或者中间证书包含不完整。和完整证书链同层:包含了完整的中间证书和根证书,把除第一段的内容全部复制到 OCSP Stapling 需要使用的证书里面,后面获取证书的说明就不用看了。
- 根证书
前面把中间证书添加进去了,根证书怎么获取呢?这个一般需要你到你的系统里面找,不过挺麻烦的,简单点的办法就是直接去你证书签发机构的官网,一般都会有提供这个证书,下载下来用文本编辑器打开,把里面的内容全部加到 OCSP Stapling 需要使用的证书最后面就可以了。
- 中间证书不包含在 HTTPS 证书中或者包含不完整
同上,去官网下载。
五、关于一个网站使用了多证书的 OCSP Stapling 配置
一般的网站主,都只会使用到一个证书,但是 Nginx 其实是支持使用双证书的,对于这种情况,我们不需要做太多的改动,要添加的内容和三中写的一样,只是在最后的 OCSP Stapling 证书这里有点区别,具体要做的很简单:OCSP Stapling 这里用的证书文件是支持添加多个中间证书和根证书的,我们只要按照四里说的内容,在添加完第一个证书所需要的中间证书和根证书以后,另起一行,按同样的步骤再添加第二个证书的中间证书和根证书就可以了。
PS:该方法因为条件有限,本人无法完整的测试出来,结论是参考的网上的讨论,在博主某个小网站上测试的,目前在 SSL Labs 的有关测试中已通过验证。
六、温馨提醒~
改完你网站的 Nginx 配置文件,别忘了使用命令重启 Nginx 或者重载 Nginx 以让新配置生效哦~
七、教程及信息参考
中文维基百科“OCSP装订”条目:https://zh.wikipedia.org/wiki/OCSP%E8%A3%85%E8%AE%A2
Jerry Qu 博客《本博客 Nginx 配置之性能篇》:https://imququ.com/post/my-nginx-conf-for-wpo.html
对网站弄好了 OCSP Stapling 后,此时你的服务器会自动缓存查询结果并返回给你网站的访问者,这个是不需要你自己来操作的,很方便。如果此时你测试一下的话,应该会发现你网站的响应时间会有所降低~这次就说到这里了,HTTPS 的速度优化其实还有其它的配置,这次时间有限就不提了,下次再聊。