http 是明文传输,存在泄露个人隐私的风险,小站点一般对此没有多少关注,不过,新版 chrome 在登陆 http 站点的时候会提示说,“http 协议的网站将被标记为不安全”,由此可见,民众的网络安全意识正在加强,所以,安装 ssl 证书以支持 https 访问还是很有必要的。
安装 SSL 证书很麻烦,而且收费,不过对于个人站点来说还有更多的选择,比如 Let's Encrypt
就是一个不错的方案,不仅免费,而且安装简单,几分钟就能搞定,缺点当然也有,就是要定时更新证书,因为证书有效期只有三个月。
安装
软件仓库一般都有,所以直接安装即可
CentOS
1yum install letsencrypt
Ubuntu 或者 Debian
1apt-get install letsencrypt
使用
获取证书
Let's Encrypt
在验证的过程中会占用 443 端口,所以需要暂时关闭 nginx 以释放端口。
1systemctl stop nginx
获取证书
1letsencrypt certonly --standalone \
2--email 邮箱 \
3-d wenjinyu.me \
4-d www.wenjinyu.me
只要几秒钟的验证就可以了,然后会提示证书存放在域名相应目录,比如 /etc/letsencrypt/wenjinyu.me
:
需要注意的是,证书存放目录以第一个输入的域名为准,例如,如果此次输入的是 www.wenjinyu.me wenjinyu.me ...
,那么存放目录就会变成 /etc/letsencrypt/www.wenjinyu.me
。
使用证书
nginx 的配置文件有两个,一个是 /etc/nginx/nginx.conf
,另一个是 /etc/nginx/conf.d/default.conf
(或者是该文件夹下以. conf 为后缀其他文件),只要往里面添加一个 433 端口的 server 即可:
1vim /etc/nginx/conf.d/default.conf
添加 443 端口以及 ssl 证书路径
1server {
2 listen 443 ssl;
3 server_name blog.wenjinyu.me;
4 ssl_certificate /etc/letsencrypt/live/wenjinyu.me/cert.pem;
5 ssl_certificate_key /etc/letsencrypt/live/wenjinyu.me/privkey.pem;
6
7 location / {
8 root /var/www/wordpress; # 改成自己的网页存放路径
9 index index.php index.html index.htm;
10 try_files $uri $uri/ /index.php$is_args$args;
11 }
12
13 error_page 500 502 503 504 /50x.html;
14 location = /50x.html {root /var/www/wordpress; # 改成自己的网页存放路径}
15 location ~ \.php$ {
16 root /var/www/wordpress; # 改成自己的网页存放路径
17 fastcgi_split_path_info ^(.+\.php)(/.+)$;
18 fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
19 fastcgi_index index.php;
20 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
21 include fastcgi_params;
22 }
23}
添加防火墙规则,放行 443 端口
1iptables -A INPUT -p tcp --dport 443 -j ACCEPT
重启 nginx
1systemctl restart nginx
- 注意:在往配置文件里添加 443 端口的配置中,如果是按照本站之前的帖子搭建的博客,则可以只修改 ssl 证书所在路径
1server {
2 listen 443 ssl;
3 server_name blog.wenjinyu.me;
4 ssl_certificate /etc/letsencrypt/live/wenjinyu.me/cert.pem;
5 ssl_certificate_key /etc/letsencrypt/live/wenjinyu.me/privkey.pem;
6}
此时可以在浏览器中输入 https:// 域名
,进行访问,如本站是 https://www.wenjinyu.me
更多配置
http 跳转
如果希望只受理 https 请求,那么可以在 http 设置跳转,即把 80 端口的请求跳转至 443
编辑配置文件
1vim /etc/nginx/conf.d/default.conf
在 80 的 server 里添加跳转,注意替换网址
1server {
2 listen 80;
3 server_name blog.wenjinyu.me;
4 rewrite ^/(.*)$ https://blog.wenjinyu.me/$1 permanent;
5}
证书更新
Let’s Encrypt 的 ssl 证书有效期只有三个月,所以必须在三个月内进行证书更新,不过在证书过期之前会有官方发邮件进行通知,所以不必担心忘记
1letsencrypt certonly --standalone
- 注意:如果网站使用了 CDN 的话,在更新证书的时候需要把 CDN 暂停,否则网站验证会不通过。
自动更新证书
linux 有自带的定时任务管理器 cron
,也可以用来设置定时更新证书,这样就不用一直惦记着了。网上有不少自动更新教程,一般都是在更新前关闭 nginx,更完后再打开,之前试过,每次 nginx 在证书更新完后都拉不起来,造成更新完证书后网站直接挂掉。
找了一圈发现自动更新证书基本只有两个选择,一个是用 webroot 模式
,不过这个模式配置繁琐,而且还有这样的问题:
Let’s Encrypt 提供了多种身份验证方式。与 standalone 相比,webroot 模式最大的优势在于没有宕机时间。然而 webroot 存在一些隐含的问题,它们是新手不易解决的。例如,webroot 需要在 nginx.conf 中添加特殊的规则以允许外界访问,但即便如此,该路径依旧被部分防火墙封杀。此外,启用了 301 跳转的服务器无法直接使用 webroot 更新证书,这期间需要反复修改配置文件,比 standalone 模式更为繁琐。十几秒的宕机时间对一般的网站来说可以忽略不计,因此我建议新手优先使用 standalone 模式。
而使用插件就简单多了,可以无需停止 nginx 而更新证书:
先安装插件
CentOS / Fedora
1yum install python2-certbot-nginx
Debian / Ubuntu
1apt-get install python3-certbot-nginx
然后使用插件进行更新
1certbot --nginx renew
如果写进 cron
,那么就能实现自动更新了:
CentOS / Fedora
1echo "0 5 * * 6 /usr/bin/certbot -q --nginx renew" >> /var/spool/cron/root
Debian / Ubuntu
1echo "0 5 * * 6 /usr/bin/certbot -q --nginx renew" >> /var/spool/cron/crontabs/root
这是在每个周六早上 5 点钟更新证书,这个时间网站访问量较少,证书有效期为 3 个月,所以一周更新一次也够了。
删除证书
如果子域名不用了,或者更换主机,则需要删除证书,确保下次不再继续更新已经没在使用的证书:
1certbot delete
再输入对应的数字即可删除证书,同时删除多个证书的,用空格分隔多个数字。
如果需要删除特定的证书,则可用下面的命令:
1certbot delete --cert-name example.com
证书迁移
如果迁移到了新服务器,那么直接将 /etc/letsencrypt/
整个文件夹搬过去即可,所有证书均可直接使用和更新
问题解决
帐号错误
更新证书时显示以下错误:
Attempting to renew cert (www.wenjinyu.me) from /etc/letsencrypt/renewal/www.wenjinyu.me.conf produced an unexpected error: Account at /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory/8b75bee34b2aa2eb53f302f4c7322ed7 does not exist. Skipping.
这个问题一般在将证书文件迁移到新服务器时出现,出现原因是安装 letsencrypt 后添加了一个新账户 (Let’s Encrypt 添加证书前需要先添加一个账户),添加方式就是在/etc/letsencrypt/accounts/acme-v02.api.letsencrypt.org/directory/
文件夹下添加一个以账户ID命名的文件夹,同时在该文件夹里面放入密钥和配置文件。
解决办法也很简单,进入 letsencrypt 的域名配置文件夹中,将所有配置文件中的帐号 ID 改为新的即可:
1sed -ri 's/(account = ).*/\1cba1e263f0e3a4045f4fa383a70334a1/' /etc/letsencrypt/renewal/*