今天头条上看到自己网站可以免费获取证书,于是尝试了下,最终一步到位全部成功。

系统为:centos7 + nginx

第一步,获取证书 ps: 免费的哦,而且不像自签名的那种证书浏览器会不认
很简单,先安装certbot命令:

yum install certbot

然后使用此命令生成证书:

certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com

这边说明下, /var/www/example 是你现在网站可以访问的根目录,在生成时它会创建一个 .well-known 文件夹去验证你是否有这个网站的权限,然后 -d 后面是证书匹配的域名,可以多个,example.com 请换成你的域名。
然后是一个引导窗口你就填个email然后确认基本上等待验证就能成功了(千万别在screen里运行,否则像我一开始一样全部是蓝屏看不到字)

生成证书后,证书在 /etc/letsencrypt/live/example.com/ 目录

server {
    listen      443 ssl http2;
    ssl         on;
    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_dhparam         /etc/nginx/ssl/dhparam.pem;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4';
}

以上是nginx的https相关的基本配置(其它参数不写了,自行加上,以上参数说明请见参阅内容第3个,ssl_protocols 主要用的安全协议,ssl_ciphers 是禁用的不安全的协议,这里不赘述了)

这里需要自己生成个 dhparam.pem 文件,执行如下命令即可:

mkdir /etc/nginx/ssl/
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048

这是加强 HTTPS 安全性的,如果嫌麻烦,把 ssl_dhparam 参数删掉就可以了。

参阅:

  1. https://certbot.eff.org/
  2. https://ksmx.me/letsencrypt-ssl-https/
  3. https://aotu.io/notes/2016/08/16/nginx-https/

https 只要有证书启动起来是没什么问题的,如果对这些流程不是很熟悉可能需要找不少文章才能搞明白。
http2 则是需要 nginx 1.9.5+ 和 openssl 1.0.2+ 才支持,我一开始用的是系统自带的 nginx,版本才1.6,后来升级了 openssl 到最新版在自己装了个nginx repo 安装是新版本了,可是死活还是启动不了 http2,然后我这样猥琐的解决了:

nginx -V

先得到所有的 configure arguments: 参数。然后下载 openssl 和 nginx 对应版本的源码包,然后增加一个参数“–with-openssl=/root/openssl-1.0.2j” 这个路径就是对应 openssl 源码的目录,然后在nginx里重新编译安装,然后就可以了

注意,letsencrypt 的证书的有效期是3个月,届时务必要更新下,否则会导致网站出现安全提醒,更新证书非常简单,只要相同的命令重新运行下就可以,然后重启下 nginx