现在的位置: 首页 > 综合 > 正文

用户端数字证书使用方法简单说明

2018年02月11日 ⁄ 综合 ⁄ 共 3110字 ⁄ 字号 评论关闭

互联网对安全越来越重视,现如今提供在线服务的saas,几乎没有哪一家不支持ssl证书访问了。 最常见的server端证书,一方面是用来验证server端的身份,一方面用来加密传输内容。而用户身份的验证最常用的还是采用账号、密码的机制来解决。但随着日益增多的互联网用户信息被泄漏事件的发生,账号密码的机制越来越不安全了。不要侥幸认为某某网站不保存明文密码就可以高枕无忧。泄漏的密文,通过暴力破解的方式,在现如今GPU的攻击下,也变得很脆弱。 所以再也不要使用6位字符的密码了,那简直就是在裸奔。 1Password
这个软件默认的密码字符长度是10,例如 4LmDQ3mZso ,这种密码才相对安全。

认证用户的方法还有一种用户端数字证书,最长见的就是淘宝和银行签发的用户端数字证书。有了用户端数字证书就可以获得比密码更强的认证方法。本文来简单的讨论CA认证中心的配置、数字证书的签发、数字证书的导入、以及业务系统如何来改造。

CA认证中心的配置:

CA中心可以用来负责签发用户数字证书,当用户在浏览器这一端发起请求后,根据server端的要求可以把本地证书上报。 server端的CA要负责对用户证书做验证(防止证书被非法篡改),验证成功后,也就验证了用户的身份信息。

我们使用openssl 提供的CA功能来实现。(openssl 版本请使用1.0.1g 以上的版本)

openssl 安装位置 ,/usr/local/ssl ,  对应的配置文件 /usr/local/ssl/openssl.cnf

# cd /usr/local/ssl 

# vim openssl.cnf
[ CA_default ]
dir             = /usr/local/ssl/demoCA    # CA 相关的数据保存在这个目录下 

CA.sh 默认的CA配置脚本 , 复制到bin目录下方便后续操作 
# cp misc/CA.sh  bin/  

CA.sh 默认使用的RSA 1024位模数,这个建议修改为2048长
# vim bin/CA.sh 
修改代码
            echo "Making CA certificate ..."
            $REQ -new -keyout ${CATOP}/private/$CAKEY \
为
            echo "Making CA certificate ..."
            $REQ -new -sha1 -newkey rsa:2048 -keyout ${CATOP}/private/$CAKEY \


执行 CA 创建命令, 填写必要的信息,然后生成CA自己的私有key 和自签发的证书文件。
# bin/CA.sh -newca

Country Name (2 letter code) [AU]:CN     // 国家代码 这个要与用户证书请求是配置一致 
State or Province Name (full name) [Some-State]:sichuan  // 省份信息 
Locality Name (eg, city) []:chengdu   // 城市信息  
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CCW  // 机构名
Organizational Unit Name (eg, section) []:CCW  // 机构名称 
Common Name (e.g. server FQDN or YOUR name) []:example.com   // 服务器地址或域名
Email Address []:user@example.com 

提示输入一个密码,这个密码在签发用户证书的时候还需要使用

用户证书签发:

创建users 目录, 保存所有签发的用户 证书 
# mkdir users

下面的示例是为 dong 用户签发一个证书的过程; 
执行成功后 生成 私钥文件 16_dong.key 和证书请求文件 16_dong.csr
# openssl req -new -sha1 -newkey rsa:2048 -nodes -keyout /usr/local/ssl/users/16_dong.key -out /usr/local/ssl/users/16_dong.csr -subj '/C=CN/ST=sichuan/L=chengdu/O=CCW/OU=CCW/CN=16_dong/emailAddress=uu@example.com/'

证书请求文件需要经过 CA签发后 才能生成用户证书文件 , 默认证书的有效期1年 
# openssl ca -batch -config /usr/local/ssl/openssl.cnf -policy policy_anything  -out /usr/local/ssl/users/16_dong.crt -infiles /usr/local/ssl/users/16_dong.csr

签发后的文件 16_dong.crt  , 这个文件是不能被某些浏览器直接使用的,需要导出为p12格式 
# openssl pkcs12 -export -clcerts -in /usr/local/ssl/users/16_dong.crt -certfile /usr/local/ssl/demoCA/cacert.pem -inkey /usr/local/ssl/users/16_dong.key -out /usr/local/ssl/users/16_dong.p12

16_dong.p12 这个就是最终的浏览器导入用的数字证书。

Nginx改造: nginx的配置文件中参考如下做修改

server {
...
        ssl_client_certificate /usr/local/ssl/demoCA/cacert.pem;     # 这个是CA的证书文件,用来验证用户数字证书 
        ssl_verify_client optional;            # 参数 on off  用来控制用户数字证书是否使用, 如果设置on,必需使用 
        ssl_verify_depth 1;
        ssl_session_timeout 5m;
        ssl_protocols SSLv3 TLSv1;
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
	ssl_prefer_server_ciphers on;
	location / {;
...
            proxy_set_header X-SSL-Client-S-DN   $ssl_client_s_dn;
            proxy_set_header X-CLIENT-VERIFY $ssl_client_verify;          # 验证成功、失败的信息 通过头传递给业务服务器
...
       }
}

建议nginx 在编译是 --with-debug  这样可以在log 中输出debug 信息,方便问题定位。

浏览器数字证书导入:

firefox 下

打开浏览器访问服务器,在nginx的日志中看到如下信息,就说明证书验证ok,否则页面返回400 错误。

X-CLIENT-VERIFY: SUCCESS     

应用代码改造:

nginx作为前置服务器,会把请求转发给应用服务器,在业务代码中判断对应的head中的参数值就可以验证用户身份。

以ruby为例

request.env["HTTP_X_CLIENT_VERIFY"]

获取到的信息,NONE | SUCCESS 。 同理可以取到 X-SSL-Client-S-DN 中的用户 通用名和email等信息。

总结:

主要的几个步骤:
1  CA 配置, 用户数字证书签发(这个可以写一个脚本来自动签发);
2  nginx配置改造,nginx来完成用户证书的验证工作(需要CA的证书);
3  用户数字证书在浏览器中导入;
4  业务系统改造,验证一个nginx 传递过来的一个变量就可以了;

抱歉!评论已关闭.