资讯专栏INFORMATION COLUMN

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

lidashuang / 2553人阅读

摘要:确保预先安装了官方的包申请证书官方的在系统上有各种依赖问题,各种尝试后放弃了。网上搜索资料后,使用了小巧的。

我大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
未完待续

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/40560.html

相关文章

  • 通过 Certbot 安装 Let&#039;s Encrypt 证书,来实现全站 HTTPS 访

    摘要:甚至和百度的搜索结果也正在给予的网站更高的排名和优先收录权。由于预设的解码器是,所以就不能识别中文。那理解了这个错误原因后,我这边首先想到的就是网站的配置文件中是否含有中文。打开一看,确实存在中文注释。 相关知识 HTTP/HTTPS 是什么? 简单来说,HTTP 是一个传输网页内容的协议,比如我们浏览一个网页,网页上的文字、图片、 CSS 、 JS 等文件都是通过 HTTP 协议传输...

    Lsnsh 评论0 收藏0
  • 在Amazon Linux 上使 Let&#039;s encrypt 免费SSL

    摘要:在上使用免费的如果你使用来做负载均衡,在上可以很方便的使用。提供期限为三个月的免费证书,到期之后需要,官方还提供自动的工具是一个自动申请和续期证书的工具。在官网可以找到各种和服务器下的安装方法。常见的和安装起来十分方便。 在Amazon Linux 上 使用 Lets encrypt 免费的SSL 如果你使用ELB来做负载均衡,在AWS上可以很方便的使用SSL。如果不使用ELB就需要自...

    coolpail 评论0 收藏0
  • 使 Let&#039;s Encrypt 证书部署 HTTPS

    摘要:为了推广协议,电子前哨基金会成立了,提供免费证书。部署,包含申请域名部署应用,并开启服务。安装使用获取证书对于,使用的插件获取。 为了推广HTTPS协议,电子前哨基金会EFF成立了 Lets Encrypt,提供免费证书。 Lets Encrypt一个于2015年三季度推出的数字证书认证机构,将通过旨在消除当前手动创建和安装证书的复杂过程的自动化流程,为安全网站提供免费的SSL/TLS...

    he_xd 评论0 收藏0

发表评论

0条评论

lidashuang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<