2022-09-25建站0
请注意,本文编写于 245 天前,最后修改于 234 天前,其中某些信息可能已经过时。

目录

网站的域名
域名的 dns 解析
HTTPS 证书的申请和绑定
获取 Cloudflare API Token
Zone ID 和 Account ID
使用 acme.sh 自动获取证书
把前一步从 Cloudflare 获取的 3 个重要字段写入服务器的环境变量当中
使用 HTTPS 证书
安装 nginx
让证书自动续签并且自动刷新
使用 acme.sh 安装证书到指定位置
出现端口冲突?

看完本文会得到什么

  1. 使用 Cloudflare 注册一个域名并且配置 Cloudflare 域名解析
  2. acme.sh 的安装和使用
  3. nginx 绑定免费的 HTTPS 证书

网站的域名

国外的首推 Cloudflare,国内腾讯,阿里云都可以,这个东西价格差别不大,不过国内的域名想要绑定到你国内买的服务器上是需要域名备案的,这个很有可能会阻挡很多初学者的热情,所以个人建议还是在 Cloudflare 上购买,因为之后的 dns 域名解析也会用到 Cloudflare 的服务。

image.png

域名的 dns 解析

注意看左边的导航,你要选择你自己注册的域名,然后进入左边的 DNS 子菜单。

image.png

本文之后需要引用到你注册的这个域名,假设

  • 你的域名是 xyz.com
  • 你的服务器 IP 是 1.2.3.4

那么你需要跟示例图中一样,新建一个 Type = A 的记录,Name 填写 @ ,Content 填写 1.2.3.4
另外记住把 Proxy 关掉,跟示例图一样操作。这个是 Cloudflare 提供的免费帮你做代理的功能,因为我们要自己绑定自己的证书,而且我们需要先把直连做好,再来启用 Cloudflare 这项高级功能。

HTTPS 证书的申请和绑定

因为 HTTPS 证书是基于信任的通信机制,安全是第一位,如果你想得到一个合法并且被其他人认可的证书,那么首先你就得证明你当前需要绑定域名的服务器的 IP 和你申请的域名是一对一绑定的

注意

免费的证书并不代表就是假的证书

获取 Cloudflare API Token

为什么 acme.sh 需要它?

acme.sh 这个脚本本质上是通过调用你域名解析厂商的 API 来验证这个域名是不是注册你名下的,并且已经跟你的服务器进行了解析绑定,也就是需要先验证前面说的信任

第一步,点击右上角弹出菜单选择:My Profile,然后点击子菜单 API Tokens

image.png

第二步,点击蓝色的大按钮:Create Token

image.png

然后选择 第一个 Edit zond DNS 对应的蓝色按钮 Use template

image.png

根据如下进行选择,然后点击最下方蓝色按钮 Continue to summary

image.png

最后一页是确认框,点击 Create Token (这张就不截图了太简单了)

生成完毕之后他会给你一个一大串的字符串,拷贝到你的电脑上,暂时保存一下。我假设你申请到的字符串是 abcdefg1234567

紧接着需要找到你需要操作的域名的两个重要 ID

Zone ID 和 Account ID

点击回到首页,找到你的域名,点击进去,就会进入域名的管理界面

image.png

我假设你的 Zone ID 是 z123,你的 Account ID 是 a456

所有物料都就绪了,我们需要进入我们的服务器进行操作。

使用 acme.sh 自动获取证书

更多关于 acme.sh 的详细介绍请点击官方 github https://github.com/acmesh-official/acme.sh

请使用 root 权限

ssh 登录的时候尽量使用 root,一些 vps 默认并不允许 root 用户登录,但是它给你分配的默认的用户是具备 root 权限的,所以你需要执行 sudo -s 来成为 root 用户

$ ssh [email protected] #不是 root 用户没关系,只要你能获取 sudo 权限 sudo -s 就可以

然后安装 acme.sh

