引言
HTTP是过去很长一段时间我们经常用到的一种传输协议。HTTP协议传输的数据都是未加密的,这就意味着用户填写的密码、账号、交易记录等机密信息都是明文,随时可能被泄露、窃取、篡改,从而被黑客加以利用,因此使用HTTP协议传输隐私信息非常不安全。
HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,要比 HTTP 协议安全,可防止数据在传输过程中被窃取、改变,确保数据的完整性。
根据证书颁发机构(CA)安全委员会的一项研究表名,只有2%的客户会继续浏览一个 “不受信任链接” 的网站,SSL可以防止这些错误造成的客户流失
百度百科:以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL/TLS 层,HTTPS 的安全基础是 SSL/TLS,因此加密的详细内容就需要 SSL/TLS。
阿里云 :SSL证书就是遵守SSL安全套接层协议的服务器数字证书,而SSL安全协议最初是由美国网景Netscape Communication公司设计开发,全称为安全套接层协议(Secure Sockets Layer)。SSL证书指定了在应用程序协议(如HTTP、Telnet、FTP)和TCP/IP之间提供数据安全性分层的机制。它是在传输通信协议(TCP/IP)上实现的一种安全协议,采用公开密钥技术,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证。由于此协议很好地解决了互联网明文传输的不安全问题,很快得到了业界的支持,并已经成为国际标准。
SSL证书由浏览器中受信任的根证书颁发机构在验证服务器身份后颁发,具有网站身份验证和加密传输双重功能。
HTTPS的哲学三连
是什么:HTTP + SSL/TLS = HTTPS, 即HTTPS是HTTP的安全版
为什么:很简单,因为你的HTTP是明文传输 不安全,数据容易被窃取,所以需要HTTPS ,HTTPS实现高强度双向加密传输,防止传输数据被泄露或篡改
怎么用:
HTTPS的工作原理
- 客户端通过发送Client Hello报文开始SSL通信。报文中包含客户端支持的SSL的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密匙长度等);
- 服务器可进行SSL通信时,会以Server Hello报文作为应答。和客户端一样,在报文中包含SSL版本以及加密组件。服务器的加密组件内容时从接收到的客户端加密组件内筛选出来的;
- 服务器发送证书报文。报文中包含公开密匙证书;
- 最后服务器发送Server Hello Done报文通知客户端,最初阶段的SSL握手协商部分结束;
- SSL第一次握手结束之后,客户端以Client Key Exchange报文作为回应。报文包含通信加密中使用的一种被称为Pre-master secret的随机密码串。该报文已用步骤3中的公开密匙进行加密;
- 接着客户端继续发送Change Cipher Spec报文。该报文会提示服务器,在此报文之后的通信会采用Pre-master secret密匙加密;
- 客户端发送Finished报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准;
- 服务器同样发送Change Cipher Spec报文;
- 服务器同样发送Finished报文;
- 服务器和客户端的Finished报文交换完毕之后,SSL连接就算建立完成。当然,通信会收到SSL的保护。从此处开始进行应用层协议的通信,即发送HTTP请求;
- 应用层协议通信,即发送HTTP相应;
- 最后由客户端断开连接。断开连接时,发送close_notify报文。上图做了一些省略,这步之后再发送TCP FIN报文来关闭与TCP的通信。
HTTPS的获取渠道与部署方式(Nginx为例)
CA 自签
腾讯云
个人推荐 Let's Encrypt 与 阿里云,获取方式大都是千篇一律,并且网上教程众多,远比我方式简单,操作优秀。
- 阿里云的获取方式
购买之后会在SSL证书控制台产生一个未申请的证书
点击申请填写相应的域名 大约2~5个小时可申请下来 当然 你填的真实的话
验证成功之后会在域名控制台生成一个DNS解析值
域名控制台:解析设置
继续回到SSL证书控制台,开始部署,可点击相应的SSL一站式服务,或DNS域名解析自动部署,本章选择下载证书导入至服务器进行Nginx代理部署,当然,你可以选择对应的容器方式,如:Tomcat Apache等
下载之后改名放到自创建的文件夹,配置Nginx的配置文件,如果是手动安装的Nginx 配置文件在nginx/conf/nginx.conf,docker的话是你自己选择的挂载位置
查看你的Nginx是否开启了SSL模块
/usr/local/nginx/sbin/nginx -V
若没有开启:参考这篇文章 https://www.cnblogs.com/zhizou/p/11295562.html
Nginx配置文件开启SSL
# 操作 nginx 的用户 不能是root 不然有安全风险
user nobody;
# nginx的进程数量 建议设置为等于CPU总核心数
worker_processes 1;
# 全局错误日志定义类型
# 日志级别分为: debug info notice warn error crit
error_log /usr/local/nginx/logs/error.log debug;
# 进程文件 会默认的生产一个同log平级的目录中
# pid /var/run/nginx.pid;
# 工作模式与连接数上限
events {
# 参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ];
# epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型.
# 查看系统版本:cat /proc/version
#use epoll;
# 网络连接序列化 防止惊群现象 (惊群:多个睡眠的进程被同时叫醒,但只有一个进程能获得链接,这样会影响系统性能)
accept_mutex on;
# 是否允许同时接受多个网络连接 默认为off
multi_accept on;
# 单个进程最大连接数(最大连接数=连接数*进程数)
worker_connections 1024;
}
http {
# 文件扩展名与文件类型映射表
include mime.types;
# 默认文件类型
default_type application/octet-stream;
# Nginx服务的Banner隐藏状态
server_tokens off;
# 开启错误页面
fastcgi_intercept_errors on;
# 隐藏Nginx后端服务X-Powered-By头
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
# 默认编码 放置区域不同效果不同 此处默认HTTP所有体
charset utf-8;
# 防止网络阻塞
tcp_nopush on;
# 防止网络阻塞
tcp_nodelay on;
# 服务器名字的hash表大小
# server_names_hash_bucket_size 128;
# 自定义HTTP体内所有记录的日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 设置客户端连接保持活动的超时时间,在超过这个时间后服务器会关闭该链接
keepalive_timeout 60;
# 动态代理
server {
listen 80;
# 此域名为动态服务器专用域名
server_name www.baidu.com;
# HTTP 强制跳转 HTTPS
rewrite ^(.*) https://$server_name$1 permanent;
}
# HTTPS serverlocalhost
server {
listen 443 ssl;
server_name www.baidu.com;
ssl on;
# 配置域名证书
ssl_certificate /usr/local/nginx/security/security.pem;
ssl_certificate_key /usr/local/nginx/security/security.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
# Nginx SSL协议的加密策略进行加固
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
# 动态主机访问监控记录
access_log /usr/local/nginx/logs/server/ssl/access.log main;
error_log /usr/local/nginx/logs/server/ssl/error.log debug;
# 上传文件大小限制 (头)(请求头的大小)
# 查看系统分页大小:getconf PAGESIZE
client_header_buffer_size 128k;
# 上传文件大小限制 (体)(请求体内的大小)
client_body_buffer_size 512m;
# 请求报文大小
client_max_body_size 512m;
# Rabbitmq 之 WEb-SOCKET 接口配置代理
location / {
# websocket配置跨域文件
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 请求路径变更为上面的权重配置
proxy_pass you project main;
}
}
}
此后,进入到 nginx/sbin目录 ./nginx -t 测试文件是否正常
[root@rfbl sbin]# ./nginx -t
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
[root@rfbl sbin]# ./nginx -s reload
[root@rfbl sbin]#
如果你开启了firewall 安全访问模块 需要添加开放端口:
[root@rfbl sbin]# firewall-cmd --zone=public --add-port=443/tcp --premanent
[root@rfbl sbin]# firewall-cmd --reload
阿里云服务器开启443端口
至此 你可以看到
- 自签 CA
自签CA需要 OpenSSL 支持
OpenSSL 安装方式:sudo yum install openssl-devel
私钥 公钥
//服务器端
//私钥
openssl genrsa -out security.key 1024
//公钥
openssl rsa -in security.key -pubout -out security.pem
CA 私钥
//CA 私钥
openssl genrsa -out ca.key 1024
openssl req -new -key ca.key -out ca.csr
上面命令会出现以下需要填写的项目,可以直接回车跳过,但是Common Name那一项建议填写你的域名,如果是本地的话,可以写localhost
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:域名
Email Address []:邮箱
生成CA 证书
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
生成服务器证书
//服务器端需要向 CA 机构申请签名证书,在申请签名证书之前依然是创建自己的 CSR 文件
openssl req -new -key security.key -out security.csr
//向自己的 CA 机构申请证书,签名过程需要 CA 的证书和私钥参与,最终颁发一个带有 CA 签名的证书
openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in security.csr -out security.crt
生成cer文件
//使用openssl 进行转换
openssl x509 -in security.crt -out security.cer -outform der
配置nginx 我们拿到CA签发的这个证书后,需要将证书配置在nginx中。 首先,我们将security.crt和security.key拷贝到nginx的security目录中,配置方式如阿里云相同
这两个改一下
# 配置域名证书
ssl_certificate /usr/local/nginx/security/security.crt;
ssl_certificate_key /usr/local/nginx/security/security.key;
结束语
在越来越重视信息安全的今天,HTTPS协议站点无疑已经成为主流。就目前形势而言,以下网站必须启用HTTPS协议加密:
- 电商平台及其相关支付系统网站
- 银行系统、金融机构等高私密性网站
- 政府、高校、科研机构及其相关网站
- 以搜索引擎为主要流量来源的网站
- 以邮箱为主的企业交流平台
长远来看,HTTPS协议网站已是必然趋势。启用HTTPS协议加密是当今网站建设的关键要点。不仅局限于上述网站类型,启用HTTPS协议加密既是网站安全的必然需要,也是公司发展的提前布局。
参考文献
【1】https://www.cnblogs.com/surplus/p/11423201.html
【2】https://drcloud.aliyun.com/home
【3】http://www.52im.net/thread-1890-1-1.html
【4】https://www.cnblogs.com/awkflf11/p/12942559.html
友情链接
HTTPS的加密原理:https://www.cnblogs.com/awkflf11/p/12942559.html
HTTPS的传输协议及其加密原理分析:https://blog.youkuaiyun.com/qq_20597727/article/details/80849031
HTTPS的对称加密:https://www.jb51.net/hack/191962.html