Featured image of post SSL证书申请,Nginx配置一条龙服务

SSL证书申请,Nginx配置一条龙服务

Nginx 安装和配置

信息

本次以 Debian 为例:如果不是Debian,请参考:官方教程安装,如果已经安装Nginx,可跳过

前提条件:

1
sudo apt install curl gnupg2 ca-certificates lsb-release debian-archive-keyring

导入密钥,验证包的正确性:

1
2
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

验证下载的文件是否包含正确的密钥:

1
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

输出应包含完整指纹573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62如下:

pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14] 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62 uid nginx signing key signing-key@nginx.com

如果指纹不同,删除文件。

二选一:

  • 要为稳定的 nginx 包设置 apt 存储库,请运行以下命令:
1
2
3
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list
  • 如果希望使用 mainline nginx 包,请改为运行以下命令:
1
2
3
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list

设置存储库固定,使用Nginx官方的软件包而不是发行版提供的软件包:

1
2
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
    | sudo tee /etc/apt/preferences.d/99nginx

要安装 nginx,请运行以下命令:

1
2
sudo apt update
sudo apt install nginx

Certbot安装

(1)安装snap

certbot官方已经说了,各个发行版安装的certbot版本落后,功能不全,推荐我们使用snap安装,我之前就是用的是apt安装,后来一堆问题,血的教训!!

1
2
3
4
5
6
7
8
# 安装snap
sudo apt update
sudo apt install snapd

# 重启系统
# 安装core
sudo snap install core
sudo snap refresh core

(2)安装certbot

安装之前确保没有其他方式安装的certbot 如:apt,pip

可通过这条命令查看 whereis certbot 如果有,卸载它们 sudo apt remove certbot sudo pip uninstall certbot

1
2
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

(3)查看版本

1
sudo certbot --version

Certbot 插件

nginx

使用snap安装的版本是已经有的,申请方法为:

(1)先新建一个 nginx的配置文件,如 /etc/nginx/conf.d/abc.conf

