一、HTTPS基本概述

为什么需要使用 HTTPS,因为 HTTP 不安全,当我们使用 HTTP 网站时,会遭到劫持和篡改,如果采用 HTTPS 协议,那么数据在传输过程中是加密的,所以黑客无法窃取或者篡改数据报文信息,同时也避免网站传输时信息泄露。

那么我们在实现 HTTPS 时,需要了解 SSL 协议,但我们现在使用的更多的是 TLS 加密协议。

那么 TLS 是怎么保证明文消息被加密的呢?在 OSI 七层模型中,应用层是http协议,那么在应用层协议之下,我们的表示层,是 SSL 协议所发挥作用的一层,他通过(握手、交换秘钥、告警、加密)等方式,是应用层 HTTP 协议没有感知的情况下做到了数据的安全加密

 

二、HTTPS证书下发流程

我们首先需要申请证书,先去登记机构进行身份登记,我是谁,我是干嘛的,我想做什么,然后登记机构再通过CSR发给 CA,CA 中心通过后会生成一堆公钥和私钥,公钥会在 CA 证书链中保存,公钥和私钥证书我们拿到后,会将其部署在WEB服务器上。

  1. 当浏览器访问我们的 https 站点时,他会去请求我们的证书。
  2. Nginx 这样的 web服务器 会将我们的公钥证书发给浏览器。
  3. 浏览器会去验证我们的证书是否合法有效。
  4. CA 机构会将过期的证书放置在CRL服务器,CRL服务的验证效率是非常差的,所以CA有推出了 OCSP 响应程序,OCSP 响应程序可以查询指定的一个证书是否过去,所以浏览器可以直接查询 OSCP 响应程序,但 OSCP 响应程序性能还不是很高。
  5. Nginx会有一个 OCSP 的开关,当我们开启后,Nginx会主动上 OCSP 上查询,这样大量的客户端直接从 Nginx 获取证书是否有效。

 

三、证书类型介绍

对比 域名型DV 企业型OV 增强型EV
绿色地址栏 小锁标记+https 小锁标记+https 小锁标记+企业名称+https
一般用途 个人站点和应用; 简单的https加密需求 电子商务站点和应用; 中小型企业站点 大型金融平台; 大型企业和政府机构站点
审核内容 域名所有权验证 全面的企业身份验证; 域名所有权验证 最高等级的企业身份验证; 域名所有权验证
单次申请年限 10分钟-24小时 3-5个工作日 5-7个工作日
赔付保障金 —— 125-175万美金 150-175万美金

1.购买证书选择

2.HTTPS证书注意事项

  1. https 不支持续费,证书到期需要重新申请并进行替换。

  2. https 不支持三级域名解析,如 test.m.haoda.com。

    • https 显示绿色,说明整个网站的url都是 https 的

    • https 显示黄色,因为网站代码中包含http 的不安全链接

    • https 显示红色,那么证书是假的或者证书过期。

 

四、配置单台机器 HTTPS 证书

1.检查 Nginx 是否有 HTTPS 模块

Nginx 需要 --with-http_ssl_module 模块才能使用 HTTPS

$ nginx -V
--with-http_ssl_module

2.创建存放证书目录

$ mkdir /etc/nginx/ssl_key
$ cd /etc/nginx/ssl_key/

3.生成证书

$ openssl genrsa -idea -out server.key 2048
Generating RSA private key, 2048 bit long modulus
..................................................................................................................................+++
...............................................................................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:


$ openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
Generating a 2048 bit RSA private key
...................................................+++
.................+++
writing new private key to 'server.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:AH
Locality Name (eg, city) [Default City]:LA
Organization Name (eg, company) [Default Company Ltd]:WANHEBIN
Organizational Unit Name (eg, section) []:WANHEBIN
Common Name (eg, your name or your server's hostname) []:discuz.test.com
Email Address []:123@qq.com
You have new mail in /var/spool/mail/root
$ openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt

-req 用于创建新的证书

-new 创建的是新证书

-x509 定义证书的格式为标准格式

-key 调用的私钥文件信息

-out 输出证书文件信息

-days 证书的有效期

$ ll
total 8
-rw-r--r-- 1 root root 1375 Mar 5 15:15 server.crt
-rw-r--r-- 1 root root 1704 Mar 5 15:15 server.key

4.Nginx 证书配置语法

  • 启动 SSL 功能
Syntax:	ssl on | off;
Default: ssl off;
Context: http, server
  • 证书文件
Syntax:	ssl_certificate file;
Default: —
Context: http, server
  • 私钥文件
Syntax:	ssl_certificate_key file;
Default: —
Context: http, server

5.配置 Nginx 证书

5.1 配置 Nginx

$ vim /etc/nginx/conf.d/s.linux.com.conf
server {
ssl on;
listen 443;
server_name s.linux.com;

ssl_certificate /etc/nginx/ssl_key/server.crt;
ssl_certificate_key /etc/nginx/ssl_key/server.key;

location / {
root /code/https;
index index.html;
}
}

5.2 重启 Nginx

$ systemctl restart nginx

5.3 配置站点

$ echo "test https" > /code/https/index.html

 

五、全站 HTTPS

1.环境准备

主机 外网IP 内网IP 身份
lb-01 10.0.0.5 172.16.1.5 负载均衡
web-01 10.0.0.6 172.16.1.6 web服务器
web-02 10.0.0.7 172.16.1.8 web服务器

2.配置 web服务器(两台)

2.1 配置 Nginx 配置文件

[root@web-01 conf.d]# vim s.linux.com.conf 
server {
listen 80;
server_name s.linux.com;

location / {
root /code/https;
index index.html;
}
}

重启 nginx 服务

[root@web-01 conf.d]# systemctl restart nginx

2.2 同步配置文件

[root@web-01 conf.d]# scp s.linux.com.conf 172.16.1.8:/etc/nginx/conf.d/

2.3 配置站点目录文件

[root@web-01 conf.d]# mkdir /code/https
[root@web-01 conf.d]# echo "https1111" > /code/https/index.html
[root@web-02 conf.d]# mkdir /code/https
[root@web-02 conf.d]# echo "https2222" > /code/https/index.html
[root@web-01 conf.d]# chown -R www.www /code/https/
[root@web-02 conf.d]# chown -R www.www /code/https/

2.4 推送、上传证书文件

[root@web-01 conf.d]# scp -r /etc/nginx/ssl_key 172.16.1.4:/etc/nginx/

2.5 配置负载均衡机器 Nginx

  • 写法一

    [root@lb-01 conf.d]# vim s.linux.com.conf
    upstream webserver {
    server 172.16.1.7:80;
    server 172.16.1.8:80;
    }

    server {
    listen 80;
    server_name s.linux.com;
    return 302 https://$server_name$request_uri;
    }

    server {
    listen 443 ssl;
    server_name s.linux.com;

    ssl_certificate /etc/nginx/ssl_key/server.crt;
    ssl_certificate_key /etc/nginx/ssl_key/server.key;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    error_page 497 https://$host$request_uri;

    location / {
    proxy_pass http://webserver;
    proxy_set_header host $http_host;
    }
    }
  • 写法二

    [root@lb-01 conf.d]# vim s.linux.com.conf
    upstream webserver {
    server 172.16.1.7:80;
    server 172.16.1.8:80;
    }
    server {
    listen 80;
    listen 443 ssl;
    server_name s.linux.com;

    #HTTP_TO_HTTPS_START
    if ($server_port !~ 443){
    rewrite ^(/.*)$ https://$host$1 permanent;
    }
    #HTTP_TO_HTTPS_END

    #SSL-START
    ssl_certificate /etc/nginx/ssl_key/server.crt;
    ssl_certificate_key /etc/nginx/ssl_key/server.key;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    error_page 497 https://$host$request_uri;
    #SSL-END

    location / {
    proxy_pass http://webserver;
    proxy_set_header host $http_host;
    }
    }

注意:

以上两种 SSL 配置方法选择一种即可。

配置完成后,重启 nginx 服务,然后使用浏览器验证配置是否生效。