跳至主要內容

Let's Encrypt泛域名使用和Nginx配置拆分

IT王小二约 2505 字

Let's Encrypt泛域名使用和Nginx配置拆分

作者:IT王小二

博客:https://itwxe.comopen in new window

上一期写了使用Let's Encrypt实现网站https化,随着二级域名的增多,每个二级域名需要一张 SSL 证书,这可太不优雅了,泛域名表示我可以更优雅。

本来 Let's Encrypt 泛域名使用、Nginx 配置拆分是准备分成两篇文章来写的,可是两篇文章又感觉篇幅过短和冗余。

所以最后决定写在一篇里面吧,同时把整个流程写明白,之前有人问有了证书怎么搭配 Nginx 来配置,这篇从域名映射到Nginx配置完成的保姆级教程,小二求个点赞不过分吧。

一、SSL证书获取

写在最前面,使用过程中如有问题参考 acme官方文档open in new window ,文档有中文说明,如果有报错可以查看 Issuse,当然也可以留言你碰到的问题。

如果你已经有证书了,直接访问第二步 域名映射配置 开始阅读即可

由于 Let's Encrypy 申请的 SSL 证书只有三个月的有效期,泛域名申请只能DNS验证,可以使用使用 acme.shopen in new window 脚本来获取且自动续期,前提是你的 DNS 服务商支持 DNS 调用,支持的服务商在 https://github.com/acmesh-official/acme.sh/wiki/dnsapiopen in new window 中自行查看。

虽然 DNSPod.cn 支持 DNS 接口调用,不过个人结合了百度云加速 CDN 的严格加密模式,不用 CDN 来加速,那加载个图片估计都能卡成 PPT,就我服务器那小水管带宽,而百度云加速 CDN 没有可以能够自动上传证书的接口,故我没有使用自动 DNS 验证,使用了手动 DNS 验证。

手动的话每三个月就要手动更新一次证书,当然如果你没有配合其他 CDN 使用的话,可以使用 DNS 自动验证模式,每个服务商的使用方式也很简单,官方文档写的很明白了。

当然你不知道什么是自动 DNS 或者手动 DNS 也没关系,看文档或者按照我的操作一步一步来都是可以成功滴。

1. 什么是泛域名

比如用户的域名是abc.com,那么我们将主机名设置为"",IP解析到比如:218.104.78.100,大家都知道通配符open in new window,他表明abc.com之前的所有子域名都将解析到218.104.78.100,这就意味着例如输入bbs.abc.com或者123.abc.com或者123.234.abc.com都将解析到218.104.78.100,这里需要说明的是,在我们系统里面如果单独设置一个子域名解析open in new window,比如将主机名设置为mail,单独解析到218.104.78.79,那么该解析记录优先。 -- 摘自百度百科

而泛域名证书就是一张证书可以用来验证所有同级子域名的证书,例如 *.itwxe.com 的证书,那么 www.itwxe.comimages.itwxe.comwaline.itwxe.com 都是可以使用 *.itwxe.com 来验证的,当然 主域名itwxe.com 和三级域名 www.aa.itwxe.com 就不适用了。

不过大部分人二级域名就已经够用了,这样就避免了一个二级域名申请一张 SSL 证书,真是个优雅的方案啊。

2. 下载脚本并安装

下载脚本并安装,将邮箱设置成自己的。

wget -O -  https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh | sh -s -- --install-online -m  itwxe@qq.com

刷新用户变量,任意目录可以使用 acme.sh。

source /root/.bashrc

刷新配置后,输入命令 acme.sh -v 查看 acme.sh 的版本,要是正常打印版本就代表安装成功。

acme版本查看

这里除了安装了脚本,同时还自动配置了个定时任务,这个定时任务每天会检查你的证书是否需要自动续期,可以使用 crontab -l 查看,因为使用的是手动 DNS 模式,这个定时任务意义不大,所以可以直接删除掉,当然不删除也没问题。

3. 手动申请泛域名证书

附上一段官方文档原话截图,免得有些小伙伴没法访问 GitHub 说我给的文档地址是假的,毕竟 GitHub 时不时抽风,这么贴心的小二不值得你的一个点赞吗,嘿嘿。

官方文档原话

下面开始自己的操作,为了一张 SSL 证书能够同时使用主域名 itwxe.com 和 二级域名 *.itwxe.com,所以,申请证书时命令如下,其中域名换成自己的。

acme.sh --issue --dns -d itwxe.com -d *.itwxe.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

因为我的泛域名还有两个多月过期,所以我这里演示增加参数 --force 强制更新,没有申请过证书则不需要 --force 参数,过程如图:

手动生成DNS

登录域名控制台,我的是腾讯云,手动添加 DNS 验证域名所有权,内容是上图中的两个圈中的内容。需要注意的是,内容主机域名填写 _acme-challenge,记录类型选择 TXT, 记录值填写上面命令生成的内容。

添加DNS记录1

添加DNS记录2

添加后的结果如图。

DNS添加结果

添加后过个30秒时间,执行如下命令如下,其中域名替换为自己的域名,特别注意的是 --renew 而不是 --issue --dns

acme.sh  --renew -d itwxe.com -d *.itwxe.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

生成证书

生成证书位置

