zoukankan      html  css  js  c++  java
  • 2020_1课程设计—基于BC的证书格式转换工具的设计与实现—第一周进展

    本周任务

    • 收集相关资料,学习证书格式的相关知识
    • 收集相关资料,学习OpenSSL的使用方法
    • 安装OpenSSL
    • 使用OpenSSL命令行查看证书,并实现证书格式转换

    完成情况

    收集相关资料,学习证书格式的相关知识

    • 不同平台,不同设备需要的证书格式不同,例如Windows服务器使用.pfx文件,Apache服务器使用.crt、.cer文件
    • 虽然证书的格式不同,但证书的本身不发生改变,只是存储方式发生了改变

    PEM Format

    • 最常用的证书格式(密钥格式)
    • 用于Apache平台
    • ASCII文件使用Base64编码
    • 文件中包含 “—–BEGIN CERTIFICATE—–” 和 “—–END CERTIFICATE—–” 字符串
    • 只包含公钥
    • 可使用openssl x509 -in cert.pem -noout -text查看PEM证书内容
    • 常用扩展名 .pem, .crt, .cer, .key

    DER Format

    • ASCII PEM 格式证书的二进制版本
    • 用于java平台
    • 查看DER格式证书的信息openssl x509 -in cert.der -inform der -text -noout
    • 扩展名 .der

    P7B Format

    • 用于Windows OS, Java Tomcat平台
    • Base64 编码
    • 包含 “—–BEGIN PKCS—–” & “—–END PKCS7—–”
    • 不含私钥,可以包含证书链
    • 扩展名 .p7b, .p7c

    PFX Format

    • 用于Windows平台
    • 二进制文件
    • 用于存储服务器证书,公钥和私钥都包含,而且加密
    • 扩展名 .pfx, .p12

    Keystore Format

    • 用于Android平台
    • 对APP进行签名
    • 扩展名 .keystore

    收集相关资料,学习OpenSSL的使用方法

    • OpenSSL 是一个开源项目,其组成主要包括一下三个组件:

      • openssl:多用途的命令行工具
      • libcrypto:加密算法库
      • libssl:加密模块应用库,实现了ssl及tls
    • openssl可以实现:

      • 密钥证书管理
      • 对称加密
      • 非对称加密

    1、对称加密

    • 对称加密需要使用的标准命令为 enc ,用法如下:
    openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e] [-d] [-a/-base64]
           [-A] [-k password] [-kfile filename] [-K key] [-iv IV] [-S salt] [-salt] [-nosalt] [-z] [-md]
           [-p] [-P] [-bufsize number] [-nopad] [-debug] [-none] [-engine id]
    
    • in filename:指定要加密的文件存放路径

    • out filename:指定加密后的文件存放路径

    • salt:自动插入一个随机数作为文件内容加密,默认选项

    • e:可以指明一种加密算法,若不指的话将使用默认加密算法

    • d:解密,解密时也可以指定算法,若不指定则使用默认算法,但一定要与加密时的算法一致

    • a/-base64:使用-base64位编码格式

    2、单向加密

    • 单向加密需要使用的标准命令为 dgst ,用法如下:
    openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-c] [-d] [-hex] [-binary]
           [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify filename] [-prverify
           filename] [-signature filename] [-hmac key] [file...]
    
    • [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] :指定一种加密算法

    • out filename:将加密的内容保存到指定文件中

    3、生成密码

    • 生成密码需要使用的标准命令为 passwd ,用法如下:
    openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}
    常用选项有:
    
    • 1:使用md5加密算法

    • salt string:加入随机数,最多8位随机数

    • in file:对输入的文件内容进行加密

    • stdion:对标准输入的内容进行加密

    4、生成随机数

    • 生成随机数需要用到的标准命令为 rand ,用法如下:
    openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num
    
    • out file:将生成的随机数保存至指定文件中

    • base64:使用base64 编码格式

    • hex:使用16进制编码格式

    5、生成密钥对

    • 首先需要先使用 genrsa 标准命令生成私钥,然后再使用 rsa 标准命令从私钥中提取公钥。

    • genrsa 的用法如下:

    openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]
    
    • out filename:将生成的私钥保存至指定的文件中

    • des|-des3|-idea:不同的加密算法

    • numbits:指定生成私钥的大小,默认是2048

    • ras 的用法如下:

    openssl rsa [-inform PEM|NET|DER] [-outform PEM|NET|DER] [-in filename] [-passin arg] [-out filename] [-passout arg]
           [-sgckey] [-des] [-des3] [-idea] [-text] [-noout] [-modulus] [-check] [-pubin] [-pubout] [-engine id]
    
    • in filename:指明私钥文件

    • out filename:指明将提取出的公钥保存至指定文件中

    • pubout:根据私钥提取出公钥

    6.证书操作(后文重点介绍)

    安装OpenSSL——准备工作

    安装

    配置环境变量

    • 在系统环境变量的Path路径中添加自己的OpenSSL安装的路径,如E:BaiduNetdiskDownloadOpenSSLOpenSSL-Win64in

    • 在cmd输入openssl,出现以下界面表示成功

    工作目录

    • 打开OpenSSL配置文件openssl.cfg,找到配置[CA_default]
    • 更改其变量dir为CA工作目录

    • 在工作目录中构建子目录,用于存放证书、密钥等

    • 然后构建相关文件

    使用OpenSSL命令行查看证书、公私钥

    OpenSSL生成证书

    • 构建随机数:openssl rand -out private/.rand 1000
      • rand:随机数命令
      • -out:输出文件路径,这里将随机数文件输出到private目录下
      • 参数1000用来产生伪随机字节数

    • 构建根证书密钥:openssl genrsa -aes256 -out private/ca.key.pem 2048

      • genrsa:产生RSA密钥命令
      • -aes256:使用AES算法(256位密钥)对产生的私钥加密。可选算法包括DES、DESede、IDEA和AES
      • -out:输出路径,这里指private/ca.key.pem
      • 参数2048指RSA密钥长度位数,默认长度为512位
    • 注:OpenSSL通常使用PEM格式保存私钥(公钥)

    • 生成根证书签发申请:openssl req -new -key private/ca.key.pem -out private/ca.csr -subj "/C=CN/ST=BJ/L=BJ/O=zlex/OU=zlex/CN=*.zlex.org"
      • req:产生证书签发申请命令
      • -new:表示新请求
      • -key:私钥,这里为private/ca.key.pem文件
      • -out:输出路径,这里为private/ca.csr文件
      • -subj:指定用户信息,这里使用泛域名“*.zlex.org”作为用户名
      • 需要输入根证书密码

    • 签发根证书:openssl x509 -req -days 10000 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certs/ca.cer
      • x509:签发X.509格式证书命令
      • -req:证书输入请求
      • -days:有效天数,这里为10000天
      • -sha1:证书摘要算法
      • -extensions:按OpenSSL配置文件v3_ca项添加扩展
      • -signkey:自签名密钥,这里为private/ca.key.pem
      • -in:输入文件,这里为private/ca.csr
      • -out:输出文件,这里为certs/ca.csr

    OpenSSL查看证书内容

    • 查看PEM格式证书内容:openssl x509 -in cert.pem -noout -text

    • 还可双击文件打开证书查看其内容

    OpenSSL查看公私钥

    • 公私钥通常以PEM文件存储
    • 还可使用PFX证书生成PEM公私钥文件
      • 提取密钥对:openssl pkcs12 -in private.pfx -nocerts -nodes -out private.key
      • 提取公钥:openssl rsa -in private.key -out pfx_pri.pem
      • 提取私钥:openssl rsa -in private.key -pubout -out pfx_pub.pem

    • 还可使用PEM证书获取公钥:openssl x509 -in public.cer -pubkey -noout > public.pem

    OpenSSL命令行实现证书格式转换

    PEM——>其他

    • PEM——>DER:openssl x509 -outform der -in certificate.pem -out certificate.der

    • PEM——>P7B:openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CAcert.cer

    • PEM——>PFX:openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CAcert.crt

    • PEM——>keystore:keytool -import -file ca.cer -keystore ca.keystore

    其他——>PEM

    • DER——>PEM:openssl x509 -inform der -in certificate.cer -out certificate.pem

    • P7B——>PEM:openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer

    • PFX——>PEM:openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes

    转换结果

    遇到的问题与解决过程

    问题一:证书格式的转换只能围绕PEM进行,即只能实现PEM与其他格式证书的转换,并以PEM为中心实现所有格式的转换。而且无法实现keystore——>PEM的转换

    待解决,考虑BC编程阶段实现

    问题二:虽然对证书格式的大的框架有了一定的了解,但对证书内部的细节部分的理解还不到位

    待解决,这一部分资料也有限,希望在BC编程阶段通过函数的调用实现,可以更加深入地了解证书的格式结构

  • 相关阅读:
    并发与并行的区别
    Java 中的JSON 字符串
    java spark list 转为 RDD 转为 dataset 写入表中
    SparkConf和SparkContext
    Java 中清空map
    java JSON的使用和解析
    presto计算日期间隔天数或者小时间隔——date_diff函数使用
    Nginx 负载均衡配置
    Nginx 反向代理配置示例(conf文件配置)
    前端同学 linux常用指令汇总
  • 原文地址:https://www.cnblogs.com/wyf20175217/p/12694841.html
Copyright © 2011-2022 走看看