[Nginx]HTTPS 网站速度优化 – 开启 OCSP Stapling(日期:20180514)

2018年5月14日 0 条评论 239 次阅读 0 人点赞

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。

如果你能看懂我上面说的,你应该就会发现,这很显然就会存在一些问题:

  1. 这种查询是要经过第三方的,而第三方不一定在全球都有服务器提供查询。在查询完成之前,你的服务器和用户的浏览器没法进行后续的连接动作,也就是说你网站的打开速度中间受到了第三方网站的查询速度影响
  2. 对于在国内的用户来说,还存在查询地址被墙导致的额外一些问题
  3. 会让你证书颁发机构的查询网站知道你的网站访客信息

而为了解决这些问题,便有了 OCSP Stapling 的存在。

OCSP Stapling 是什么呢?其实它也是在做上面 OCSP 的事情,所不同的事,它不是由你网站的用户那边进行的,而是用你的服务器定时去查询你证书的状态并缓存下来,然后在和访客的浏览器连接的时候,直接在连接过程中向它返回你证书的查询结果,而不用再去请求第三方的查询。当然,这个是需要浏览器的支持的,不过现代的浏览器一般都支持就是了。

通过 OCSP Stapling,我们可以解决的问题:

  1. 网站的打开速度基本不会再被第三方查询网站影响,和网站自己的服务器连接通信体验比较统一,且不必实时查询状态,服务器方面会缓存结果
  2. 隐私方面的保护
  3. 降低墙的影响。什么?你网站也被墙了,那你用第三方的能查询又有什么用呢?

 

三、配置 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 的速度优化其实还有其它的配置,这次时间有限就不提了,下次再聊。

相似文章

12点半

Hello world!

文章评论(0)