文章目录
##前言
不知道大家有没有留意过开源库 AndServer和 NanoHttpd。这两个开源库都能实现在Android平台上快速搭建服务器,功能非常强大,也都分别支持 Https安全通信,大家如果有兴趣可以点进去看看。本文也是因为使用到Https通信,需要用到自签的服务器端证书,需要自己创建CA,并由这个CA去给服务器端签发证书( 因为我只需要客户端去认证服务器端的合法性,所以只用签发服务器端证书)。那么接下来就直接具体介绍一下怎么使用OpenSSL来创建CA,并为服务器端签发证书。
##配置环境
-
安装OpenSSL
这里不介绍如何安装openssl了,大家可以自行搜索下安装方法,其中在Linux上安装和在Windows下的安装方法全然不同,OpenSSL官方不提供window上的安装包,但有第三方提供了,这里提供一下链接win openssl 。在完成OpenSSL的安装之后,可以先修改下配置文件。 -
修改配置文件
- 修改dir
- 创建必要文件和文件夹
certs -- 用于存放已颁发的证书 newcerts -- 存放CA指令生成的新证书 private -- 用于存放私钥 crl -- 用于存放已吊销的证书 csr -- 用于存放证书申请文件 index.txt -- Openssl 定义的已签发证书的文本数据文件,通常在初始化的时候是空的 serial -- 证书签发时使用的序列号参考文件,该文件的序列号是以16进制格式进行保存的,该文件必须提供并且包含一个有效的序列号
生成证书之前,需要先生成一个随机数:
openssl rand -out private/.rand 1000
- 修改dir
##创建CA根证书
-
生成根证书私钥(key文件)
命令:openssl genrsa -aes256 -out private/ca.key 1024
命令说明:genrsa --- 使用RSA算法生成私钥 -aes256 ---使用256位密钥的AES算法对私钥进行加密 -out ---输出文件的路径 1024 -- 指定私钥长度
-
生成根证书请求文件(csr文件)
命令:openssl req -new -key private/ca.key -out csr/ca.csr -subj "/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname"
命令说明:req --- 执行证书签发命令 -new --- 新证书签发请求 -key ---指定私钥路径 -out --- 输出的csr文件的路径 -subj --- 书相关的用户信息(subject的缩写)
-
自签发根证书(crt文件)
命令:openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey private/ca.key -in csr/ca.csr -out certs/ca.crt
命令说明:x509 --- 生成x509格式证书 -req --- 输入csr文件 -days --- 证书的有效期(天) -sha1 -- 证书摘要采用sha1算法 -extensions --- 按照openssl.cnf文件中配置的v3_ca项添加扩展 -signkey --- 签发证书的私钥 -in --- 要输入的csr文件 -out --- 输出的cer证书文件
这样,就可以生成一个根证书了,可以在certs文件夹中找到。
##用CA根证书签发服务器证书
-
生成服务器私钥
openssl genrsa -aes256 -out private/server.key 1024
-
生成服务器证书请求文件
openssl req -new -key private/server.key -out csr/server.csr -subj "/C=CN/ST=myprovince/L=mycity/O=myorganization/OU=mygroup/CN=myname"
-
由CA根证书签发服务器证书
openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certs/ca.crt -CAkey private/ca.key -CAserial ca.srl -CAcreateserial -in csr/server.csr -out certs/server.crt
命令说明:
-CA – 指定CA证书的路径
-CAkey – 指定CA证书的私钥路径
-CAserial – 指定证书序列号文件
-CAcreateserial – 表示创建证书序列号文件(上面提到的serial文件),创建序列号文件默认名称为-CA,指定的证书名称后加上.srl后缀
-extensions – 拓展参数,这里指定为v3_req,打开之前的配置文件可以看到这个属性。
在上面CA自签根证书的时候,用到的是v3_ca, basicConstraints属性值为CA:TRUE,表明该证书是颁发给CA的证书:
导出服务器证书
通过以上步骤,就可以得到由CA签发的服务器端的证书了,那么,我们得到这个证书之后怎么使用?我们都知道Java使用的是jks格式的秘钥库,而Android使用的bks格式的秘钥库。
那此时,我们的目标是得到一个bks格式的秘钥库:
-
将签发证书和服务器秘钥合并导出为pcks格式
openssl pkcs12 -export -in certs/server.crt -inkey private/server.key -out server.p12
-
格式转换
- 转换为pkcs8,以明文的方式保存
openssl pkcs8 -in private/server.key -topk8 -nocrypt -out sever8.key
-
转换为jks或者bks
使用到一个工具 : Portecle