不得不说服务器配置的环节是最让人头痛的,最开始的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 即可。

完成,赶紧打开你的网站看看有没有小锁吧。

    添加新评论 | #

    Markdown Supported
    简单数学题:NaN + NaN =
    表情

    Comments | ?? 条评论

    • 单身为狗 21 年

    • 朝循以始 夜继以终

    • Blog: Von by Bersder

    • Alive: 0 天 0 小时 0 分

    Support:

    frame ssr server DNS music player

    © 2019-2021 ᛟᛊᚺᛁᚾᛟ

    back2top