看到如上图的日志,就代表 SSL 证书生成成功了,可以看到 SSL 证书放在 /root/.acme.sh/itwxe.com/ 目录下,查看一下生成的证书,主要用到的是下图这两个证书。

证书目录

二、域名映射

同样在域名服务商后台配置映射,我这里还是腾讯云啦。配置泛域名映射到自己的主机 IP,假如我的 IP 是 192.168.5.11,可能有人要吐槽了,你这明显是个内网 IP,配置成这样能访问我..我...倒立喝可乐。

我说的是假如哈,不要较真,小伙伴们自己操作记得换成自己的公网 IP。

后台配置域名映射

配置好了之后腾讯云免费解析大概要十分钟生效,趁这个时间刚好可以去配置一下 Nginx,美滋滋。

看解析是否生效的办法就是打开终端 ping 一下自己的二级域名,如果响应的是你的IP,那么就OK啦。

ping域名

三、Nginx配置拆分

这里我使用的是 Nginx 作为反向代理,又不知道怎么安装 Nginx 的小伙伴可以在本站open in new window搜索相关教程。

1. 复制证书文件

创建 /usr/local/nginx/ssl/any 目录并复制证书到创建的目录下,下面的命令就不用小二解释了吧,相信小伙伴们都明白,Linux常用的命令,注意把路径改成自己的就可以啦。

mkdir -p /usr/local/nginx/ssl/any

cp /root/.acme.sh/itwxe.com/{fullchain.cer,itwxe.com.key} /usr/local/nginx/ssl/any/

2. 配置Nginx

既然使用了泛域名,一般来说子域名就比较多了,目前我都已经 5 个子域名,后面还会不断增加,所以需要对 Nginx 配置文件进行一个拆分,拆分也很简单,以配置 www.itwxe.com 为例开始操作。

默认 Nginx 是用 /usr/local/nginx/conf/nginx.conf 文件启动的,那么为了拆分配置,在 /usr/local/nginx/conf 目录下新建一个 conf.d 文件夹,然后里面放我们拆分的配置。

进入 conf 目录后使用 mkdir conf.d 创建文件夹后,进入创建的文件夹,我的目录及文件如下。

conf.d文件

vi common.conf 写入如下SSL通用配置后保存退出,ssl_certificate 和 ssl_certificate_key 分别是证书的路径。

        ssl_certificate /usr/local/nginx/ssl/any/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/ssl/any/itwxe.com.key;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 30m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!MD5:!EXPORT56:!EXP;
        ssl_prefer_server_ciphers on;

vi www.itwxe.conf 中配置如下,使用 include 关键字来引用 SSL 通用配置。

    # itwxe.com 强制跳转 www.itwxe.com,按个人需求更改
    server {
        listen 443 ssl;
        server_name itwxe.com;
        include /usr/local/nginx/conf/conf.d/common.conf;
        return 301 https://www.itwxe.com$request_uri;
    }

    server {
        listen 443 ssl;
        server_name www.itwxe.com;
        # 引用通用域名配置common.conf
        include /usr/local/nginx/conf/conf.d/common.conf;

        location / {
            root /itwxe/blogSite/public;
            index index.html;
        }

        # 网站图标
        location = /favicon.ico {
            alias /itwxe/dockerData/lskypro/public/images/site-info/favicon.png;
            log_not_found off;
            access_log off;
        }

        # 404页面
        error_page 404 /404.html;
        location = /404.html {
            root html/404-26;
        }
    }

www为示例,其他的同级子域名也类似配置。拆分出来的配置还要在主配置文件 /usr/local/nginx/conf/nginx.conf 中引用。

同时为了防止别人恶意解析到我们的泛域名,我们需要配置 Nginx 中未配置的二级域名默认返回 404 或者 444 ,这样配置也对 SEO 比较友好,当时我没配置导致百度收录了好几个没用的域名链接。

下面是我的配置,其中最重要的部分如图:

image-20210819133147008

下面是方便大家复制修改成自己的配置文本。

    server{
       listen 80 default_server;
       server_name _;
       access_log off;
       return 404;
    }

    server{
        listen 443  default_server;
        server_name _;
        ssl_certificate /usr/local/nginx/ssl/any/fullchain.cer;
        ssl_certificate_key /usr/local/nginx/ssl/any/itwxe.com.key;
        access_log off;
        return 404;
    }

    server {
        listen       80;
        server_name *.itwxe.com;
        # 将http请求转变为https
        return 301 https://$host$request_uri;
        #rewrite ^(.*) https://$host$1 permanent;
        #location / {
        #    root /itwxe/blogSite/public;
        #    index index.html;
        #}
        charset utf-8;
    }

    include /usr/local/nginx/conf/conf.d/*.itwxe.conf;

配置完成后,校验 Nginx 配置 和重新加载 Nginx 配置。

./nginx -t

./nginx -s reload

重新加载Nginx配置

至此,就完成了泛域名的使用和 Nginx 配置拆分,这时候可以看下网站是否可以正常访问,可以看到证书正常部署生效了。

证书生效

当然如果使用了 CDN 还在 CDN 控制台上传证书,我的就是百度云加速了,下篇来说说 CDN 是啥,国内和国外有哪些免费的 CDN 可以使用,感兴趣的小伙伴可以来个关注啦。