V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
工单节点使用指南
• 请用平和的语言准确描述你所遇到的问题
• 厂商的技术支持和你一样也是有喜怒哀乐的普通人类,尊重是相互的
• 如果是关于 V2EX 本身的问题反馈,请使用 反馈 节点
smileawei
V2EX  ›  全球工单系统

阿里云的这个 SSL 证书认证真是有趣

  •  
  •   smileawei · 2017-03-30 16:59:30 +08:00 · 10461 次点击
    这是一个创建于 2788 天前的主题,其中的信息可能已经有所发展或是发生改变。
    申请阿里云证书的时候。提示框中一段提示:
    CA 公司会优先检查 HTTPS 地址,如果域名开启了 HTTPS 服务,请确保证书是有效且可信机构颁发的,以免无法通过验证。

    一台服务器上已经部署了一个 A 站点的 SSL 证书。这时候需要申请 B 站点的 SSL 证书。使用文件验证的话。按照阿里云 SSL 验证的逻辑,会在我未部署过 B 站点 SSL 证书的情况下访问 https://B 这个时候会拿到 A 站点的 SSL 证书并提示不可信。然后验证需要证书是有效且可信机构颁发。

    这就尴尬了。

    拿不到 DNS 管理权限。就没法通过阿里云申请 SSL 了。
    29 条回复    2020-06-05 11:31:25 +08:00
    RqPS6rhmP3Nyn3Tm
        1
    RqPS6rhmP3Nyn3Tm  
       2017-03-30 17:02:38 +08:00 via iPhone
    把 Nginx 的 listen 443 ssl 删掉试试
    smileawei
        2
    smileawei  
    OP
       2017-03-30 17:04:24 +08:00
    @BXIA 其实直接 ban 掉服务器的 443 就能解决。但是这个检查的逻辑真是有意思。
    RE
        3
    RE  
       2017-03-30 17:15:24 +08:00   ❤️ 1
    这逻辑为啥问题?
    你的 B 站点未部署 SSL 却响应了 A 的 SSL ,那是你服务器配置的问题。
    优先检测 HTTPS 协议是 CA 公司的检测,也不是阿里的检测,何况只是优先检测 HTTPS 而不是不检测 HTTP
    ovear
        4
    ovear  
       2017-03-30 17:37:50 +08:00
    @RE 问题很大啊,如果你的服务器上不止一个网站。
    a.b.com
    b.b.com
    如果这时候 a.b.com 的证书已经颁发并正常使用了
    b.b.com 没有颁发,遇到上面的规则该怎么办
    RE
        5
    RE  
       2017-03-30 17:42:21 +08:00
    @ovear
    奇了怪了,这有啥问题?
    如果原先的 a.b.com 的证书仅仅颁发给 a.b.com ,那就不应该响应给 b.b.com
    如果是颁发给 *.b.com 的那就算响应给 b.b.com 也不会出现楼主说的 SSL 不正确的问题, HTTPS 照样可以访问啊。

    b.b.com 看作一个独立网站的话(本来就是独立网站)该怎么配置 SSL 本来就不应该和服务器上另一个网站冲突,即便有 100 个站点也可以区分开,这跟服务器已经有多少个网站、域名有多少个子域都没关系。
    RE
        6
    RE  
       2017-03-30 17:43:33 +08:00
    @ovear 既然 b.b.com 还没证书,自己非要监听 443 端口监听 https 协议,怪阿里云?怪 CA ?
    kn007
        7
    kn007  
       2017-03-30 17:46:49 +08:00
    这看起来没毛病啊。。符合逻辑。。。
    ovear
        8
    ovear  
       2017-03-30 18:33:53 +08:00
    @RE 你是不是没有搞清楚 端口和 Host 的区别。
    对于一个 virtual host ,只要服务器上监听了 443 ,就会可以有响应。响应完毕之后( SSL 握手结束)才有所谓的 HOST 头( HTTP 协议)
    阿里云这条规则肯定对应的 SNI 没有出现前,一个独立 IP 只能对应一个 SSL 证书。

    那么请问一件事,谁规定了 a.a.com 一定要跟 b.b.com 两个 IP 放,我使用 SNI 的话,就不能避免在 http 服务器找不到对应的 vhost 的时候返回一个默认证书为了保证 443 正常回复数据。

    我觉得你还不要忙着喷我,自己想一想自己说的话。如果有解决方法欢迎给出。
    至于 A 网站和 B 网站分开两个 IP 放,这种话就不要说了。。
    RE
        9
    RE  
       2017-03-30 18:40:13 +08:00
    @ovear 笑死我了,还能扯那么多,我自己的 VPS 就一个 IP 地址,十多个域名,七八个有 SSL ,其它的没有就响应 80 端口就行了,你真的搞懂 nginx / apache / iis 的配置了么???????
    just1
        10
    just1  
       2017-03-30 18:40:18 +08:00 via Android   ❤️ 1
    明明是 443 端口 default_server 的问题。。。
    RE
        11
    RE  
       2017-03-30 18:47:58 +08:00
    @ovear

    真正要好好想想自己说的话的人是你,来,给你科普一下。

    只要开放了 80 / 443 端口的访问,并且建立了 HTTP 服务,不管是基于 APACHE / NGINX 还是 IIS ,就有一个“默认网站”的概念,说的简单点,就是直接访问 IP 地址的时候,响应的网站。

    如果你给 default 站点配置了 a.b.com 证书,那服务器上的其它站点只要是没有 SSL 的、却以 https 访问,就会响应 a.b.com 的证书,例如你访问了 b.b.comb.b.com 却没配置自己的 SSL 同时又监听了 443 端口。

    你要解决方案?

    解决方案就是 default 不应该放任何网站。

    既然你知道 virtual host 那就多建立一个 a.b.com 的站点配置,而 b.b.com 是另一个配置,以此类推。

    ------

    反过来说,即便不是阿里云,即便不是 CA 的规则,也要确保用浏览器能正确访问,才是硬道理。如果你给 b.b.com 响应了 a.b.com 的证书,浏览器访问也照样出错。
    ovear
        12
    ovear  
       2017-03-30 18:56:23 +08:00   ❤️ 5
    @RE 年轻人脾气不要这么差,小心以后出去吃大亏。。

    另外你还是仔细看下我下面说的内容吧,没准可以帮到你。

    端口和协议所在的层级都不一样,

    我顺便详细说明下吧,可能我的表达也不是很清楚

    首先科普下上面为什么说 端口 和 协议 是不同层级。
    首先,端口是承载信息传递的一个通道,而 协议 是传输信息的一个规范。
    通俗点比喻就是,你用 QQ 跟别人聊天,双方用的是英语,还是法语还是中文。
    QQ 就可以类比为端口,使用的语言就可以比喻成协议

    对于一个 IP ,只要监听了端口,那么就可以传输数据,比如说之前 https://www.v2ex.com/t/348752 说的, 80 端口也可以传输非 HTTP 数据。
    好了,前提结束。

    我的假设是,服务器支持 SNI ,且已经有线上的业务、域名有有效证书,能提供正常的 HTTPS 服务,那么此时 443 端口是通的,且能正常服务的(标准 HTTPS 协议)。
    那么对于原始 HTTPS 协议,也就是 HTTP over SSL/TLS ,此时的服务端是无脑返回设置的证书,也就是 a.a.com 的证书,此时不存在一个 IP 对应多个 HTTPS 证书。所以也就可以做到 @RE 所说的不监听 443 端口。

    但是问题在于,现在 SNI 出现了,在 TLS 加密握手之前,会传输一个 common name ,也就是所谓的 host name 。然后服务端根据 host 来确定返回哪个证书。这时候, IP 和证书的关系就变成了 一对多 关系。
    所以阿里的这个规则就有问题了,也就是 @just1 说的 default_server 的问题。

    我们这个场景, a.a.com 是正常服务的,说明服务端已经监听了 443 端口。而此时通过 443 端口访问 b.b.com 的时候,服务端会因为找不到该 common name 对应的证书,从而返回默认证书。
    这个根据不同的服务端不同,比如说 Apache2.0 时代是按照 Host name 排序,返回第一个 Host 。而 Apache2.2/2.4 Nginx 以及衍生发行版,则是采用载入配置的第一个 host 最为默认的 default server 。


    所以这时候问题就产生了,因为服务器返回了一个不是 b.b.com 的有效证书(包括 common name 不匹配 和 证书不受信任)。

    我想说的是这么个问题。

    至于对于某位同学,我是觉得,如果有解决方法不妨分享出来,没必要搞针对攻击。大家都是在讨论这个问题而已。
    ovear
        13
    ovear  
       2017-03-30 19:02:17 +08:00
    @RE 麻烦参考上面回答下列问题

    1 、 default server 是怎么决定的
    2 、 HTTPS 、 HTTP 、 STL 之间的关系
    3 、 HTTPS 的握手过程大概有几个步骤
    4 、网站没有内容就能阻断 HTTPS 握手了么?
    rrfeng
        14
    rrfeng  
       2017-03-30 19:02:58 +08:00   ❤️ 2
    看到这个讨论我想到一个问题:

    server 段的 listen 443 其实是全局的,只要一个 virtual host 开启了 443 ,那么这个服务器就会响应 ssl 连接。
    1. 不支持 SNI 的情况下,直接返回某个证书(不能判断域名)
    2. 支持 SNI 的情况下,如果某个域名没有配置证书,那么也会返回另一个域名的证书

    感觉无解
    RE
        15
    RE  
       2017-03-30 19:54:15 +08:00
    @ovear 看到 14 楼 @rrfeng 说的后恍然大悟,并不能因为某个 virtual host 没有启用 https 而断了通过 443 而来的请求,而只要有请求进来总会返回某个证书。

    感谢!
    RE
        16
    RE  
       2017-03-30 19:57:08 +08:00
    @ovear 这么说的话,如果 CA 只检测 https 的链接,证书不符也就不去检测 http 的,那逻辑确实有问题了。除非把域名临时指向一个没有配置任何证书的服务器上。
    bin456789
        17
    bin456789  
       2017-03-30 20:32:58 +08:00
    看到各位的回答真是高端

    不过我觉得这事很简单
    就是 ca 模拟正常的浏览器下载那个文件,能下载而且文件内容也匹配就通过验证
    不就这么简单?
    RE
        18
    RE  
       2017-03-30 21:02:53 +08:00
    @bin456789 问题在于 CA 首先访问的是 https 的地址,例如:

    https://http://www.example.com/.wellknown/pki-validation/fileauth.txt

    但一般情况下,要申请的域名是没有 SSL 证书的,所以上面这个地址并不能正确响应,如果用浏览器访问会提示证书错误。然后 CA 就认为是内容不符合,验证无法通过。

    只能是关闭这台服务器的所有 443 端口, CA 发现 https 无法访问的时候才会去访问 http 的地址。

    无法访问 ≠ 证书不正确。
    RE
        19
    RE  
       2017-03-30 21:03:22 +08:00
    @bin456789 上面手误多复制了一个 http://
    bin456789
        20
    bin456789  
       2017-03-30 21:44:47 +08:00
    @RE
    先套个 Let's Encrypt 之类的证书就行了嘛
    或者换个验证方式,不是应该有 cname txt 之类的验证吗?

    阿里云的规矩就只有 https 可信这一条
    虽然这个规矩好像是有点问题,但是解决的方法有很多
    但是又不愿先搞个 Let's Encrypt ,又不愿关闭 443 ,又不能动 dns ,这不是自己捉虫吗?
    yangqi
        21
    yangqi  
       2017-03-30 22:00:05 +08:00
    你 B 站还没 ssl 证书,就不应该开 https 端口,如果已有 https ,要保证 ssl 正确。规则都说的很清楚了,并没有问题啊。楼主真是有趣+尴尬
    UnisandK
        22
    UnisandK  
       2017-03-30 22:48:32 +08:00
    好像很多人没有意识到不是每个公司都是一个子域名一台服务器这么阔绰,也不是每一个公司配置 SSL 的人都刚好也管理着公司的域名,觉得把 443 关了就行的是真不怕被老板砍死

    给 12 楼点个赞,有些同学带攻击性的性格该改改了
    yangqi
        23
    yangqi  
       2017-03-30 23:36:51 +08:00
    @UnisandK 说这话的你们会不会配置服务器啊?多个域名一台服务器完全不是问题啊,本来就不应该出现访问一个域名而跳到另外一个不相关站点的情况啊,你们公司都没有运维的么?
    UnisandK
        24
    UnisandK  
       2017-03-30 23:41:38 +08:00
    @yangqi 建议再回去看一下 8 楼

    V 站现在的用户质量是当真不行, 23 楼说越无知越自信一点错没有
    vizards
        25
    vizards  
       2017-03-30 23:56:05 +08:00 via iPhone
    在 AlphaSSL 申请免费泛域名证书的时候也遇到了这个问题...但是它还不像阿里云一样有提示,跟支持人员沟通了了十几封邮件,最后偶然把原来无效的证书撤了才明白过来...
    hanqi7012
        26
    hanqi7012  
       2017-03-31 00:24:45 +08:00 via Android
    所以

    你丫管我那么多

    要不就直接优先 80 端口要不就别介意证书的合法性

    去你家申请证书肯定是有需求的唉
    smileawei
        27
    smileawei  
    OP
       2017-03-31 07:41:16 +08:00 via iPhone
    @bin456789 这里只是讨论这个验证逻辑的不合理性,迂回的解决方案肯定是有,但是生产环境不适合暂停其它站 ssl 这个方案,先给 B 站点申请 LE 证书再申请阿里云提供的证书,我何不直接使用 LE 的证书。
    flyfishcn
        28
    flyfishcn  
       2017-03-31 11:44:27 +08:00
    @yangqi 所以租个虚拟主机,我为了给我的站点上 SSL ,要求主机商把其他站的 443 全关了?你觉得提这种要求会不会想招人砍?
    JavaIO
        29
    JavaIO  
       2020-06-05 11:31:25 +08:00
    楼上的大神讲解的非常详细了。给大家一个最新的阿里云和腾讯云优惠活动及代金券领取地址:leffz.com
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1044 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 19:36 · PVG 03:36 · LAX 11:36 · JFK 14:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.