$ curl https://get.acme.sh | sh -s [email protected] # 这里推荐使用你 Cloudflare 注册的邮箱

紧接着你会看见如下输出

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1032    0  1032    0     0   1465      0 --:--:-- --:--:-- --:--:--  1467
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  212k  100  212k    0     0   212k      0  0:00:01  0:00:01 --:--:--  221k
[Sun Sep 25 19:10:03 CST 2022] Installing from online archive.
[Sun Sep 25 19:10:03 CST 2022] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
[Sun Sep 25 19:10:09 CST 2022] Extracting master.tar.gz
[Sun Sep 25 19:10:10 CST 2022] It is recommended to install socat first.
[Sun Sep 25 19:10:10 CST 2022] We use socat for standalone server if you use standalone mode.
[Sun Sep 25 19:10:10 CST 2022] If you don't use standalone mode, just ignore this warning.
[Sun Sep 25 19:10:10 CST 2022] Installing to /root/.acme.sh
[Sun Sep 25 19:10:10 CST 2022] Installed to /root/.acme.sh/acme.sh
[Sun Sep 25 19:10:11 CST 2022] Installing alias to '/root/.bashrc'
[Sun Sep 25 19:10:11 CST 2022] OK, Close and reopen your terminal to start using acme.sh
[Sun Sep 25 19:10:13 CST 2022] Installing cron job
no crontab for root
no crontab for root
[Sun Sep 25 19:10:15 CST 2022] Good, bash is found, so change the shebang to use bash as preferred.
[Sun Sep 25 19:10:27 CST 2022] OK
[Sun Sep 25 19:10:27 CST 2022] Install success!

查看当前文件目录

$ ls -a

确认当前目录下包含一个 叫做 .acem.sh 的文件夹。

把前一步从 Cloudflare 获取的 3 个重要字段写入服务器的环境变量当中

$ export CF_Token="abcdefg1234567"
$ export CF_Account_ID="a456"
$ export CF_Zone_ID="z123"

注意,上面字符串请替换成你获取的内容。

执行如下命令获取证书,这个是高级一点的泛域名证书,意思就是你的子域名 例如 blog.xyz.com 都是可以通过信任的,例如你当前博客的这个域名也是使用这种证书。

$ acme.sh --issue -d xyz.com  -d '*.xyz.com'  --dns dns_cf

acme.sh默认的证书提供商是 ZeroSSL

如果你还是想用 letsencrypt 可以在尾部加上 --server letsencrypt

acme.sh --issue -d shouyicheng.com  -d '*.shouyicheng.com'  --dns dns_cf  --server  letsencrypt

成功之后会打印证书存储在你服务器上的地址:

[Sun Sep 25 20:18:58 CST 2022] Your cert is in: /root/.acme.sh/xyz.com/xyz.com.cer
[Sun Sep 25 20:18:58 CST 2022] Your cert key is in: /root/.acme.sh/xyz.com/xyz.com.key
[Sun Sep 25 20:18:58 CST 2022] The intermediate CA cert is in: /root/.acme.sh/xyz.com/ca.cer
[Sun Sep 25 20:18:58 CST 2022] And the full chain certs is there: /root/.acme.sh/xyz.com/fullchain.cer

使用 HTTPS 证书

安装 nginx

与 nginx 一样可以做代理的软件太多了,Caddy 和 Traefik 都做的很好,如果你很熟悉证书的在每个代理软件下的配置,后面就不用看了。

$ sudo apt install nginx

然后你用你的浏览器打开你的域名 http://xyz.com 或者直接用 IP 访问 http://1.2.3.4 , 应该是都可以看到

image.png

现在我们来配置 nginx

注意

之后所有操作都需要 root 权限

进入 /etc/nginx

$ cd /etc/nginx

然后修改 /etc/nginx/sites-available/default 文件

