自签证书相关笔记

linux9期架构-宋阳阳-day22

课前回顾

ssl证书,有了ssl网站才能跳转到https

网站http://换成https://		:s#http://#https://#g

ssl证书购买

cdn

HTTP和HTTPS是什么?

我们使用浏览器访问一个网站页面,在浏览器的地址栏中我们会看到一串URL,如图

img

网站的URL会分为两部分:通信协议和域名地址。

域名地址都很好理解,不同的域名地址表示网站中不同的页面,而通信协议,简单来说就是浏览器和服务器之间沟通的语言。网站中的通信协议一般就是HTTP协议和HTTPS协议。

HTTP协议

HTTP协议是一种使用明文数据传输的网络协议。一直以来HTTP协议都是最主流的网页协议,但是不安全

img

HTTPS协议

HTTPS协议可以理解为HTTP协议的升级,就是在HTTP的基础上增加了数据加密。在数据进行传输之前,对数据进行加密,然后再发送到服务器。这样,就算数据被第三者所截获,但是由于数据是加密的,所以你的个人信息让然是安全的。这就是HTTP和HTTPS的最大区别。

img

其实如果你足够细心,你会发现现在很多大型互联网网站,如百度、淘宝、腾讯很早就已经把HTTP换成HTTPS了。

img

HTTP和HTTPS的其他不同

数据加密传输,是HTTP和HTTPS之间的本质性区别,其实除了这个之外,HTTPS网站和HTTP网站还有其他地方不同。

当你使用Chrome浏览器访问一个HTTP网站的时候,你会发现浏览器会对该HTTP网站显示“不安全”的安全警告,提示用户当前所访问的网站可能会存在风险。

img

而假如你访问的是一个HTTPS网站时,情况却是完全不一样。你会发现浏览器的地址栏会变成绿色,企业名称会展示在地址栏中,地址栏上面还会出现一把“安全锁”的图标。这些都会给与用户很大的视觉上的安全体验。以下是EV证书在不同浏览器中的展现。

img

除了浏览器视觉上不同以外,HTTPS网站和HTTP网站还有一个很重要的区别,就是对搜索排名的提升,这也是很多站长所关注的地方。

百度和谷歌两大搜索引擎都已经明确表示,HTTPS网站将会作为搜索排名的一个重要权重指标。也就是说HTTPS网站比起HTTP网站在搜索排名中更有优势。

HTTPS网站相比起HTTP网站拥有着多种的优势,HTTP明显已经不能适应当今这个互联网时代,可以预见到HTTP在不久的将来将会全面被HTTPS所取代。

CA机构又是如何颁发证书?

证书类型介绍

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

证书购买选择

单域名证书,保护一个域名 www

多域名证书,保护五个域名 www images cdn test m

通配符域名,通配符域名 *.driverzeng.com


HTTPS注意事项 :

https不支持续费,证书到期需要重新申请并进行替换
https不支持三级域名解析,如 test.m.driverzeng.com
https显示绿色,说明整个网站的url都是https
https显示黄色,因为网站代码中包含http的不安全链接
https显示红色,那么证书是假的或者证书过期或者某些不安全的链接


ngx_http_sub_module模块

location / {
    sub_filter '<a href="http://127.0.0.1:8080/'  '<a href="https://$host/';
    sub_filter '<img src="http://127.0.0.1:8080/' '<img src="https://$host/';
    sub_filter_once on;
}

Syntax:	sub_filter string replacement;
Default:	—
Context:	http, server, location(?)

绵羊机

1.手写server语句
[root@web01 conf.d]# cat test.conf 
server {
        listen 80;
        server_name jj.com;
        root /data/code;
        index index.html;
        charset utf-8;
}
 
2.编辑HTML
[root@web01 code]# vim index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>我是title</title>
</head>
<body>
<article>
  <header>
    <h1>我是Article</h1>
    <p>创建时间:<time pubdate="pubdate">2018/8/10</time></p>
  </header>
  <p>
    <b>Aticle</b>第一次用h5写文章,好他*的紧张...
  </p>
  <footer>
    <p><small>曾老湿版权所有!</small></p>
  </footer>
</article>
</body>
</html>

3.重载nginx配置文件
nginx -sreload

4.本地域名解析

5.浏览器访问
jj.com

灰狼机

1.使用sub模块代理绵羊机
[root@web01 conf.d]# vim /etc/nginx/conf.d/jj.conf
upstream jiechi {
        server 10.0.0.9:80;
}

server {
        listen 80;
        server_name www.linux.com;

        location / {
                proxy_pass http://jiechi;
                proxy_set_header Host $http_host;
                sub_filter '<h1>欢迎来到{{ 曾老湿 }}自定义网站</h1>' '<h1>欢迎来到{{ syy }}自定义网站</h1>';
                sub_filter '<title>主页面</title>' ' <title>不是主页面</title>';
        }
}

