---
title: VPS · 配置 Cloudflare 的免费 SSL 证书
created: 2022-06-12
summary: 关于如何为多个域名配置SSL证书的操作笔记
tags:
  - Nginx
  - VPS
---

声明：我不知道这样安不安全哈，It just works，个人笔记，操作有风险

参考：[申请 CloudFlare 免费 SSL 证书并应用到 nginx – 65536.io | 自娱自乐](https://65536.io/2020/03/607.html)

先设置加密方式为`完全` ，否则之后可能会出现 526 错误

![](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2022/06/45ff9edefcc93a134b8478525bf6767b.png)

## 1. 创建证书

首先将主域名绑定到 Cloudflare，然后在`SSL/TLS` 下的源服务器证书处，点击`创建证书`
![](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2022/06/b693acbf458e0efaf1c18037e563060e.png)

然后选择私钥和 CSR 生成方式，以及证书的有效期（也可以不改），点击`创建`
![](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2022/06/6925f00b181e60af9b8c211942359b6d.png)

将下面的证书和私钥暂时复制到某个安全的地方，点击确定
![](https://usc1.contabostorage.com/cc0b816231a841b1b0232d5ef0c6deb1:image/2022/06/bc66277a7ebfce59a1cc67ab2947b948.png)

## 2. 密钥上传到 VPS

连接 VPS 之后，创建一个文件夹存入密钥，我将其存到`/etc/nginx/cert/` 路径下

```bash
sudo mkdir /etc/nginx/cert && cd /etc/nginx/cert
```

写入证书,粘贴入刚刚保存的`证书` 栏里面的内容

```bash
sudo nano public.pem
```

修改权限

```bash
sudo chmod 644 public.pem
```

写入私钥，粘贴入刚刚保存的`私钥` 栏里面的内容

```bash
sudo nano private.key
```

修改权限

```bash
sudo chmod 600 private.key
```

## 3. 修改 Nginx 配置

参考：[How to Redirect HTTP to HTTPS in Nginx](https://phoenixnap.com/kb/redirect-http-to-https-nginx)

如果有用防火墙，请先打开 80 端口和 443 端口，不然可能会像我一样，卡在一个毫无意义的 522 Error 上 ^ ^

```bash
sudo ufw allow 80
sudo ufw allow 443
```

打开 Nginx 配置

```bash
sudo nano /etc/nginx/nginx.conf
```

在 http 块里面配置一个默认 server，将 http 重定向到 https

```bash
	# 默认server
	server {
		listen 80 default_server;
		server_name _;
		return 301 https://$host$request_uri;
	}

	# ssl配置
	server {
		listen 443 ssl default_server;
		server_name *.example1.com;

		ssl_certificate /etc/nginx/cert/public.pem;
		ssl_certificate_key /etc/nginx/cert/private.key;
	}

# 如果有多个域名，可以这样配置，证书也要按之前的添加一下
	server {
		listen 443 ssl;
		server_name *.example2.com;

		ssl_certificate /etc/nginx/cert/example2/public.pem;
		ssl_certificate_key /etc/nginx/cert/example2/private.key;
	}
```

然后`sudo nginx -t` 测试一下，没有问题的话就可以 Nginx 了：

```bash
sudo systemctl reload nginx
```

之后如果有域名要配置 ssl ，如 example.conf 中，可以直接将 `listen 80` 改为`listen 443 ssl`

我常用的一个反代配置:

```conf
	server {
		listen 443 ssl;
		server_name 域名;
		location / {
				proxy_pass http://127.0.0.1:反代端口;
				proxy_set_header HOST $host;
				proxy_set_header X-Forwarded-Proto $scheme;
				proxy_set_header X-Real-IP $remote_addr;
				proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		}
	}
```