(vim 或者 nano 都可以,不过有一个神器是 VSCode - Remote development over SSH 这个之后我单开一篇来介绍。

改成如下内容:

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# https://www.nginx.com/resources/wiki/start/
# https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/
# https://wiki.debian.org/Nginx/DirectoryStructure
#
# In most cases, administrators will remove this file from sites-enabled/ and
# leave it as reference inside of sites-available where it will continue to be
# updated by the nginx packaging team.
#
# This file will automatically load configuration files provided by other
# applications, such as Drupal or Wordpress. These applications will be made
# available underneath a path with that package name, such as /drupal8.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#
server {
	listen 80 default_server;
	listen [::]:80 default_server;

	# SSL configuration
	#
	listen 443 ssl default_server;
	listen [::]:443 ssl default_server;
	#
	ssl_certificate     /root/.acme.sh/xyz.com/fullchain.cer;
	ssl_certificate_key /root/.acme.sh/xyz.com/xyz.com.key;	
	# Note: You should disable gzip for SSL traffic.
	# See: https://bugs.debian.org/773332
	#
	# Read up on ssl_ciphers to ensure a secure configuration.
	# See: https://bugs.debian.org/765782
	#
	# Self signed certs generated by the ssl-cert package
	# Don't use them in a production server!
	#
	# include snippets/snakeoil.conf;

	root /var/www/html;

	# Add index.php to the list if you are using PHP
	index index.html index.htm index.nginx-debian.html;

	server_name _;

	location / {
		# First attempt to serve request as file, then
		# as directory, then fall back to displaying a 404.
		try_files $uri $uri/ =404;
	}

	# pass PHP scripts to FastCGI server
	#
	#location ~ \.php$ {
	#	include snippets/fastcgi-php.conf;
	#
	#	# With php-fpm (or other unix sockets):
	#	fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
	#	# With php-cgi (or other tcp sockets):
	#	fastcgi_pass 127.0.0.1:9000;
	#}

	# deny access to .htaccess files, if Apache's document root
	# concurs with nginx's one
	#
	#location ~ /\.ht {
	#	deny all;
	#}
}


# Virtual Host configuration for example.com
#
# You can move that to a different file under sites-available/ and symlink that
# to sites-enabled/ to enable it.
#
#server {
#	listen 80;
#	listen [::]:80;
#
#	server_name example.com;
#
#	root /var/www/example.com;
#	index index.html;
#
#	location / {
#		try_files $uri $uri/ =404;
#	}
#}

然后需要执行

$ sudo nginx -s reload

让 nginx 刷新配置。

然后重新通过 https://xyz.com 访问,恭喜你的网站已经成功安装并且启用了 HTTPS 证书。

image.png

让证书自动续签并且自动刷新

acme.sh 的官方也说了,不应该直接使用 /root/.acme.sh/xyz.com/ 这个文件夹内的证书,因为它保不齐哪个版本就不放在这里了,所以我们还要更进一步设置一下。

使用 acme.sh 安装证书到指定位置

/root/ 目录下创建如下文件 /certs/xyz.com

$ cd /root
$ mkdir -p certs/xyz.com/

然后安装将证书安装到这个文件夹内

$ acme.sh --install-cert -d example.com \
--key-file       /root/certs/xyz.com/key.pem  \
--fullchain-file  /root/certs/xyz.com/cert.pem \
--reloadcmd     "sudo nginx -s reload"

因为证书存储在新的位置,所以我们需要返回 nginx 修改证书位置,找到如下配置

ssl_certificate     /root/.acme.sh/xyz.com/fullchain.cer;
ssl_certificate_key /root/.acme.sh/xyz.com/xyz.com.key;	

将它改成

ssl_certificate     /root/certs/xyz.com/cert.pem;
ssl_certificate_key /root/certs/xyz.com/key.pem;	

然后重新载入 nginx 配置

$sudo nginx -s reload

出现端口冲突?

如果你是从nps 从零启动 - 1. 服务端 开始操作的,那么当你安装了 nginx 之后就会出现端口冲突,请看 nps 从零启动 - 4. nginx + nps 灵活搭配使用