Nginx 为 HTTPS 加密站点启用 Certificate Transparency

Nginx 为 HTTPS 加密站点启用 Certificate Transparency传统的 SSL 认证身份的过程可能存在着受信任 CA 错误或某些不负责任行为、抑或是自身域名被别人冒充申请颁发证书的潜在危险,这是 SSL 认证环节中容易被利用的一环。由 Google 主导的 Certifite Transparency (CT)希望解决这些问题。任何证书持有人、CA 都可以向 CT 服务器提交证书,并接受审计和监控,使得当前的 CA 能够更加安全公开和透明。

启用 Certificate Transparency 与否的不同

如果 HTTPS 网站没有部署 Certificate Transparency,会有什么不同呢?

首先,Google Chrome 浏览器取消了对没有 CT 记录 Extended Validation(EV)证书绿条(Green Address bar)的显示。

其次,如果你有 iOS 开发的需要,你会了解到 iOS 9 新增了一个叫做 App Transport Security (ATS)的特性,开始默认强制所有请求为 HTTPS 请求。如果你的网站不支持Certificate Transparency,那么将不能通过 NSRequiresCertificateTransparency 的情况。

除此之外,对于大多数中小型网站 CT 的启用与否,还没有太大的区别。在 Chrome 上点击证书绿锁可以看到,未启用 CT 的网站和启用 CT 的网站存在着下面这一句话的细微区别。

Nginx 为 HTTPS 加密站点启用 Certificate Transparency

服务器提供了有效的 Certificate Transparency 信息。

Nginx 为 HTTPS 加密站点启用 Certificate Transparency

服务器未提供任何 Certificate Transparency 信息。

Nginx 下为 SSL 站点启用 Certificate Transparency

一般地,要启用 CT,一般有 X.509v3 extension、TLS extension、Online Certificate Status Protocol (OCSP) 三种方法。下面介绍支持支持所有证书的 TLS 扩展方法。

获得 ct-submit 提交程序

首先需要获得用于提交证书的 ct-submit。
它的编译亦需要 Go 语言。

cd ~
apt-get install golang
wget https://github.com/grahamedgecombe/ct-submit/archive/v1.0.0.zip
mv v1.0.0.zip ct-submit.zip
unzip ct-submit.zip
cd ct-submit-1.0.0
go build

在这个文件夹下,向任意的 CT 服务器提交你的证书。

./ct-submit-1.0.0 ct.googleapis.com/aviator < /etc/nginx/ssl/server.pem > ./google-aviator.sct
./ct-submit-1.0.0 ct1.digicert-ct.com/log < /etc/nginx/ssl/server.pem > ./digicert-ct.sct

这里的 /etc/nginx/ssl/server.pem 是你的网站证书,它的名字也有可能是 server.crt。如果提交错误,将会显示错误。

现在把这些证书移动到统一的地方管理。

sudo mv ./google-aviator.sct /etc/nginx/ssl/scts/
sudo mv ./digicert-ct /etc/nginx/ssl/scts/

获取 CT 模块、OpenSSL 模块

Nginx-CT 需要与 OpenSSL 1.0.2 以上的版本。下面使用 CloudFlare Patch OpenSSL。

cd ~
git clone https://github.com/cloudflare/sslconfig
wget https://github.com/openssl/openssl/archive/OpenSSL_1_0_2g.zip
unzip OpenSSL_1_0_2g.zip
mv openssl-OpenSSL_1_0_2g/ openssl
cd openssl
patch -p1 < ../sslconfig/patches/openssl__chacha20_poly1305_draft_and_rfc_ossl102g.patch

欲使 Nginx 支持 CT,还需要在它编译之时加入这个模块。

cd~
wget -O nginx-ct.zip -c https://github.com/grahamedgecombe/nginx-ct/archive/v1.0.0.zip
unzip nginx-ct.zip

无缝升级当前的 Nginx

我们需要为现行的 Nginx 加入新的 CT 模块。如果你没有安装 Nginx,请先按照这里的方法安装。

首先运行

nginx -V

并拷贝得到的现行的安装参数。下面编译 Nginx。

cd ~
wget -c http://nginx.org/download/nginx-1.9.12.tar.gz
tar zxf nginx-1.9.12.tar.gz
cd nginx-1.9.12/
./configure 粘贴既有安装参数 --add-module=../nginx-ct-1.0.0 --with-openssl=../openssl --with-http_v2_module --with-http_ssl_module

make

完成之后,我们就可以无缝升级 nginx 了。

先来看看它在哪里。

which nginx

例如 nginx 被安装在 /usr/sbin/nginx

sudo service nginx stop
mv /usr/sbin/nginx /usr/sbin/nginx.old
cp objs/nginx /usr/sbin/nginx

让我们测试一下 Nginx 是否可用。

sudo nginx -t

如果成功,则升级完成了。
现在就可以重启 Nginx 程序。

sudo service nginx start

加入 Certificate Transparency 规则

要使 CT 生效,还需要修改对应的 server.conf 里的参数。

server{
...
ssl_ct on;
ssl_ct_static_scts /etc/nginx/ssl/scts;
...
}

修改完成之后,重载 Nginx 配置。

sudo nginx -s reload

如果不出意外的话,刷新网站,现在网站就会提示已经提供有效 Certificate Transparency。