自签证书相关笔记
linux9期架构-宋阳阳-day22
课前回顾
ssl证书,有了ssl网站才能跳转到https
网站http://换成https:// :s#http://#https://#g
ssl证书购买
cdn
HTTP和HTTPS是什么?
我们使用浏览器访问一个网站页面,在浏览器的地址栏中我们会看到一串URL,如图
网站的URL会分为两部分:通信协议和域名地址。
域名地址都很好理解,不同的域名地址表示网站中不同的页面,而通信协议,简单来说就是浏览器和服务器之间沟通的语言。网站中的通信协议一般就是HTTP协议和HTTPS协议。
HTTP协议
HTTP协议是一种使用明文数据传输
的网络协议。一直以来HTTP协议都是最主流
的网页协议,但是不安全
HTTPS协议
HTTPS协议可以理解为HTTP协议的升级,就是在HTTP的基础上增加了数据加密
。在数据进行传输之前,对数据进行加密,然后再发送到服务器。这样,就算数据被第三者所截获,但是由于数据是加密的,所以你的个人信息让然是安全的。这就是HTTP和HTTPS的最大区别。
其实如果你足够细心,你会发现现在很多大型互联网网站,如百度、淘宝、腾讯很早就已经把HTTP换成HTTPS了。
HTTP和HTTPS的其他不同
数据加密传输,是HTTP和HTTPS之间的本质性区别,其实除了这个之外,HTTPS网站和HTTP网站还有其他地方不同。
当你使用Chrome浏览器访问一个HTTP网站的时候,你会发现浏览器会对该HTTP网站显示“不安全”的安全警告,提示用户当前所访问的网站可能会存在风险。
而假如你访问的是一个HTTPS网站时,情况却是完全不一样。你会发现浏览器的地址栏会变成绿色,企业名称会展示在地址栏中,地址栏上面还会出现一把“安全锁”的图标。这些都会给与用户很大的视觉上的安全体验。以下是EV证书
在不同浏览器中的展现。
除了浏览器视觉上不同以外,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模块可以修改某一站点任意内容,所以想要黑一个网站,最重要的是域名劫持,然后绑定到黑客自己的网站
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;
}
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都布置,不太现实
方法二
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
真实业务场景实现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
配置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