2.重载nginx配置文件
nginx -sreload

3.本地域名解析

4.浏览器访问
jj.com

#使用sub模块修改某一站点的条件
一:目标的IP和端口,域名
二:站点内容
三:本地解析
	通过sub模块可以修改某一站点任意内容,所以想要黑一个网站,最重要的是域名劫持,然后绑定到黑客自己的网站

taoyyd.png

ngx_http_ssl_module模块

Nginx 单台实现HTTPS流程


环境准备

nginx必须有ssl模块,没有的话要重新编译安装
[root@web03 ~]# nginx -V
--with-http_ssl_module

#创建存放ssl证书的路径,位置随意
[root@web03 ~]# mkdir -p /etc/nginx/ssl_key && cd /etc/nginx/ssl_key

使用openssl命令充当CA权威机构创建证书(生产不使用此方式生成证书,不被互联网认可的黑户证书)(相当于公钥)

[root@web03 ssl_key]# openssl genrsa -idea -out $(date +%Y%m%d)_www.linux.com.key 2048

Generating RSA private key, 2048 bit long modulus
........+++
..........+++
e is 65537 (0x10001)
Enter pass phrase for 20200603_www.linux.com.key: #密码1234
Verifying - Enter pass phrase for 20200603_www.linux.com.key:
[root@web03 ssl_key]# ls
20200603_www.linux.com.key


生成自签证书,同时去掉私钥的密码(私钥)

[root@web03 ssl_key]# openssl req -days 36500 -x509 \
-sha256 -nodes -newkey rsa:2048 -keyout /etc/nginx/ssl_key/20200603_www.linux.com.key -out /etc/nginx/ssl_key/20200603_www.linux.com.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
string is too long, it needs to be less than  2 bytes long
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CHINA
Locality Name (eg, city) [Default City]:CN
Organization Name (eg, company) [Default Company Ltd]:shiwei
Organizational Unit Name (eg, section) []:CN
Common Name (eg, your name or your server hostname) []:*.linux.com	#要绑定的域名(选择fan证书)
Email Address []:123@qq.com

# req  --> 用于创建新的证书
# new  --> 表示创建的是新证书    
# x509 --> 表示定义证书的格式为标准格式
# key  --> 表示调用的私钥文件信息
# out  --> 表示输出证书文件信息
# days --> 表示证书的有效期

配置server的ssl模板

http {
    server {
        listen              443 ssl;
        ssl_certificate /etc/nginx/ssl_key/20200603_www.linux.com.key.crt;
        ssl_certificate_key /etc/nginx/ssl_key/20200603_www.linux.com.key;
    }
}

#443 ssl  就不用写ssl on了
# 这种黑户证书不能被互联网认可(浏览器显示为红色)

为linux配置https和证书及域名强行跳转

[root@web03 code]# vim /etc/nginx/conf.d/ln.conf
server {
        listen 80;
        server_name www.linux.com;
        rewrite ^(.*)$ https://$server_name$request_uri redirect;
        #return 302 https://$server_name$request_uri;
}

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

        root /code/dist;
        index index.html;
                
         ssl_certificate /etc/nginx/ssl_key/20200603_www.linux.com.key.crt;
         ssl_certificate_key /etc/nginx/ssl_key/20200603_www.linux.com.key;

        location ~* ^/(download|friend|blog) {
                rewrite ^/(.*)$ http://$1.linux.com redirect;
                #return 302 http://$request_uri.linux.com;
        }
}

