证书,CSP与Openssl
证书,CSP与Openssl
起因
最近在研究更安全的交互体系,自然想到的就是提供证书的交互方式。给用户分配一对公私钥,然后将私钥交给用户保管,用户在登录或者一些关键操作的时候通过私钥签名,从而保证其安全性。
鉴于团队的童鞋都没有开发usb key相关的经验,所以最开始的版本只考虑通过软证书实现。为了保证安全性,我们将用户的证书信息放置在windows系统的证书存储区里面,这样既减少证书被盗用的风险,同时通过windows的CSP(Cryptographic Service Provider)能让JS,APP都能读取到相关证书信息。
流程
当用户登录系统的时候,需要使用该用户对应的私钥进行签名,如果该用户现阶段还没有私钥,则会引导用户跳转到证书申请页面进行申请。申请成功之后,系统自动为用户安装证书,然后用户就能够使用该证书与服务器进行交互了。
证书生成
我们在服务器端通过openssl创建相关证书,主要有以下几个流程:
创建私钥
openssl genrsa -out private.key 1024
我们通过genrsa生成了一个1024位的私钥
生成CA
openssl req -new -x509 -days 3650 -key private.key -out username.crt -subj "/C=CN/ST=GZ/L=ZH/O=KSS/OU=KSS/CN=username"
这里需要特别注意的是证书的CN信息,我们这里使用username来表示,这样CSP就能通过username,使用subjectName来查找相关证书了。为了保证username的私密性,我们也可以对username进行hmac处理。
提取公钥
openssl rsa -in private.key -out public.key -outform PEM -pubout
提取对应公钥信息,后续服务器会通过该公钥进行验证与加密。
生成pfx
openssl pkcs12 -export -inkey private.key -in username.crt -password pass: -out username.pfx
将私钥以及证书信息打包进pfx文件,并将该文件分发给用户。因为我们是通过脚本进行证书生成的处理,所以这里需要设置'-password pass:',用来保证脚本不会被hang up。
证书生成之后,我们会将证书的相关信息存放到数据库,同时将pfx文件分发给用户。
证书导入
因为用户证书的申请是由我们自己的页面进行控制,所以我们通过JS就能将该证书信息下载下来,同时调用CSP相关接口将证书注册进windows的CA Store里面。
在注册证书的时候,需要注意,有可能存在同名的subjectName证书(这种可能出现在用户更换证书的情况),需要首先将其删除。
证书使用
当用户登录的时候,会做如下处理:
通过username找到相应的私钥,进行签名sign
服务器收到登录请求之后,通过username找到对应的公钥,进行验证verify
服务器验证通过,则会使用公钥加密一个key返回给用户
用户通过私钥对key进行解密,解开之后,后续的交互通过该key进行。
对于其他关键性操作,也使用私钥进行sign,保证其安全性。对于服务器的验证,加密来说,我们使用pycrypto进行,谁叫我们使用的是python开发。
一些坑
为了实现上述功能,我们栽了很多坑,这里记录一下,也供后续参考。
字节序问题,windows csp对于sign使用的是小端序,而openssl等都使用的是大端序。所以我们在处理的时候需要进行字节序转换。
openssl rsautl,dgst。这是最坑爹的了,openssl的rsautl貌似已经被废弃了,所以verify的时候不能使用rsautl,只能用dgst才能保证csp sign的数据服务器能verify。但是对于加解密来说rsautl竟然又可以。神奇!
Base64,JS对于二进制流的处理比较蛋疼,所以我们的接口都是使用base64编码的,但python的base64会有一个'\n',这个就得我们手动去掉了。
CSPICOM,原以为JS能调用CSPICOM就很方便了,但是CSPICOM在win7已经不支持,所以只能我们自己封装一个ActiveX,来调用CSP对应函数。
end
CSP的相关代码在这里。需要注意的是,证书的添加以及删除需要使用管理员权限。另外,不得不吐槽一下WIN32的API,笔者是在没有Visual AssixtX写的代码,太辛苦了!
版权声明:自由转载-非商用-非衍生-保持署名 Creative Commons BY-NC-ND 3.0
证书,CSP与Openssl的更多相关文章
- Java Keytools 证书转换成Openssl 的PEM 文件或keytools 导出私钥文件
上一遍又说到Godaddy 生请证书流程与操作: 现因使用Incapsula 防护使用到https,在添加网站时需要自定义证书,其中需要上传私钥信息,因公钥是能过keytool 生成所以需要导出私钥信 ...
- 对称、非对称加密算,openssl生成证书(笔记)
对称加密算法 1.密钥只有一个,加密和解密都需要同一个密钥2.DES,IDEA,AES3.明文+密钥=密文, 密文+密钥=明文4.加密速度快,系统开销小,适用大量数据的加密 非对称加密算法1.密钥由公 ...
- 使用 openssl 生成证书
一.openssl 简介 目前最流行的 SSL 密码库工具官网:https://www.openssl.org/source/ 构成部分 密码算法库 密钥和证书封装管理功能 SSL通信API接口 用途 ...
- openssl证书制作详细教程
自签名证书及验证 模拟证书涉及的角色 创建证书目录 mkdir ~/certs cd ~/certs 认证机构.网站.浏览器/用户 mkdir root web user 机构自签名证书生成和发布 生 ...
- openssl 证书操作命令
生成Self Signed证书 # 生成一个key,你的私钥,openssl会提示你输入一个密码,可以输入,也可以不输, # 输入的话,以后每次使用这个key的时候都要输入密码,安全起见,还是应该有一 ...
- 使用openssl创建自签名证书及部署到IIS教程
概要 本文讲解三个部分:1. 创建自签名证书2. 创建自己的证书颁发机构3. 以及如何配置IIS 创建自签名证书 首先,创建一个私钥文件: openssl genrsa -out myselfsign ...
- openSSL命令、PKI、CA、SSL证书原理
相关学习资料 http://baike.baidu.com/view/7615.htm?fr=aladdin http://www.ibm.com/developerworks/cn/security ...
- 基于 OpenSSL 的 CA 建立及证书签发 【转】
建立 CA 建立 CA 目录结构 按照 OpenSSL 的默认配置建立 CA ,需要在文件系统中建立相应的目录结构.相关的配置内容一般位于 /usr/ssl/openssl.cnf 内,详情可参见 c ...
- OpenSSL 1.0.0生成p12、jks、crt等格式证书的命令个过程(转)
OpenSSL 1.0.0生成p12.jks.crt等格式证书的命令个过程 此生成的证书可用于浏览器.java.tomcat.c++等.在此备忘! 1.创建根证私钥命令:openssl g ...
随机推荐
- 分析RunTime执行命令以及得到返回值
RunTime执行命令得到返回值 我们有在好好几篇博客里提到过RunTime,比如 JAVA之旅(二十三)--System,RunTime,Date,Calendar,Math的数学运算 Androi ...
- ViewPager实现滑屏切换页面及动画效果(仿优酷客户端)
找了许多实现该功能的例子,但效果都不很理想,于是自己结合网上的资源及自己的总结,整理了一下,发出来,供大家参考.这个是自己做的,仿优酷客户端的. 先看效果: ****************** ...
- HDFS的写数据过程分析
HDFS的写数据过程分析 我们通过FileSystem类可以操控HDFS, 那我们就从这里开始分析写数据到HDFS的过程. 在我们向 HDFS 写文件的时候,调用的是 FileSystem.creat ...
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
讲这个之前,我们先来说说get和post两种请求的区别吧!!! 1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.jsp?name=te ...
- 【安卓开发】Facebook工程师是如何改进他们Android客户端的
原文出处: Facebook 译文出处:penkzhou 欢迎分享原创到伯乐头条 作为世界上最大的社交网络,Facebook的Android客户端面临着各种各样的使用环境(地理环境.Andro ...
- iOS中NSTimer的invalidate调用之后
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交 ...
- iOS开发关于适配iOS10以及Xcode8的相关新知识
一.证书管理 用Xcode8打开工程后,比较明显的就是下图了,这个是苹果的新特性,可以帮助我们自动管理证书.建议大家勾选这个Automatically manage signing(Ps.但是在bea ...
- (一〇九)UIButton的使用技巧 -imageView、titleLabel、圆角等
UIButton是一个常用控件,使用方法十分基本,但是有很多技巧常常不被注意,本文主要介绍UIButton的一些较高级技巧,用于实现图片和标签显示的美观性等. 开发时常常碰到按钮的下侧或者右侧有标题的 ...
- 网页搜索之后的APP搜索
搜索技术是互联网最核心的技术之一.但是移动互联网迅猛发展的今天,互联网产生的数据已经不是简单的网页搜索所能涵盖的了.比如微信公众号,产生了许多优质的内容,如果这些公众号仅仅将这些内容发布到微信平台,那 ...
- Nginx创建密码保护目录
nginx 的根目录 为:/home/undoner/nginx-wwwnginx 访问地址 为:http://127.0.0.1本文实现对nginx根目录文件访问的权限控制 (1)nginx指定密码 ...