V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
luchenqun
V2EX  ›  编程

https 客户端(即浏览器)是如何校验公钥证书合法性的?

  •  
  •   luchenqun · 2017-12-01 15:26:22 +08:00 · 4279 次点击
    这是一个创建于 2568 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在看 https 方面的内容,遇到一个不懂的问题,发帖求助一下:

    在 https 通讯之前,需要经历握手阶段,描述如下:

    第一步,爱丽丝给出协议版本号、一个客户端生成的随机数( Client random ),以及客户端支持的加密方法。

    第二步,鲍勃确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数( Server random )。

    第三步,爱丽丝确认数字证书有效,然后生成一个新的随机数( Premaster secret ),并使用数字证书中的公钥,加密这个随机数,发给鲍勃。

    第四步,鲍勃使用自己的私钥,获取爱丽丝发来的随机数(即 Premaster secret )。

    第五步,爱丽丝和鲍勃根据约定的加密方法,使用前面的三个随机数,生成"对话密钥"( session key ),用来加密接下来的整个对话过程。

    具体可见阮一峰老师博客的文章: http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html

    我的问题是,如果在第二步,我截获了鲍勃给爱丽丝的证书,然后给爱丽丝是我自己的数字证书,但是这个证书也是权威机构签发的,那么,爱丽丝在第三步,如何确认这个数字证书,不是由鲍勃发的?比如现实中的一种情况是,我进行域名劫持,然后我将我的证书发给爱丽丝,然后窃取她的账号密码等。

    7 条回复    2017-12-01 18:33:57 +08:00
    noe132
        1
    noe132  
       2017-12-01 16:29:20 +08:00 via Android
    因为浏览器和系统内置了默认信任的证书。

    如果只劫持了站点返回自己签发的别的证书,证书因为与域名不符会验证失败。证书是没法伪造的,因为你没有证书的私钥。除非用给原证书签名的根证书重新给你签发一个同域名的证书( wosign 不是干过这事,后来怎么样大家都知道了)

    rsa 加密唯一的缺点就是不能防中间人攻击。所以系统和浏览器内置了信任证书。像 ssh 连接第一次会提示指纹一样。你得先信任指纹才能继续操作,指纹发生改变后就会提示你指纹错误。

    你说的方案,在 ssh 的第一次连接时可行的。因为客户并不知道真正的指纹是什么。如果已经连接过一次了再劫持,就会指纹不正确。而浏览器早就有内置的证书,你连第一次连接劫持都做不到。12306 为什么要求大家安装他自颁发的证书,因为他给自己颁发的证书不在默认的信任列表里。
    noe132
        2
    noe132  
       2017-12-01 16:31:05 +08:00 via Android
    如果能把客户劫持到另一个站点,那就不属于 https 的范畴了,通常来说那叫钓鱼网站。如果用户输入了正确的域名还要劫持到钓鱼网站,通常来说这不是「一般人」能做到的。
    shoaly
        3
    shoaly  
       2017-12-01 16:40:53 +08:00
    以你想要劫持 www.baidu.com 为例...
    百度的证书本来是 A 机构颁发的, 比如说你找找 letsencrypt 给 www.baidu.com 发一个假证书, 这一步是行不通的, 每一个证书机构 都义务先判断一下 这个域名是不是你拥有的... 如果他不验证 www.baidu.com 是你的就直接给你发证书, 这就是他傻逼的地方了.. 而 letsencrypt 验证的方法就是 让你在 www.baidu.com 下面放一个他告诉你的 hash 文件之类的, 这一步 你也是做不到的, 你只能劫持到客户的网关, 但是你没办法劫持到 letsencrypt 的网关
    Quaintjade
        4
    Quaintjade  
       2017-12-01 17:03:37 +08:00
    第一步爱丽丝要向鲍勃握手的时候,爱丽丝会把鲍勃的 FQDN(一般是域名)告诉自己的浏览器。
    第二步鲍勃返回证书时,CN(Common Name)字段或者 SAN(Subject Alternative Name)字段包含了鲍勃的 FQDN,爱丽丝的浏览器会检查是否与爱丽丝告诉的一致。

    只有鲍勃才能对自己控制的 FQDN 取得公共 CA 签发的证书,你是签不到的,见#3 楼。
    luchenqun
        5
    luchenqun  
    OP
       2017-12-01 18:13:57 +08:00
    @shoaly @Quaintjade @noe132 你们是说,证书签发机构,是会验证我提交的申请信息吗?比如证书签发机构 A 已经签出了一个 www.baidu.com 的证书,我再以 www.baidu.com 的信息去证书签发结构 B 去签发,B 会拒绝我?我还以为,只要我提交信息,给了 money,证书的签发机构就会签发一个证书给我呢!我就是想的,我以提交同样的信息去 B 机构签发,它会再签发一个给我。那么问题来了,比如 A 机构已经签发了 www.baidu.com ,B 机构是怎么知道 A 机构已经把 www.baidu.com 签出去了?
    tSQghkfhTtQt9mtd
        6
    tSQghkfhTtQt9mtd  
       2017-12-01 18:20:22 +08:00 via Android
    @luchenqun 签发机构是必须验证你是否实际控制这个域名的,所以不需要担心这个问题

    即使万一出了岔子,错误签发了证书,现在的 证书透明度 ( certificate transparency )可以让问题被及时发现,然后签发者会 revoke 掉异常的证书。(沃通就是因为签了太多错误证书被各大浏览器和操作系统取消信任了)
    zn
        7
    zn  
       2017-12-01 18:33:57 +08:00 via iPhone
    @luchenqun 证书颁发机构会验证域名所有权,你得证明域名的所有权在你手里。证明方式一般有几种:

    1. 你往网站根目录放置一个机构提供的特定的文件,然后机构会定时抓取这个文件,如果能抓取到说明你确实有这个网站的管理权限。注意,只支持 80 和 443 端口,8080 登端口不认。
    2. 机构往域名信息里的管理员邮箱发一封验证邮件,邮件里有验证链接,域名管理员要点开链接输入验证码确认。
    3. 要求你在域名 DNS 控制面板里添加一条特定的域名记录。

    以上操作都只有域名管理员或者网站管理员才能做到,避免了他人伪造证书。

    还有一点很重要的:
    如果发现申请的域名包含知名品牌、知名网站域名,证书机构会人工审核,有可能会要求你提供相关证明文件。比如我想申请 www.nikeshop.com 的证书,因为包含 Nike 字样,极有可能会被拒绝。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2839 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:51 · PVG 20:51 · LAX 04:51 · JFK 07:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.