不得不说服务器配置的环节是最让人头痛的,最开始的lnpm环境耗了我整整两天,而这次的证书配置又耗了我一天,一部分原因还是之前的nginx没编译好。所以说环境配置这种东西真是一环扣一环的,如果真要独自捣弄,那真是勇。作为我勇过的记录,在此写下nginx证书配置的正确操作
确保Nginx开启ssl模块
如果你很确定已经开启,可以跳过该步骤
进入nginx执行文件目录执行 ./nginx -V
查看nginx的编译配置,检查是否带有--with-http_ssl_module
,如果有就可以跳过该步骤,如果没有则需要重新编译nginx,步骤如下
- 进入nginx的源码目录(没有的重新下载对应版本),重新配置
./configure 原来的配置 --with-http_ssl_module
- 没问题后 make(不要make install,否则会覆盖你的nginx),成功后 objs 目录下会有新的nginx执行文件
- 停止现在的 nginx
./nginx -s stop
,想留条后路的可备份一下当前的nginx执行文件 - 用 objs 目录下的nginx执行文件覆盖当前的,并重新启动
证书申请
申请之前需要做好域名的购买、解析和基本Nginx配置,域名购买和解析各家有各家的教程就不介绍了,Nginx一定要给域名分配一个目录。
server {
listen 80;
# 你的域名
server_name mydomain.com;
location / {
# 给域名分配的网站目录
root html;
index index.html;
}
#...
}
简单来说 acme.sh 实现了 acme 协议, 可以从 let's encrypt 生成免费的证书。足够简单,依赖少,纯shell,自动管理,可谓是手残党之友。
安装一条命令即可:
curl https://get.acme.sh | sh
普通用户和root都可以。完成后在用户根目录生成 .acme.sh 隐藏目录 ~/.acme.sh/
,执行文件为其下的 acme.sh
。
同时安装过程还会执行以下操作方便用户做懒人真好
- 在 .bashrc 中为acme.sh起别名
alias acme.sh=~/.acme.sh/acme.sh
(需要重启生效) - 自动创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书
acme.sh
实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证。先介绍第一种验证方式,最简单的一个,一条命令的事。缺点是不支持泛域名证书的申请
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
只需要指定域名,并指定域名所在的网站根目录。acme.sh 会全自动的生成验证文件,并放到网站的根目录,然后自动完成验证, 最后会删除验证文件,整个过程没有任何污染,完成后将会显示证书和密钥的位置。
第二种方式需要需要DNS服务商的配合,支持泛域名证书的申请,有子域名需求的话强推该方式。这里以Cloudflare为例(更多DNS支持),进入站点之后点击右下角的 “获取您的 API 令牌” 再选择 “API 令牌”,查看“Global API Key”并记住。执行下面代码
export CF_Key="上面的key"
export CF_Email="Cloudflare注册邮箱"
acme.sh --issue --dns dns_cf -d *.mydomain.com -d mydomain.com
同样的最后成功后会显示证书和密钥的位置。
证书安装
acme.sh 默认生成的证书和密钥在安装目录 ~/.acme.sh/
下,请不要直接使用该目录下的文件,如直接在 nginx 的配置文件中直接引用他们。
使用 --installcert
命令把指定域名的证书和密钥拷贝到指定位置再使用副本
acme.sh --installcert -d <domain>.com \
--key-file /usr/local/nginx/ssl/<domain>.key \
--fullchain-file /usr/local/nginx/ssl/fullchain.cer \
--reloadcmd "service nginx force-reload"
其中最后一行是用于 nginx 重新加载证书,如果没有给 nginx 设置 service,手动重启 nginx 也可以。
拷贝完后就是配置 nginx 了(请检查有没有开放443端口)
#强制https
server {
listen 80;
server_name <domain>; #你的域名
rewrite ^(.*)$ https://$host$1 permanent;
}
server {
listen 443 ssl;
server_name <domain>; #你的域名
ssl_certificate /usr/local/nginx/ssl/fullchain.cer; #证书副本位置
ssl_certificate_key /usr/local/nginx/ssl/<domain>.key; #密钥副本位置
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 1d;
ssl_session_cache builtin:1000 shared:SSL:10m;
# 其他的location配置、php配置...
}
使用 ./nginx -t
检查配置正确性。如没问题重启 nginx 即可。
完成,赶紧打开你的网站看看有没有小锁吧。
Comments | ?? 条评论