(2)编辑 abc.conf,填入以下模板,根据自己实际情况修改

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
server {
    listen 80;
    server_name domain.com;

    location / {
        proxy_pass http://127.0.0.1:80;  # 替换为你的应用程序地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

(3)使用 certbot 的nginx插件申请

1
2
# 可以先查看哪些可以申请,是否列出了需要的域名
sudo certbot --nginx

额外的,申请前保证域名解析到当前的ip

certbot-dns-dnspod

此插件用于dns申请的,好处可以用于申请泛域名证书证书。也就是像 *.seektao.cc这种,一次申请,到处使用,方便至极。

certbot-dns-dnspod 是dnspod的插件,默认的certbot是没有的,需要手动安装

1
2
3
sudo snap install certbot-dns-dnspod
sudo snap set certbot trust-plugin-with-root=ok
sudo snap connect certbot:plugin certbot-dns-dnspod

安装完成之后新建一个 .ini文件,比如 /etc/certbot/dnspod.ini

1
2
sudo mkdir /etc/certbot
sudo touch /etc/certbot/dnspod.ini

编辑 dnspod.ini,填入下面的内容,点此跳转到dnspod api 申请页面,注意申请的是dnspod token

1
2
dns_dnspod_api_id = xxxxxxx
dns_dnspod_api_token = xxxxxxxxxxxxxbcdef
1
sudo chmod 600 /etc/certbot/dnspod.ini

申请,替换为自己的域名

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sudo certbot certonly -a dns-dnspod \
    --dns-dnspod-credentials /etc/certbot/dnspod.ini \
    -d "*.yourdomain.com"


接着就是:
输入邮箱,
是否同意注册acme(选Y),
是否同意发送邮件。。。

接着等待,等待。。就完成了

证书文件保存在 /etc/letsencrypt/live

1
2
3
4
5
# 其中 
[cert name]/privkey.pem:证书的私钥。
[cert name]/fullchain.pem:在大多数服务器软件中使用的证书文件。
[cert name]/chain.pem:在Nginx >=1.3.7 中用于 OCSP stapling。
[cert name]/cert.pem:会破坏许多服务器配置,不应在未进一步阅读文档的情况下使用。

我们用到 privkey.pem,fullchain.pem即可。

关于 dnspod 申请ssl证书就是如此。

certbot-dns-cloudflare

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
sudo snap install certbot-dns-cloudflare

# 如果提示如下错误信息,输入:sudo snap set certbot trust-plugin-with-root=ok
# 接着重新执行 sudo snap install certbot-dns-cloudflare

error: cannot perform the following tasks:
- Run hook prepare-plug-plugin of snap "certbot" (run hook "prepare-plug-plugin": 
-----
Only connect this interface if you trust the plugin author to have root on the system.
Run `snap set certbot trust-plugin-with-root=ok` to acknowledge this and then run this command again to perform the connection.
If that doesn't work, you may need to remove all certbot-dns-* plugins from the system, then try installing the certbot snap again.
-----)

申请api token,点此跳转

/etc/certbot 新建 cloudflare.ini,将下面的值替换为自己申请的api token

1
2
# Cloudflare API token used by Certbot
dns_cloudflare_api_token = xxxxxxxxxxxxxxxxx

建议修改权限

1
sudo chmod 600 cloudflare.ini

申请方式:将以下的文件和域名替换为自己的

1
2
3
4
sudo certbot certonly \
  --dns-cloudflare \
  --dns-cloudflare-credentials /etc/certbot/cloudflare.ini \
  -d "*.youdomain.com"

certbot-dns-huawei(待编辑)

此插件用于dns申请的,好处可以用于申请泛域名证书证书。也就是像 *.seektao.cc这种,一次申请,到处使用,方便至极。

certbot-dns-dnspod 是dnspod的插件,默认的certbot是没有的,需要手动安装

1
2
3
sudo snap install certbot-dns-dnspod
sudo snap set certbot trust-plugin-with-root=ok
sudo snap connect certbot:plugin certbot-dns-dnspod

安装完成之后新建一个 .ini文件,比如 /etc/certbot/dnspod.ini

1
2
sudo mkdir /etc/certbot
sudo touch /etc/certbot/dnspod.ini

编辑 dnspod.ini,填入下面的内容,点此跳转到dnspod api 申请页面,注意申请的是dnspod token

1
2
dns_dnspod_api_id = xxxxxxx
dns_dnspod_api_token = xxxxxxxxxxxxxbcdef
1
sudo chmod 600 /etc/certbot/dnspod.ini

申请,替换为自己的域名

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
sudo certbot certonly -a dns-dnspod \
    --dns-dnspod-credentials /etc/certbot/dnspod.ini \
    -d "*.yourdomain.com"


接着就是:
输入邮箱,
是否同意注册acme(选Y),
是否同意发送邮件。。。

接着等待,等待。。就完成了

证书文件保存在 /etc/letsencrypt/live

1
2
3
4
5
# 其中 
[cert name]/privkey.pem:证书的私钥。
[cert name]/fullchain.pem:在大多数服务器软件中使用的证书文件。
[cert name]/chain.pem:在Nginx >=1.3.7 中用于 OCSP stapling。
[cert name]/cert.pem:会破坏许多服务器配置,不应在未进一步阅读文档的情况下使用。

我们用到 privkey.pem,fullchain.pem即可。

关于 dnspod 申请ssl证书就是如此。

自动续期

自动续期添加一个定时任务即可

1
2
3
4
5
# 设置定时任务
sudo crontab -e

# 每月1号的午夜执行 certbot renew 命令来续订证书
0 0 1 * * /usr/local/bin/certbot renew

需要注意自己的certbot执行路径是否正确 which certbot 可以看到certbot执行路径

一键脚本

经过上面的步骤,你会发现每新增一个服务,需要

  1. 新增nginx配置文件
  2. 配置nginx文件
  3. 验证并重启nginx服务

这时候发现服务器每新增一个服务,就需要添加、修改nginx配置文件,域名和端口这些都需要修改,申请ssl证书,这些步骤相当麻烦。

如果没有一个简单的nginx模板,则会更加复杂繁琐。基于以上需求,我编写了一个脚本。功能:配置好服务后,只需要一条命令即可完成nginx配置,并配置ssl证书

命令为:

1
脚本名称 域名 端口号

如果需要获取原文和脚本,关注公众号"寻道之旅",发送"nginx"获取

最后更新于 Oct 03, 2024 22:12 +0800
使用 Hugo 构建
主题 StackJimmy 设计