共计 3235 个字符,预计需要花费 9 分钟才能阅读完成。
就目前的形式来看,今后的网站肯定是要向 https 发展的,再加上谷歌也要把 http 网站设置为不安全,所以,为网站配置一个证书是很有必要的。
证书选择的话,作为我等小屁民,当然没那个闲钱去购买收费证书,反正网上免费的也有,而且都能支持,为啥还要花钱呢?
Let’s Encrypt 就是一款免费证书,而且被众多厂商支持,人人都能免费申请哦!
本次就选择申请 Let’s Encrypt 的免费证书为网站配置 https,不过直接申请的话比较麻烦,还要更改 DNS 啊各种,很啰嗦,还好网上有专门申请此证书的 shell 脚本,而且能够使用文件验证的方式进行申请,很方便快捷,这就是 acme.sh
登录 SSH,下载并安装 acme.sh 脚本
curl https://get.acme.sh | sh
安装完成后会出现以下提示
[Mon Dec 18 23:37:03 CST 2017] Installing from online archive. [Mon
Dec 18 23:37:03 CST 2017] Downloading
https://github.com/Neilpang/acme.sh/archive/master.tar.gz [Mon Dec 18
23:37:08 CST 2017] Extracting master.tar.gz [Mon Dec 18 23:37:08 CST
2017] It is recommended to install socat first. [Mon Dec 18 23:37:08
CST 2017] We use socat for standalone server if you use standalone
mode. [Mon Dec 18 23:37:08 CST 2017] If you don’t use standalone mode,
just ignore this warning. [Mon Dec 18 23:37:08 CST 2017] Installing to
/root/.acme.sh [Mon Dec 18 23:37:08 CST 2017] Installed to
/root/.acme.sh/acme.sh [Mon Dec 18 23:37:08 CST 2017] Installing alias
to ‘/root/.profile’ [Mon Dec 18 23:37:08 CST 2017] OK, Close and
reopen your terminal to start using acme.sh [Mon Dec 18 23:37:08 CST
2017] Installing alias to ‘/root/.cshrc’ [Mon Dec 18 23:37:08 CST
2017] Installing cron job [Mon Dec 18 23:37:09 CST 2017] OK [Mon Dec
18 23:37:09 CST 2017] Install success!
整个安装会将所需的脚本文件存放到 /root/.acme.sh 目录中,并配置环境变量,不过安装时发现环境变量不生效,所以就手动执行了一次,这样就可以在任意目录都能使用 acme.sh 脚本了
source /root/.cshrc
申请证书
acme.sh --issue -d www.usebsd.com -d usebsd.com --webroot /home/wwwroot/
这里注意,-d 参数是指定申请证书的域名,域名必须可以访问,且正确指向后面配置的网站目录,多个域名添加多个 -d 参数即可,–webroot 参数是指定网站存放根目录,这里一定要正确,否则将申请不到证书
当域名解析正确,网站路径指向也正确后,执行上面的命令,会在网站根目录中添加证书申请所需的验证文件,随后 Let’s Encrypt 会对文件进行访问,验证通过就会下发网站证书
证书申请成功后,会自动保存在 /root/.acme.sh/ 目录下,以域名为目录名进行存放,但现在还没有结束,还需要生成咱们能使用的证书
acme.sh --installcert -d www.usebsd.com -d usebsd.com --key-file /usr/local/etc/nginx/ssl/www.usebsd.com.key --fullchain-file /usr/local/etc/nginx/ssl/www.usebsd.com.cer --reloadcmd "service nginx restart"
其中 –key-file 参数和 –fullchain-file 参数一定要正确,因为会在指定位置生成证书文件,而且后期证书自动更新也是根据现在配置的命令完成的,后方的 –reloadcmd 则是证书生成后执行的重新载入 nginx 命令,不过 nginx 用 reload 的话不会重新读取证书,所以这里改为 restart
生成 dhparam,这是为了让 ssllab 检测能够达到 A +,是否生成这个自己决定
openssl dhparam -out /usr/local/etc/nginx/ssl/www.usebsd.com.pem 2048
打开网站 nginx 配置文件,将证书配置进去
server {
listen 80;
listen 443 ssl http2;
ssl_certificate /usr/local/etc/nginx/ssl/www.usebsd.com.cer;
ssl_certificate_key /usr/local/etc/nginx/ssl/www.usebsd.com.key;
ssl_dhparam /usr/local/etc/nginx/ssl/www.usebsd.com.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_buffer_size 1400;
add_header Strict-Transport-Security max-age=15768000;
ssl_stapling on;
ssl_stapling_verify on;
server_name www.usebsd.com usebsd.com;
access_log /home/wwwlogs/www.usebsd.com_nginx.log combined;
index index.html index.htm index.php;
root /home/wwwroot;
if ($ssl_protocol = "") {return 301 https://www.usebsd.com$request_uri;}
if ($host != www.usebsd.com) {return 301 https://www.usebsd.com$request_uri;}
include /usr/local/etc/nginx/rewrite/typecho.conf;
location ~ [^/]\.php(/|$) {fastcgi_split_path_info ^(.+?.php)(/.*)$;
fastcgi_pass unix:/var/run/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
expires 30d;
access_log off;
}
location ~ .*\.(js|css)?$ {
expires 7d;
access_log off;
}
location ~ /\.ht {deny all;}
}