通过OpenSSL自签CA为Android服务器签发证书

文章目录


##前言
不知道大家有没有留意过开源库 AndServerNanoHttpd。这两个开源库都能实现在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
    

##创建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
      这里写图片描述
      这里写图片描述
      这里写图片描述
      这里写图片描述
      这里写图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值