使用 SSL

2014-10-28 14:48:16 +08:00
 yueyoum
ssl 所用的证书如何生成,
socket server如何验证client端,
nginx https 如何配置

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

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

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

对这方面有研究的同学 一起交流交流。
2827 次点击
所在节点    程序员
6 条回复
mengzhuo
2014-10-28 15:06:49 +08:00
还有重新生成签名的时候一定要记得revoke之前的
lj6684
2014-10-29 16:00:58 +08:00
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
2014-10-29 16:02:04 +08:00
对Java使用SSL有经验,Nginx经验无,原理性的问题可以帮助解答
yueyoum
2014-10-29 17:44:11 +08:00
@lj6684

感谢,

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

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

这么做对吗?

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

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

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


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

感谢,

那么能否 给个具体的 openssl 生成服务端/客户端证书的例子?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/142110

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX