导言
通过使用nginx来部署https是一种方便的方式。本文是一个自己部署https的笔记
安装Nginx
在Centos的默认镜像中不包含nginx,我们需要添加一个EPEL (extra packages for Enterprise Linux) repository
1 | sudo yum install epel-release |
然后运行yum 安装1
sudo yum install nginx
安装好之后可以通过service命令来控制nginx的启动
1 | sudo systemctl start nginx # 启动 |
最好启动开机自启动
1 | sudo systemctl enable nginx |
启动之后默认挂载在80端口,https是挂载在443端口,需要检查一下防火墙是否对这些端口进行了封锁。
如果系统使用的是firewalld
请使用下列的命令
1 | sudo firewall-cmd --add-service=http |
如果是用的iptables
那就用下列的命令1
2sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT
然后访问对应的ip就可以看到nginx的默认页面了
创建证书
证书的申请我不讲了,有很多方法。根据实际情况看下资料就好了。
https 的证书包含一个private
,public
两个部分。我们分别建立两个文件夹来存放他们
/etc/ssl/certs 存放公钥的
*.crt
,*.pem
两种文件
/etc/ssl/private 存放公钥的*.key
文件
1 | sudo mkdir /etc/ssl/private |
配置nginx的Https
nginx在默认情况下是没有启动https的,所以我们需要新建一个配置文件用来描述https
我们需要再/etc/nginx/conf.d/
下创建一个.conf
结尾的文件,nginx在启动的时候会默认加载conf.d
下以.conf
结尾的配置文件。
我们创建一个ssl的配置文件
1 | sudo vi /etc/nginx/conf.d/ssl.conf |
默认情况下的https端口是443端口,server_name
是你申请的域名,或者ip。
然后再加入以下对于https的描述性配置,就完成了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
45
46
47
48
49server {
listen 443 http2 ssl;
listen [::]:443 http2 ssl;
server_name server_IP_address;
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
########################################################################
# from https://cipherli.st/ #
# and https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html #
########################################################################
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";
ssl_ecdh_curve secp384r1;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
##################################
# END https://cipherli.st/ BLOCK #
##################################
root /usr/share/nginx/html;
location / {
}
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
配置nginx的转发
通常我们都是将自己的本地服务器,放在内网,通过nginx来映射服务。nginx配置接口转发相当方便只需要在上面的配置最后加上一个
1 | location /api/ { |
其中的4399 就是本地服务器的端口号了。
可以将多个本地的路径映射到不同的服务器上