Centos7利用Nginx配置HTTPS

引:最近在做一个微信小程序项目,坑爹的小程序不仅需要https协议,而且还要是80端口才能访问后台,这里总结一下Nginx的安装过程与HTTPS的配置。

Ngnix的安装

由于后面Nginx需要添加模块,所以我们采用源码安装,具体安装方法可以参考 走进Linux_软件安装 中的源码安装一节。

这里需要注意的我们在 产生makefile文件的时候 需要加一些configure arguments,以便安装相关模块。如下:

1
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module

安装完之后可以利用下面的命令查看Ngnix版本及其编译参数:

1
2
3
4
5
6
7
8
/usr/local/nginx/sbin/nginx -V

// 输出如下结果就是对的
nginx version: nginx/1.11.6
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module

然后我们测试新的nginx程序是否正确:

1
2
3
4
5
/usr/local/nginx/sbin/nginx -t

// 输出如下结果J就表面安装成功
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

配置HTTPS

SSL证书申请

SSL证书遵守 SSL(Secure Sockets Layer 安全套接层)协议,由受信任的数字证书颁发机构CA,在验证服务器身份后颁发,具有服务器身份验证和数据传输加密功能,也就是说你想要使用https就需要拥有SSL证书。

这里我们使用openssl证书来举例,微信小程序官网也是使用openssl来进行HTTPS服务器配置

  1. 生成私钥

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // 进入nginx的安装目录
    cd /usr/local/nginx

    // 创建一个存放私钥的文件夹(自定义)
    mkdir key

    // 进入key文件夹
    cd key

    // 生成私钥
    openssl genrsa -out server.key 2048
  2. 生成csr文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // CSR 是Certificate Signing Request的缩写,即证书签名请求,
    // 这不是证书,可以简单理解成公钥,生成证书时要把这个提交给权威的证书颁发机构。


    // 生成csr文件
    openssl req -new -key server.key -out certreq.csr

    // 输入上面的命令后会要求你输入一些信息:
    Country Name: CN //您所在国家的ISO标准代号,中国为CN
    State or Province Name:guandong //您单位所在地省/自治区/直辖市
    Locality Name:shenzhen //您单位所在地的市/县/区
    Organization Name: Tencent Technology (Shenzhen) Company Limited //您单位/机构/企业合法的名称
    Organizational Unit Name: R&D //部门名称
    Common Name: www.example.com //通用名,网站域名。此项必须与您访问提供SSL服务的服务器时所应用的域名完全匹配。
    Email Address: //您的邮件地址,不必输入,直接回车跳过
    "extra"attributes // 以下信息不必输入,回车跳过直到命令执行完毕。
  3. 生成crt证书

    1
    2
    // CRT 即 certificate的缩写,即证书。
    openssl x509 -req -days 365 -in certreq.csr -signkey server.key -out certreq.crt

Nginx配置SSL加密

想要https就要监听443端口,nginx.conf已经预留出了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
// 编辑Ngnix配置文件
vim /usr/local/nginx/conf/nginx.conf

// 修改监听443端口的Server,使其如下:
server {
listen 443 ssl;
server_name www.example.com;
ssl on;
# ssl_certificate证书其实是个公钥,它会被发送到连接服务器的每个客户端
ssl_certificate /usr/local/nginx/key/certreq.crt;
# ssl_certificate_key私钥是用来解密的,所以它的权限要得到保护但nginx的主进程能够读取
ssl_certificate_key /usr/local/nginx/key/server.key;
ssl_session_timeout 5m;
# 指定SSL服务器端支持的协议版本
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 选择加密算法
ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# 在使用SSLv3和TLS协议时指定服务器的加密算法要优先于客户端的加密算法
ssl_prefer_server_ciphers on;
# 虽然我们要使用HTTPS,但是服务器的程序接收的还是HTTP,所以要做个反向代理
location /{
proxy_pass http://localhost:8080;
}
}

这样虽然可以利用https来访问我们的ip,但是对于浏览器还是不受信任的。

导入证书

如果你是找一个知名的SSL证书颁发机构如VeriSign、Wosign、StartSSL签发的证书,并且浏览器已经内置并信任了这些根证书,如果你是自建证书(向我们刚才那样)或获得二级证书授权,那么就需要将证书添加到浏览器,这样在访问站点时才不会显示不安全连接。不够买证书微信小程序会不支持。 证书生成的方法有很多,这里说两种:

  1. 购买阿里云的免费证书

  2. 购买GETSSL官网证书

购买好证书并下载后(可以将证书和私钥放到之前的key目录)需要从新配置nginx.conf文件,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 443 ssl;
server_name www.example.com;
ssl on;
# pem是crt的一种,内容是BASE64编码,Apache和*NIX服务器偏向于使用这种编码格式
ssl_certificate /usr/local/nginx/key/*.pem;
ssl_certificate_key /usr/local/nginx/key/*.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location /{
proxy_pass http://localhost:8080;
}
}

参考

  1. linux nginx配置https
  2. openssl、x509、crt、cer、key、csr、ssl、tls 这些都是什么鬼?