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

使用 SSL

  •  
  •   yueyoum ·
    yueyoum · 2014-10-28 14:48:16 +08:00 · 2915 次点击
    这是一个创建于 3686 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ssl 所用的证书如何生成,
    socket server如何验证client端,
    nginx https 如何配置

    这些问题一直都是网上搜来照搬着用,
    最近总结了一下。
    https://github.com/yueyoum/Using-SSL

    有示例代码和配置 解释了上面三个问题。

    不过 openssl 的命令还是从网上抄的……

    对这方面有研究的同学 一起交流交流。
    6 条回复    2014-10-30 10:42:07 +08:00
    mengzhuo
        1
    mengzhuo  
       2014-10-28 15:06:49 +08:00   ❤️ 1
    还有重新生成签名的时候一定要记得revoke之前的
    lj6684
        2
    lj6684  
       2014-10-29 16:00:58 +08:00   ❤️ 1
    SSL的证书通过OpenSSL(C工具)或者JDK(java工具)都可以生成
    需要的证书主要分3类:
    1. CA根证书(最终双方建立信任体系的源头,自签名证书)
    2. SSL服务器证书(由CA根证书签发,给服务器或应用用,代表Server端身份)
    3. SSL客户端证书(由CA根证书签发,双向SSL连接时需要客户端登陆时出示)

    SSL连接按认证级别分为2种:
    1. 单项SSL,只需要服务端配置有SSL服务器证书即可,客户端无证书,客户端对服务器进行认证
    2. 双向SSL,要求服务端有SSL证书,并且客户端访问时需要出示自己的SSL客户端证书,双方都会对对方的证书进行身份认证并且最终协商安全加密算法
    lj6684
        3
    lj6684  
       2014-10-29 16:02:04 +08:00
    对Java使用SSL有经验,Nginx经验无,原理性的问题可以帮助解答
    yueyoum
        4
    yueyoum  
    OP
       2014-10-29 17:44:11 +08:00
    @lj6684

    感谢,

    但我上网搜了很多openssl 生成证书的命令,
    发现 其实 server证书 和 client 证书的生成是同一个命令。只是输出的文件不一样。

    所以我后来 直接把 server证书给client用了, 用于server验证client,

    这么做对吗?

    如果不对,
    那么正确方式应该如何呢?
    lj6684
        5
    lj6684  
       2014-10-30 09:06:25 +08:00   ❤️ 1
    Server和Client端都有代表自己身份的证书,两边用相同的证书,从纯技术角度看应该可以成功完成认证建立SSL连接,因为证书都是来自同一个信任CA,并且都能通过有效性校验,但从使用角度来说这么做不合适

    说多一点,涉及到X.509证书的使用要求,X.509数字证书记载的关键信息简单分类看有
    1.证书的基本信息(证书持有者的名字,有效期...)基本信息是证书持有者最直观的表现,服务器证书的和客户端证书一般不一样;服务端证书的名字一般是应用域名,而客户端证书一般代表一个人或一台设备或一个组织。
    2.证书的扩展信息
    标识证书的使用范围和用法,其中就有说明此证书时用于服务端认证还是客户端认证,是否能用于SSL服务...,当带有扩展域的信息,应用就应该严格按照证书标识的用法去使用,但如果不带有相应扩展域的信息,代表通用证书,应用可以不去严格限制(你说的服务器证书也可以给客户端用,可能就是服务器证书中没明确标识这种用途限制)
    3.证书对应的密钥
    证书认证、加密过程时使用的非对称密钥

    根据以上原理看,合理的方式是服务端,客户端各自持有自己的证书,保障在统一个信任体系下,就可以完成认证
    服务端证书主题一般为应用/服务的域名,并且在扩展域中标识此证书只能用于SSL服务端认证
    客户端证书主题一般为登陆用户的名字,并且在扩展域中标识此证书只能用于SSL客户端认证
    [未来如果客户端使用双向SSL访问服务端的时候,在服务端能够从请求中提取到当前登陆的客户端证书信息,可以扩展来在服务端进一步进行用户身份认证或权限校验。]


    上面才是标准SSL服务的证书使用规范,但如果应用要求不严格,或者对证书格式要求没有那么高,可以适当放宽要求,不加入那么多严格的限制
    yueyoum
        6
    yueyoum  
    OP
       2014-10-30 10:42:07 +08:00
    @lj6684

    感谢,

    那么能否 给个具体的 openssl 生成服务端/客户端证书的例子?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   900 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 71ms · UTC 21:23 · PVG 05:23 · LAX 13:23 · JFK 16:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.