前言

SSL证书(Secure Socket Layer)用来提供对用户和服务器的认证,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,为网站配置SSL证书后,就可以以https方式访问网站了。

在很多云厂商处申请SSL证书是收费的。为了省钱,我们可以申请一个免费的SSL证书。例如从Let’s Encrypt这里,就能申请到免费的SSL证书。Let’s Encrypt是一个提供SSL/TLS证书的非营利证书颁发机构,只需简单几步便可完成SSL证书的申请。

申请证书

为了省事,我直接用自己的云服务器厂商代申请的方式搞了个SSL证书。过程很简单,到后台DNS解析页面添加一条TXT类型的记录即可,主机名和记录值和他提供的一致就行。等解析生效后再验证就能获得证书了。也可以根据官网文档进行申请,这里不再赘述。

在获得证书后,我们需要下载给出的私钥文件(.key)和证书文件(.pem),并上传到服务器上。

配置证书

假设你已经将私钥文件和证书文件下载到了本地,可以使用scp上传这两个文件:

1
scp yoursite.key yoursite.pem user@xxx.xxx.xx.xxx:/home/card

我的网站是Nginx驱动的,对于Nginx,我们需要修改如下配置文件:

1
/etc/nginx/nginx.conf

不同情况下配置文件的路径可能也不一样,可以自行查找一下Nginx的配置文件在哪。
在Nginx配置中添加如下修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
http {
##
# Basic Settings
##
server {
#监听443端口
listen 443 ssl;
#你的域名
server_name yoursite.top;
#ssl on;
#ssl证书文件路径
ssl_certificate //card/yoursite.top.pem;
#ssl私钥文件路径
ssl_certificate_key /root/card/yoursite.top.key;
location / {
proxy_pass http://xxx.xxx.xx.xxx:80;
}
}
server {
listen 80;
server_name yoursite.top;
#将请求转成https
rewrite ^(.*)$ https://$host$1 permanent;
}
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect off;

include /etc/nginx/mime.types;
default_type application/octet-stream;

##
# SSL Settings
##

ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
}

记得务必把server_tokens设置为off,提升你服务器的安全性(报错不提示Nginx版本号)。

其它设置如Logging Settings等可以自行调整一下,现在应该已经成功配置了你的SSL证书了。

使用systemctl重启Nginx服务:

1
systemctl restart nginx | systemctl status nginx.service

输出没有报错和警告,再次访问你的网站看看:
20241221211702-2024-12-21-21-17-02

现在就可以以https方式访问你的网站了。不过证书一般有效期只有90天,过期需要续签
如果不想手动续签,也可以使用acme.sh等方案来实现自动续签。

错误处理

如果你是按照上述方式配置Nginx的,理论上不会出现什么问题。坑已经踩好了。

我在配置过程中一共遇到了两个问题,都是自己脑抽了:

  1. 配置完成后访问网站出现400报错
    服务器提示400 Bad Request,The plain HTTP request was sent to HTTPS port

查看配置文件,

1
listen 443;

应改为

1
listem 443 ssl;

这是因为高版本的Nginx修改了配置语法,修改后用#注释掉ssl on;即可

  1. 配置完成后访问网站出现504报错
    服务器提示504 Gateway Timeout

查看配置文件,发现是location里的proxy_pass配置的端口号错了(应该是80,我不知道为什么写的是8080)