众所周知,http与https的“转化”需要配置SSL,今天总结一下Ubuntu下Nginx配置SSL踩过的坑。

Nginx配置SSL证书

提要

系统版本

  • 查看系统版本
    lsb_release -a
    查看系统版本

注:LSB是Linux Standard Base(Linux标准库)的缩写, lsb_release命令 用来与具体Linux发行版相关的Linux标准库信息。CentOS最小化安装时默认没有这个命令,需要安装lsb_release使用命令

  • 不太熟悉操作的朋友们可以用快照稍微备份一下~~以免后期数据丢失。

前期准备

  • 当前服务器中安装配置含有 http_ssl_module 模块的 Nginx 服务。
  • 将SSL证书上传至服务器。

SSL有免费的个人使用证书,可以去阿里云或腾讯云等地方申请免费的个人使用SSL证书。

阿里云免费SSL证书现在更名为“个人测试证书(免费版)”,一般选取DV证书。“个人测试证书(免费版)”跟“个人测试证书(pro)”的区别在于证书服务周期跟运维成本,pro版本支持托管服务,但需要收取一定费用(怕麻烦不太会操作的朋友们可以考虑)

  • 开启443端口,注意一下自己的防火墙。

具体过程

将SSL证书上传至服务器

  • 创建文件夹,在文件夹中放入你所下载的pem与key文件

找到自己的Nginx服务器配置文件

  • 寻找nginx配置文件
    find -name nginx.conf
    根据具体路径修改配置文件,注意在文件中修改时,应将server块配置放在http块配置内

80端口重定向

  • Nginx 支持 rewrite 功能。若您在编译时没有去掉 pcre,可在 HTTP 的 server 中增加return 301 https://$host$request_uri;,即可将默认80端口的请求重定向为 HTTPS。
1
2
3
4
5
6
7
server {
listen 80;
#请填写绑定证书的域名
server_name www.xxx.com xxx.com; (your_server_name)
#把http的域名请求转成https
return 301 https://$host$request_uri;
}

443端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
server_name www.xxx.com xxx.com; (your_server_name)
#请填写证书文件的相对路径或绝对路径
ssl_certificate /your_file_path/xxx.pem;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key /your_file_path/xxx.key;
ssl_session_timeout 5m;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location / {
#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
#例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 yourpath(目录) 为 /etc/www。
root xxx.com(your_path);
index index.html index.htm;
}
}

重启nginx服务

  • 通过执行nginx -t命令验证配置文件问题。若配置文件没有问题则执行nginx -s reload重启nginx服务

整体配置文件中的Server块配置

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
server {
listen 80;
#请填写绑定证书的域名
server_name www.xxx.com xxx.com;(your_server_name)
#把http的域名请求转成https
return 301 https://$host$request_uri;
}
server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
server_name www.xxx.com xxx.com; (your_server_name)
#请填写证书文件的相对路径或绝对路径
ssl_certificate /your_file_path/xxx.pem;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key /your_file_path/xxx.key;
ssl_session_timeout 5m;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
location / {
#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
#例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 yourpath(目录) 为 /etc/www。
root xxx.com(your_path);
index index.html index.htm;
}
}

注:此代码仅实现配置SSL基础代码,想要安全级别更高如禁止在证书验证目录放入敏感文件,可以自行加入,另外,网站已上CDN的需要在阿里CDN界面https设置中添加SSL证书

槽点

  • 小小吐槽一下,为了方便,用了下宝塔,配置了防火墙,结果在平台上打开端口放行了,忘记在宝塔上放行。。。过了好久才找到访问不到的原因