V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
KoleHank
V2EX  ›  SSL

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

  •  
  •   KoleHank · Nov 8, 2016 · 8855 views
    This topic created in 3461 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

    1. 服务端证书是给客户端校验服务端是否合法的
    2. 客户端证书是给服务器娇艳客户是否合法的
    3. 所以,自己拿 easyrsa 弄一个 PKI ,签个 ca 证书给服务器就行了,客户端这边在用自己的 PKI 签客户端证书就行了,当然有钱买个 PKI 服务也是不错的。
    vibbow
        11
    vibbow  
       Nov 8, 2016
    https://blog.vsean.net/post/194
    IIS 直接有选项开启就行了
    lslqtz
        12
    lslqtz  
       Nov 8, 2016
    部分 CA 提供免费的客户端证书,配合一起用可以,比如沃通和 StartSSL ,但是这两家快被吊销了。。。。
    RqPS6rhmP3Nyn3Tm
        13
    RqPS6rhmP3Nyn3Tm  
       Nov 8, 2016 via iPhone
    我选择 GPG ……
    lslqtz
        14
    lslqtz  
       Nov 8, 2016
    最近想了想,要做双向证书的登录验证,可以将一个自签根证书放在 web 服务端的信任双向认证 CA 列表。
    然后用一个没有验证的域名,在注册后签发证书下载安装。
    登录时由客户端访问一个指定的域名,这个指定的域名需要双向的验证,验证通过后返回个 Cookie 什么之类的就 ok
    ryd994
        15
    ryd994  
       Nov 8, 2016
    客户端的 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  
       Nov 8, 2016
    matsuz
        17
    matsuz  
       Nov 8, 2016   ❤️ 1
    双向认证其实就是你的电脑验证服务器的证书,服务器验证你电脑上的证书。

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

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

    那么,最简单的方法: Let's Encrypt 的证书放服务器上,你只需要再搞一张自签名证书放到本机,然后把证书添加到服务器的受信任证书列表中就可以了
    forblackking
        18
    forblackking  
       Nov 8, 2016
    @hhbcarl Nginx 还是不支持 ssl_verify_client per location 么。。。
    hhbcarl
        19
    hhbcarl  
       Nov 8, 2016
    @forblackking 应该是吧,反正我在其文档上没看到
    KoleHank
        20
    KoleHank  
    OP
       Nov 8, 2016
    @hhbcarl 已经搞定,使用自签的可以达到我想要的效果。
    @matsuz 嗯,就是这个思路。
    ryd994
        21
    ryd994  
       Nov 9, 2016 via Android
    @forblackking 道理来讲,用什么证书握手时就确定了, HTTP 协议的 location 根本不知道啊
    可以用 ssl_client_fingerprint 判断
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1096 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 17:36 · PVG 01:36 · LAX 10:36 · JFK 13:36
    ♥ Do have faith in what you're doing.