server {
        listen 80;
        server_name friend.linux.com;

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

server {
        listen 80;
        server_name blog.linux.com;

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

server {
        listen 80;
        server_name download.linux.com;

        location / {
                root /code/download;
                index down.html;
        }
}

#浏览器输入https://www.linux.com/ ,因为服务器80端口没有被使用,使用的是443端口,这种方式访问该域名的子网,跳转后的子域名还是http://

#加入强行跳转server,浏览器输入www.linux.com查看,这种方式访问该域名的子网,跳转后的子域名还是http://
server {
        listen 80;
        server_name www.linux.com;
        return 302 https://$server_name$request_uri;
}

QQ截图20200603182847.png

nginx集群实现https

环境准备

主机名 外网IP(NAT) 内网IP(LAN) 角色
lb01 10.0.0.5 172.16.1.5 负载均衡
web02 10.0.0.8 172.16.1.8 web服务器
web03 10.0.0.9 172.16.1.9 web服务器

方法一

集群布置ssl证书麻烦死实例(每台web都布置ssl)

#拷贝,使web站点目录,server配置,证书等条件一样
配置文件
[root@web03 ~]# rsync -avz /etc/nginx/conf.d/* 10.0.0.8:/etc/nginx/conf.d/
[root@web03 ~]# rsync -avz /etc/nginx/conf.d/* 10.0.0.7:/etc/nginx/conf.d/

站点目录
[root@web03 ~]# rsync -avz /code/* 10.0.0.8:/code/
[root@web03 ~]# rsync -avz /code/* 10.0.0.7:/code/

证书
[root@web03 ~]# rsync -avz /etc/nginx/ssl_key/* 10.0.0.8:/etc/nginx/ssl_key/
[root@web03 ~]# rsync -avz /etc/nginx/ssl_key/* 10.0.0.7:/etc/nginx/ssl_key/

[root@web02 conf.d]# nginx -sreload
[root@web01 conf.d]# nginx -sreload

#这样每台web都布置,不太现实

img

方法二

web不要布置证书

拷贝证书到lb服务器

[root@web03 nginx]# rsync -avz /etc/nginx/ssl_key/* 172.16.1.5:/etc/nginx/ssl_key

配置lb01的nginx配置

[root@lb01 conf.d]# vim /etc/nginx/conf.d/ssl.conf  
upstream web {
        server 172.16.1.7:80;
        server 172.16.1.8:80;
        server 172.16.1.9:80;
}

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

server {
        listen 443 ssl;				#
        server_name www.linux.com;
        ssl_certificate   ssl_key/server.crt;		#
        ssl_certificate_key  ssl_key/server.key;	#
        
        location / {
            proxy_pass http://web;
            proxy_set_header Host $http_host;
        }
}

#为不同的网站都配置ssl,有几个网站诶只几个server
server {
        listen 443 ssl;
        server_name friend.linux.com;
        ssl_certificate   ssl_key/server.crt;
        ssl_certificate_key  ssl_key/server.key;
        
        location / {
            proxy_pass http://web;
            proxy_set_header Host $http_host;
        }
}

# 重载
nginx -sreload

# web不要配置ssl,ssl只需要部署在lb,证书的80强转443永远部署在集群最前面(lb或者cdn,不能配置在四层负载)

-------------------------------------------------------------
#web03 server配置
[root@web03 code]# vim /etc/nginx/conf.d/ln.conf
server {
        listen 80;
        server_name www.linux.com;
        rewrite ^(.*)$ https://$server_name$request_uri redirect;
        #return 302 https://$server_name$request_uri;
}

server {
        listen 80;
        server_name www.linux.com;

        root /code/dist;
        index index.html;

        location ~* ^/(download|friend|blog) {
                rewrite ^/(.*)$ http://$1.linux.com redirect;
                #return 302 http://$request_uri.linux.com;
        }
}

server {
        listen 80;
        server_name friend.linux.com;

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

server {
        listen 80;
        server_name blog.linux.com;

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

server {
        listen 80;
        server_name download.linux.com;

        location / {
                root /code/download;
                index down.html;
        }
}

#web不要配置证书
[root@web03 ~]# rm -rf /etc/nginx/ssl_key/
[root@web02 ~]# rm -rf /etc/nginx/ssl_key/
[root@web01 ~]# rm -rf /etc/nginx/ssl_key/

#拷贝,使web站点目录,server配置,证书等条件一样
配置文件
[root@web03 ~]# rsync -avz /etc/nginx/conf.d/* 10.0.0.8:/etc/nginx/conf.d/
[root@web03 ~]# rsync -avz /etc/nginx/conf.d/* 10.0.0.7:/etc/nginx/conf.d/

站点目录
[root@web03 ~]# rsync -avz /code/* 10.0.0.8:/code/
[root@web03 ~]# rsync -avz /code/* 10.0.0.7:/code/

[root@web02 conf.d]# nginx -sreload
[root@web01 conf.d]# nginx -sreload

img

真实业务场景实现HTTPS实践

部署负载均衡

拷贝证书到lb服务器

[root@web03 nginx]# rsync -avz /etc/nginx/ssl_key/* 172.16.1.5:/etc/nginx/ssl_key

配置lb01的nginx配置

[root@lb01 conf.d]# vim /etc/nginx/conf.d/ssl.conf  
upstream web {
        server 172.16.1.7:80;
        server 172.16.1.8:80;
        server 172.16.1.9:80;
}

server {
        listen 80;
        server_name cs.wp.com cs.zh.com cs.pm.com;
        return 302 https://$server_name$request_uri;
}

server {
        listen 443 ssl;
        server_name cs.wp.com cs.zh.com cs.pm.com;
        ssl_certificate   ssl_key/server.crt;
        ssl_certificate_key  ssl_key/server.key;
        
        location / {
            proxy_pass http://web;
            proxy_set_header Host $http_host;
        }
}

部署web01安装wordpress 服务

服务器web01 web02执行以下操作,server是通用的
1.手写server语句
vim /etc/nginx/conf.d/wp.conf
server {
	listen 80;
	server_name cs.wp.com;
	root /code/wordpress;
	index info.php index.php;
 
	location ~ \.php$ {
		fastcgi_pass   127.0.0.1:9000;
		fastcgi_index  index.php;
		fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
		include fastcgi_params;
		}
}

#告诉PHP,与lb交流使用https协议
echo 'fastcgi_param https on;' >> /etc/nginx/fastcgi_params

2.重载nginx服务
nginx -sreload

3.下载安装包
mkdir /code -p && cd /code && \
wget http://test.driverzeng.com/Nginx_Code/wordpress-5.0.3-zh_CN.tar.gz

4.安装服务
tar xf wordpress-5.0.3-zh_CN.tar.gz && rm -rf wordpress-5.0.3-zh_CN.tar.gz

5.授权
chown -R www.www /code

#不加fastcgi_param https on;浏览器访问所有的服务都会破窗

部署数据库

1.给root一个密码
[root@db01 ~]# mysqladmin -uroot password '1'
2.连接数据库
[root@db01 ~]# mysql -uroot -p1
3.创建用户
MariaDB [(none)]> grant all on *.* to wp_zh@'%' identified by '1';
4.创建数据库
MariaDB [(none)]> create database wp;
MariaDB [(none)]> create database zh;
5.重启数据库
systemctl restart mariadb

域名解析

10.0.0.5 cs.wp.com cs.zh.com cs.pm.com

浏览器访问

 cs.wp.com 		#需要登录ordpress后台,把http改成https
 cs.zh.com 
 cs.pm.com

tdgLUe.md.png

配置web02 web03

1.web01打包安装过的服务
cd / && tar zcf code.tgz code
2.使用scp或者rsync传过去
rsync -avz code.tgz 10.0.0.8:/root
rsync -avz /etc/* 10.0.0.8:/etc
2.web02等服务器解压
tar xf code.tgz -C /
3.重载nginx配置文件#
nginx -sreload

负载均衡模板

[root@lb01 ~]# vim /etc/nginx/conf.d/zh.conf
upstream zh {
    server 10.0.0.7:80;
    server 10.0.0.8:80;
    server 10.0.0.9:80;
}
server {
	listen 80;
	server_name cs.zh.com;
	return 302 https://$server_name$request_uri;
}

server {
        listen 443 ssl;	
        server_name cs.zh.com;
	
	   ssl_certificate   ssl_key_zh/$(date +%Y%m%d)cs.zh.com.crt;
        ssl_certificate_key  ssl_key_zh/$(date +%Y%m%d)cs.zh.com.key;	
        
        ssl_session_cache shared:SSL:10m; #在建立完ssl握手后如果断开连接,在session_timeout时间内再次连接,是不需要再次获取公钥建立握手的,可以服用之前的连接
    	ssl_session_timeout 1440m;  #ssl连接断开后的超时时间
   	 	ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;  #配置加密套接协议
   		 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  #使用TLS版本协议
   		 ssl_prefer_server_ciphers on;  #nginx决定使用哪些协议与浏览器通信

        location / {
                #代理后端的机器
                proxy_pass http://zh;
            	proxy_set_header Host $http_host; 
                include proxy_params;
        }
}

2.写入include文件
vim /etc/nginx/proxy_params
# 客户端的请求头部信息,带着域名来找我,我也带着域名去找下一级(代理机或者代理服务器)
proxy_set_header Host $host;
# 显示客户端的真实ip(和代理的所有IP)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	
#nginx代理与后端服务器连接超时时间(代理连接超时)
proxy_connect_timeout 60s;
#nginx代理等待后端服务器的响应时间
proxy_read_timeout 60s;
	#后端服务器数据回传给nginx代理超时时间
proxy_send_timeout 60s;
	
#nignx会把后端返回的内容先放到缓冲区当中,然后再返回给客户端,边收边传, 不是全部接收完再传给客户端
proxy_buffering on;
#设置nginx代理保存用户头信息的缓冲区大小
proxy_buffer_size 4k;
#proxy_buffer_size 8k;
#proxy_buffers 缓冲区
proxy_buffers 8 4k;
#proxy_buffers 8 8k;
#使用http 1.1协议版本
proxy_http_version 1.1;

#错误页面重定向
proxy_next_upstream error timeout http_500 http_502 http_503 http_504 http_404;

3.告诉PHP,与lb交流使用https协议(#web部署)
echo 'fastcgi_param https on;' >> /etc/nginx/fastcgi_params

4.重载nginx配置文件
nginx -sreload
posted @ 2020-06-03 23:24  看萝卜在飘  阅读(360)  评论(0编辑  收藏  举报