用户端数字证书使用方法简单说明
2014-06-17 23:56
1081 查看
互联网对安全越来越重视,现如今提供在线服务的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
用户证书签发:
Nginx改造: nginx的配置文件中参考如下做修改
建议nginx 在编译是 --with-debug 这样可以在log 中输出debug 信息,方便问题定位。
浏览器数字证书导入:
firefox 下
打开浏览器访问服务器,在nginx的日志中看到如下信息,就说明证书验证ok,否则页面返回400 错误。
应用代码改造:
nginx作为前置服务器,会把请求转发给应用服务器,在业务代码中判断对应的head中的参数值就可以验证用户身份。
以ruby为例
获取到的信息,NONE | SUCCESS 。 同理可以取到 X-SSL-Client-S-DN 中的用户 通用名和email等信息。
总结:
主要的几个步骤:
1 CA 配置, 用户数字证书签发(这个可以写一个脚本来自动签发);
2 nginx配置改造,nginx来完成用户证书的验证工作(需要CA的证书);
3 用户数字证书在浏览器中导入;
4 业务系统改造,验证一个nginx 传递过来的一个变量就可以了;
这个软件默认的密码字符长度是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 传递过来的一个变量就可以了;
相关文章推荐
- iOS 消息推送证书生成方法的简单说明
- 数字证书中keytool命令使用说明
- Redis简单使用方法说明
- Visual Studio 2017中使用正则修改部分内容 如何使用ILAsm与ILDasm修改.Net exe(dll)文件 C#学习-图解教程(1):格式化数字字符串 小程序开发之图片转Base64(C#、.Net) jquery遍历table为每一个单元格取值及赋值 。net加密解密相关方法 .net关于坐标之间一些简单操作
- java使用正则表达为数字添加千位符的简单方法
- Fragment 简单说明和使用方法
- PHP 学习笔记 - - - 简单方法的使用 (字符串与数字)
- 数字证书中keytool命令使用说明
- 数字证书中keytool命令使用说明
- 数字证书中keytool命令使用说明
- 数字证书中keytool命令使用说明
- 简单说明dom4j的使用流程和常用方法
- 简单说明Java的Struts框架中merge标签的使用方法
- python基础教程之简单入门说明(变量和控制语言使用方法)
- 数字证书中keytool命令使用说明
- 数字证书中keytool命令使用说明
- 【Java 线程的深入研究3】最简单实例说明wait、notify、notifyAll的使用方法
- Log4j日志管理系统简单使用说明
- 一个简单的将数字转化为汉字大写的方法
- 建立一个简单的数字证书中心