HTTPS认证原理

250 阅读5分钟

HTTP/HTTPS协议

超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,HTTP是万维网的数据通信的基础。

HTTP_Request.png

请求信息包括:请求行、请求头、空行还有其他消息体

image-20190605153501839.png

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握手过程:

1506390796205179.png

如何配置HTTPS

  1. Let's Encrypt组织介绍

image-20190605160738126.png

  1. acme来自动化申请

    github.com/Neilpang/ac…

    前提:需要域名

前置条件:

  1. 域名, 配置DNS解析,支持列表见下方

    github.com/Neilpang/ac…

  2. 公网IP的服务器(可选)

  3. 安装nginx, acme.sh

配置过程:

  1. 安装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
    
  2. 两种方式,激活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
      
  3. 配置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;
    
  4. 对网站的SSL进行检验

    推荐:ssllabs.com/ssltest/ana…

  5. 其他需要注意的地方:

    • 域名备案
    • 防火墙