- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
HTTP/HTTPS协议
超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,HTTP是万维网的数据通信的基础。
请求信息包括:请求行、请求头、空行还有其他消息体
HTTP的特点:
-
客户端&服务端
-
简单(路径+方法+传递的类型)
客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
-
灵活
HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
-
无连接
无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
-
无状态有会话
HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
注意,HTTP本质是无状态的,使用Cookies可以创建有状态的会话。
HTTP 的不足之处
- 通信内容使用明文——内容可能被窃听
- 不验证通信方的身份——可能遭遇伪装
- 无法验证报文的完整性——报文有可能已遭篡改
HTTPS协议:
超文本传输安全协议(英语:HyperText Transfer Protocol Secure,缩写:HTTPS;常称为HTTP over TLS、HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。这个协议由网景公司(Netscape)在1994年首次提出,随后扩展到互联网上。
主要作用:在不安全的网络上创建一个安全信道。
HTTPS认证原理
认证方式:数字证书
认证机构:数字证书认证机构(Certificate Authority CA),EV SSL(Extended Validation SSL Certificate)证书,OpenSSL自认证。
证书信任方式:
- 操作系统和浏览器内置
- 证书颁发机构
- 手动指定证书
SSL握手过程:
如何配置HTTPS
-
Let's Encrypt组织介绍
-
acme来自动化申请
前提:需要域名
前置条件:
-
域名, 配置DNS解析,支持列表见下方
-
有公网IP的服务器(可选)
-
安装nginx, acme.sh
配置过程:
-
安装nginx与acme.sh
安装很简单, 一个命令:
curl https://get.acme.sh | sh
普通用户和 root 用户都可以安装使用. 安装过程进行了以下几步:
把 acme.sh 安装到你的 home 目录下:
~/.acme.sh/
并创建 一个 bash 的 alias, 方便你的使用:
alias acme.sh=~/.acme.sh/acme.sh
自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书
使用
source
命令,使上面的安装生效source ~/.bashrc
-
两种方式,激活SSL证书(推荐DNS)
-
http 方式
需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了
acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.
如果你用的 apache服务器, acme.sh 还可以智能的从 apache的配置中自动完成验证, 你不需要指定网站根目录:
acme.sh --issue -d mydomain.com --apache
如果你用的 nginx服务器, 或者反代, acme.sh 还可以智能的从 nginx的配置中自动完成验证, 你不需要指定网站根目录:
acme.sh --issue -d mydomain.com --nginx
-
dns 方式(推荐)
在域名上添加一条 txt 解析记录, 验证域名所有权。
这种方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证. 坏处是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。
acme.sh --issue --dns -d mydomain.com
然后, acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.
等待解析完成之后, 重新生成证书:
acme.sh --renew -d mydomain.com
注意第二次这里用的是
--renew
dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证.
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成.
以 dnspod 为例, 你需要先登录到 dnspod 账号, 生成你的 api id 和 api key, 都是免费的. 然后:
export DP_Id="1234" export DP_Key="sADDsdasdgdsf" acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com
证书就会自动生成了. 这里给出的 api id 和 api key 会被自动记录下来, 将来你在使用 dnspod api 的时候, 就不需要再次指定了. 直接生成就好了:
acme.sh --issue -d mydomain2.com --dns dns_dp
-
-
配置nginx配置,设置定时任务
生成dhparam.pem
$ openssl dhparam -out dhparam.pem 2048
nginx中正确的使用方法是使用
--installcert
命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:acme.sh --installcert -d <domain>.com \ --key-file /etc/nginx/ssl/<domain>.key \ --fullchain-file /etc/nginx/ssl/fullchain.cer \ --reloadcmd "service nginx force-reload"
配置文件:
# server部分 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; ssl on; ssl_certificate /etc/nginx/ssl/fullchain.cer; ssl_certificate_key /etc/nginx/ssl/<domain>.key; # ssl_dhparam ssl_dhparam /etc/nginx/ssl/dhparam.pem;
-
对网站的SSL进行检验
-
其他需要注意的地方:
- 域名备案
- 防火墙