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

使用 letsencrypt 将网站弄成 https 的之后,如何做双向的 ssl 认证

  •  
  •   KoleHank · 2016-11-08 10:01:55 +08:00 · 7935 次点击
    这是一个创建于 2968 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 letsencrypt 申请了一个免费的 ssl 证书,部署到网站上了,目前 https 访问正常,但是想进一步弄个 ssl 的双向认证,该如何处理?

    ssl 双向认证的话客户端肯定是需要证书的,如果服务器证书使用 letsencrypt 的话,我没搞明白这个客户端证书由谁生成,怎么生成。

    21 条回复    2016-11-09 02:17:59 +08:00
    RecursiveG
        1
    RecursiveG  
       2016-11-08 10:14:36 +08:00   ❤️ 1
    AlphaTr
        2
    AlphaTr  
       2016-11-08 10:43:03 +08:00
    letsencrypt 生成的是一对证书,公钥和私钥,公钥会在访问网站的时候发送到客户端,至于公钥发送到客户端这部分安全是由证书链的父级来签名的,再往上追溯,就是根证书了,根证书在操作系统安装的时候会内置到系统内;整个体系不是几句话能说清楚的,建议了解下整个非对称密码加密体系~
    KoleHank
        3
    KoleHank  
    OP
       2016-11-08 10:43:16 +08:00
    @RecursiveG 这个自己给自己签与 letsencrypt 申请的证书没有关系是么?我知道自己给自己签的时候,服务器端那边使用的也是自己生成的证书,然后客户端也导入自己生成的证书,这种方式我是知道。这种方式放公网访问的话不合适的吧,不会出现证书不可信的问题么
    ooxxcc
        4
    ooxxcc  
       2016-11-08 10:47:07 +08:00   ❤️ 2
    客户端用 letsencrypt ca 验证服务器证书

    服务器用自签 CA 验证客户端证书

    这是两个分别的过程,两个不同的证书链
    KoleHank
        5
    KoleHank  
    OP
       2016-11-08 10:50:52 +08:00
    @AlphaTr 整个体系确实是比较复杂,发帖之前看了半天的。感觉上我服务器端要使用 letsencrypt 的证书的话,做 ssl 双向认证,客户端得使用 letsencrypt 的父级来颁发证书才行,但是这个过程又不知道如何处理。不知道理解的对不对··
    hhbcarl
        6
    hhbcarl  
       2016-11-08 10:54:52 +08:00   ❤️ 2
    KoleHank
        7
    KoleHank  
    OP
       2016-11-08 10:55:05 +08:00
    @ooxxcc 这样可以么?我去试一下看看
    KoleHank
        8
    KoleHank  
    OP
       2016-11-08 10:56:04 +08:00
    @hhbcarl 多谢,我去看看
    Tink
        9
    Tink  
       2016-11-08 11:12:53 +08:00
    学习了, 这个用来配合 ttyd 什么的应该更安全了
    tinyproxy
        10
    tinyproxy  
       2016-11-08 11:49:20 +08:00
    http://nategood.com/client-side-certificate-authentication-in-ngi

    1. 服务端证书是给客户端校验服务端是否合法的
    2. 客户端证书是给服务器娇艳客户是否合法的
    3. 所以,自己拿 easyrsa 弄一个 PKI ,签个 ca 证书给服务器就行了,客户端这边在用自己的 PKI 签客户端证书就行了,当然有钱买个 PKI 服务也是不错的。
    vibbow
        11
    vibbow  
       2016-11-08 11:55:26 +08:00
    https://blog.vsean.net/post/194
    IIS 直接有选项开启就行了
    lslqtz
        12
    lslqtz  
       2016-11-08 11:57:20 +08:00
    部分 CA 提供免费的客户端证书,配合一起用可以,比如沃通和 StartSSL ,但是这两家快被吊销了。。。。
    RqPS6rhmP3Nyn3Tm
        13
    RqPS6rhmP3Nyn3Tm  
       2016-11-08 13:40:05 +08:00 via iPhone
    我选择 GPG ……
    lslqtz
        14
    lslqtz  
       2016-11-08 13:47:13 +08:00
    最近想了想,要做双向证书的登录验证,可以将一个自签根证书放在 web 服务端的信任双向认证 CA 列表。
    然后用一个没有验证的域名,在注册后签发证书下载安装。
    登录时由客户端访问一个指定的域名,这个指定的域名需要双向的验证,验证通过后返回个 Cookie 什么之类的就 ok
    ryd994
        15
    ryd994  
       2016-11-08 14:11:40 +08:00
    客户端的 CA 和服务端的 CA 不需要相同
    只要对方接受就可以
    比如 Nginx 可以用 ssl_client_certificate 来指定信任得 client CA
    http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_client_certificate
    kkzxak47
        16
    kkzxak47  
       2016-11-08 16:49:47 +08:00
    matsuz
        17
    matsuz  
       2016-11-08 17:02:39 +08:00   ❤️ 1
    双向认证其实就是你的电脑验证服务器的证书,服务器验证你电脑上的证书。

    而证书的验证方法,其实就是每个操作系统(或浏览器)都有自己的一个受信任证书列表,只有对方发送过来的证书在这个列表里面,或者是这个列表里面的某个证书签发的子证书,就可以通过验证。

    Let's Encrypt 的根证书通常的操作系统或浏览器都是信任的,可以直接通过验证。

    那么,最简单的方法: Let's Encrypt 的证书放服务器上,你只需要再搞一张自签名证书放到本机,然后把证书添加到服务器的受信任证书列表中就可以了
    forblackking
        18
    forblackking  
       2016-11-08 17:08:03 +08:00
    @hhbcarl Nginx 还是不支持 ssl_verify_client per location 么。。。
    hhbcarl
        19
    hhbcarl  
       2016-11-08 17:19:16 +08:00
    @forblackking 应该是吧,反正我在其文档上没看到
    KoleHank
        20
    KoleHank  
    OP
       2016-11-08 21:38:51 +08:00
    @hhbcarl 已经搞定,使用自签的可以达到我想要的效果。
    @matsuz 嗯,就是这个思路。
    ryd994
        21
    ryd994  
       2016-11-09 02:17:59 +08:00 via Android
    @forblackking 道理来讲,用什么证书握手时就确定了, HTTP 协议的 location 根本不知道啊
    可以用 ssl_client_fingerprint 判断
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5849 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:29 · PVG 10:29 · LAX 18:29 · JFK 21:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.