zoukankan      html  css  js  c++  java
  • HTTPS(二)证书合法性校验

    在客户端与服务端的连接过程中,服务端会把证书发给客户端,客户端需要基于CA认证体系对证书的合法性进行验证
    一、 权威认证机构
    1、在CA认证体系中,所有的证书都是由权威机构来颁发
    2、CA根证书的来源有两种,一种是操作系统中内置的的,另外一种就是浏览器自带的
    windows在可以在运行->certmgr.msc

    二、 证书验证过程
    1、服务方向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证;
    2、CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
    3、如信息审核通过,CA会向申请者签发认证文件-证书。
    1)证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名;
    2)签名的产生算法:
    首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用CA的私钥对信息摘要进行加密,密文即签名;
    4、客户端向服务端发出请求时,服务端返回证书文件;
    5、客户端读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;
    6、客户端验证证书相关的域名信息、有效时间等信息;
    7、客户端会内置信任CA的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA的证书,证书也会被判定非法。

    在这个过程注意几点:
    1、申请证书不需要提供私钥,确保私钥永远只能服务器掌握;
    2、证书的合法性仍然依赖于非对称加密算法,证书主要是增加了服务器信息以及签名;
    3、内置CA对应的证书称为根证书
    4、证书=公钥(服务方生成密码对中的公钥)+申请者与颁发者信息+签名(用CA机构生成的密码对的私钥进行签名);

    三、中间证书
    如果服务方的证书不是直接向根证书颁发机构申请的,而是向根证书颁发机构的授权机构申请的,此时的证书验证,就是由下往上逐级进行验证。
    如下是baidu服务器返回的证书,可以看到www.baidu.com的证书是由GlobalSign G2签发的,而GlobalSign G2是由GlobalSign Root(根证书)签发的。
    即baidu的证书合法性由GlobalSign G2保证,而GlobalSign G2由GlobalSign Root保证其合法性,如果GlobalSign G2是合法的,那么baidu的证书就是合法的。

     抓包分析,在Cerfiticate阶段,发送了两个证书,一个baidu.com的证书,一个GlobalSign G2的证书

     一个证书包括待签名证书内容,签名算法,证书签名

     客户端读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;

     证书GlobalSign G2的签发CA是根CA,使用系统内置的根证书进行认证。

    四、 证书链的缺失
    有些情况下,我们使用不同的浏览器去访问相同的域名,可能会出现某些浏览器显示该域名可信,某些浏览器显示不可信,那有可能就是证书链不完整导致的,也就是中间证书缺失。
    现代的浏览器都有证书自动下载的功能,但很多浏览器在安装后是使用系统内置的证书库,如果你缺失的那张CA证书,在系统的内置证书库中不存在的话,即使你的证书确实是可信的,但依旧会显示成不可信,只有等到浏览器自动把缺失的那张CA证书从网上下载下来之后,访问该网站才会显示成可信状态。
    有一些版本安卓设备的应用不会自动下载补全正式,导致显示不可信,那么我们可以手动将证书链补全,然后更新服务端的证书,这样设备下载证书的时候,就是完整的证书链,就不会出现不可信的状态。
    https://myssl.com/chain_download.html 此网站提供证书链补全的功能

    五、 申请免费的证书
    Let's Encrypt 可以提供免费的证书申请,但是需要每三个月进行一次续签
    1、安装acme

    git clone https://github.com/Neilpang/acme.sh.git 
    cd acme.sh/ 
    ./acme.sh --install 
    安装后自动设置定时任务 定时任务会在每天0点47分调用acme.sh程序,以检查证实是否过期,是否需要续签等
     # crontab -l 47 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

    2、设置阿里DNS子账号
    由于需要使用阿里dns进行验证,所以可以设置子账号
    创建阿里云dns子账户,获取子账号的key和secret

    export Ali_Key="xxxxxxxxxxxx"
    export Ali_Secret="xxxxxxxxxxx"
    /root/.acme.sh/acme.sh --issue -d tenserpay.xyz -d *.tenserpay.xyz --dns dns_ali --keylength ec-256 --ecc --log --force
    执行后,这些信息会记录在相关目录中,后续的执行将自动执行
    参数:
    –issue:签发,
    --dns dns_ali:指明使用“dns_ali”作为验证方式
    -d:指定证书中的域名
    
    # ll /root/.acme.sh/tenserpay.xyz_ecc/
    total 28
    -rw-r--r-- 1 root root 1648 Oct 14 09:33 ca.cer   # Let’s Encrypt的中级证书
    -rw-r--r-- 1 root root 3303 Oct 14 09:33 fullchain.cer # 包含中级证书的域名证书
    -rw-r--r-- 1 root root 1655 Oct 14 09:33 tenserpay.xyz.cer # 无中级证书的域名证书
    -rw-r--r-- 1 root root  630 Oct 14 09:33 tenserpay.xyz.conf # 该域名的配置文件
    -rw-r--r-- 1 root root  460 Oct 14 09:32 tenserpay.xyz.csr # 该域名的CSR证书请求文件
    -rw-r--r-- 1 root root  228 Oct 14 09:32 tenserpay.xyz.csr.conf # 该域名的CSR请求文件的配置文件
    -rw-r--r-- 1 root root  302 Oct 14 09:32 tenserpay.xyz.key # 该域名证书的私钥
  • 相关阅读:
    第二百一十五节,jQuery EasyUI,DateBox(日期输入框)组件
    第二百一十四节,jQuery EasyUI,Calendar(日历)组件
    onethink 系统函数中 生成随机加密key
    本地开发 localhost链接数据库比127.0.0.1慢
    仿写thinkphp的I方法
    判断数组中有没有某个键 isset 和 array_key_exists 的效率比较
    jquery实时监听某个文本框的输入事件
    js数组去重
    thinkphp3.2.3 版本使用redis缓存的时候无法使用认证
    javascript中使用md5函数
  • 原文地址:https://www.cnblogs.com/guoxianqi2020/p/13814920.html
Copyright © 2011-2022 走看看