标题:浏览器客户端证书 出处:Felix021 时间:Fri, 23 Nov 2018 23:06:23 +0000 作者:felix021 地址:https://www.felix021.com/blog/read.php?2194 内容: 2015年,从某传统金融国企跳槽来到我司的时候,发现后台管理系统竟然需要安装客户端证书才能登陆,简直惊为天人,通过利用 https 的客户端认证,配合证书中嵌入的用户名做权限控制,把内部系统的入侵难度至少增加了一个量级(当然,安装证书的过程对于非技术线的同学说也麻烦了不少)。 后来发现,原来是把 github.com/OpenVPN/easy-rsa 这个项目包装了一下实现的,其实也并不是很困难。 今年年初因为新项目也需要这个方案,自己心血来潮,参考网上的一些说明,用 openssl 的 genrsa、req、x509、pkcs12 这几个命令试着自己颁发客户端证书,并且包装了一套脚本,勉强能用。 但当时没有太多时间,吊销的功能并没有做,因为比颁发证书麻烦多了,不只是敲几个命令,还需要一套更复杂的方案,包括维护一个证书信息列表、按一定规范的文件目录结构,以及DIY的 openssh 配置文件等。 最近抽了两个晚上把整个流程重新梳理了一遍,填了几个坑,终于做了一套完整的脚本出来,这才好意思写这篇博客介绍一下。 这套脚本可以在这里获取: https://github.com/felix021/openssl-selfsign 使用起来可以说是非常简单了: 1. 创建CA $ ./1-sign-site.sh dev.com 会创建 ca 证书,并在 cert/site/dev.com/ 下面创建 *.dev.com 的 https 证书,并且生成一个 nginx.conf 配置文件供参考(直接可以用的)。 2. 颁发客户端证书 $ ./2-sign-user.sh test1 在 cert/newcerts/test1-01/ 下面创建 test1 用户的一个客户端证书 cert.p12 ,并给出对应的密码,双击按提示导入即可。 3. 参考第一步生成的 nginx.conf 配置文件,配置好 web 服务器,就行了。 4. 稳妥起见,应当在代码中读取 http 头里的 SSL_DN 参数,从中获取邮箱或者用户名来作为系统的用户名。 至于吊销的过程,要更复杂一些,可以参考该项目的 README 。 Generated by Bo-blog 2.1.0