用 Nginx 基于 Let's Engypt 免费证书打造快速安全的 HTTPS 网站

我大EOI的官网正式上线啦!为了打造公司第一个正式上线的公开站点,我们着实费了不少心思,其中之一就是如何把它搞得快速安全。我们用 Nuxt 做了 SSR,而且启用了 PWA module,Lighthouse 得分在 90 分以上。官网在保证 IE9 兼容性的基础上,还使用了诸如 InteractionObserver 等新特性努力提升速度。

另外一点就是安全性了。虽说是一个介绍性的网站,HTTPS 还是要上的。我想到了近来一直很火的 Let's Engypt 免费证书,既给公司省钱,又省去了申请证书的麻烦。

这次就是用全球最快的 Web 服务器 Nginx + 免费好用的 Let's Engypt 证书打造我们公司官网的一些记录,或者说是心得分享。

编译 Nginx

公司使用的是阿里云服务器,CentOS 系统。CentOS 7 自带 OpenSSL 1.0.1e,不支持 ALPN,在新版的 Chrome 浏览器上不能启用 HTTP 2。

我选择自己编译 Nginx,这样还可以把 br 压缩模块 和 证书透明模块 也编译进去。当然如果你不需要后两个模块,可以直接用外国网友编译好的 rpm 包:https://brouken.com/repo

下载 OpenSSL 源码

首先下载 OpenSSL,解包

$ wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz
$ tar -zxvf openssl-1.1.0f.tar.gz
$ cd openssl-1.1.0f

我还打了 Cloudflare 的 SSL 补丁

$ wget https://github.com/cloudflare/sslconfig/raw/master/patches/openssl__1.1.0_chacha20_poly1305.patch
$ patch -p1 < openssl__1.1.0_chacha20_poly1305.patch

下载第三方 Nginx 模块

下载 ngx_brotli 以支持 br 压缩方式

$ git clone https://github.com/google/ngx_brotli.git

下载 nginx-ct 以支持证书透明(Certificate Transparency)

$ git clone https://github.com/grahamedgecombe/nginx-ct.git

顺带把方便好用的 headers-more-nginx-module 也编译进去

$ git clone https://github.com/openresty/headers-more-nginx-module.git

下载并编译 Nginx

下载 Nginx 源代码

$ wget http://nginx.org/download/nginx-1.13.4.tar.gz
$ tar -zxvf nginx-1.13.4.tar.gz
$ cd nginx-1.13.4.tar.gz

打补丁

$ wget https://github.com/cloudflare/sslconfig/raw/master/patches/nginx_1.13.1_http2_hpack.patch
$ patch -p1 < nginx_1.13.1_http2_hpack.patch

编译 Nginx。我选择使用官方的编译参数加入特定模块后直接替换 Nginx 可执行文件的方式,以支持使用 systemctl 以服务的方式启动。OpenSSL 以静态链接的方式编译到 Nginx 内部,以免对系统其它程序造成干扰

$ ./configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx --group=nginx --with-file-aio --with-threads --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-stream --with-stream_ssl_module --with-stream_realip_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -Wl,-E' --with-openssl=`realpath ../openssl` --with-openssl-opt="enable-ec_nistp_64_gcc_128 enable-weak-ssl-ciphers" --add-module=`realpath ../ngx_brotli` --add-module=`realpath ../nginx-ct` --add-module=`realpath ../headers-more-nginx-module`
$ make

替换官方的 Nginx。确保预先安装了官方的 rpm 包

$ sudo mv /usr/sbin/nginx /usr/sbin/nginx.old
$ sudo cp objs/nginx /usr/sbin/nginx

申请证书

Let's Engypt 官方的 certbot 在 CentOS 系统上有各种依赖问题,各种尝试后放弃了。网上搜索资料后,使用了小巧的 acme.sh

acme.sh 使用纯 Shell 脚本写成,而且可以申请新式的 ECC 证书,非常方便使用。

首先下载 acme.sh 源码

$ git clone https://github.com/Neilpang/acme.sh.git
$ cd acme.sh

www.eoitek.com 使用了 RSA/ECC 双证书

$ ./acme.sh --issue -d www.eoitek.com -w /home/eoi/eoi-portal
$ ./acme.sh --issue -d www.eoitek.com -w /home/eoi/eoi-portal --keylength ec-256

未完待续

你可能感兴趣的:(ssl证书,http-2,nginx)