2020_1课程设计—基于BC的证书格式转换工具的设计与实现—Week1

2020_1课程设计—基于BC的证书格式转换工具的设计与实现—Week1

任务要求

  • 清楚.pem .pfx /.keystore .crt .cer .der 这些格式的文件用openssl如何产生
  • 使用OpenSSL命令行查看证书,并实现证书格式转换
  • 清楚哪些格式可以互相转换,并使用BouncyCastle编程实现

Week1 任务安排

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

实践过程

学习证书格式的相关知识

1、 数字证书常见标准

  • 符合PKI ITU-T X509标准,传统标准(.DER .PEM .CER .CRT)
    • 基本的证书格式,只包含公钥。
    • x509证书由用户公共密钥和用户标识符组成。
    • 此外还包括版本号、证书序列号、CA标识符、签名算法标识、签发者名称、证书有效期等信息。
  • 符合PKCS#7 加密消息语法标准(.P7B .P7C .SPC .P7R)
    • PKCS#7一般把证书分成两个文件,一个公钥、一个私钥,有PEM和DER两种编码方式。- - PEM比较多见,是纯文本的,一般用于分发公钥,看到的是一串可见的字符串,通常以.crt,.cer,.key为文件后缀。
    • DER是二进制编码。
    • PKCS#7一般主要用来做数字信封。
  • 符合PKCS#12 个人信息交换标准(.pfx *.p12)
    • 一种文件打包格式,为存储和发布用户和服务器私钥、公钥和证书指定了一个可移植的格式,是一种二进制格式,通常以.pfx或.p12为文件后缀名。
    • 使用OpenSSL的pkcs12命令可以创建、解析和读取这些文件。
    • P12是把证书压成一个文件,xxx.pfx 。主要是考虑分发证书,私钥是要绝对保密的,不能随便以文本方式散播。所以P7格式不适合分发。.pfx中可以加密码保护,所以相对安全些。
  • X509是数字证书的基本规范,而P7和P12则是两个实现规范,P7用于数字信封,P12则是带有私钥的证书实现规范。
  • 实际上PKCS#7、PKCS#10、PKCS#12都是PKCS系列标准的一部分。相互之间并不是替代的关系,而是对不同使用场景的定义。

2、 证书编码格式

  • PEM
    • BASE64编码
    • 查看内容,以——-BEGIN XXXX ——开头,以——END XXXX——结尾。
    • 查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout
    • Apache和*NIX服务器偏向于使用这种编码格式。
  • DER
    • 二进制格式编码,不可读。
    • 查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout
    • Java和Windows服务器偏向于使用这种编码格式。

3、 各种后缀含义:文件的内容和后缀没有必然的关系,但是一般使用这些后缀来表示这是什么文件。

  • CERDER
    • 一般指使用DER格式的证书,二进制格式存放
    • 只含有证书信息,不包含私钥
  • CRT :二进制格式,也可以是文本格式,一般均为文本格式,功能与.der.cer证书文件相同。
  • PFXP12:证书文件,可以是PEM格式。
    • 公钥加密标准 #12 (PKCS#12) 可包含所有私钥、公钥和证书
    • 其以二进制格式存储,也称为 PFX 文件
    • 通常可以将Apache/OpenSSL使用的“KEY文件 + CRT文件”格式合并转换为标准的PFX文件,你可以将PFX文件格式导入到微软IIS 5/6、微软ISA、微软Exchange Server等软件
    • 一般有密码保护,转换时需要输入PFX文件的加密密码。
  • KEY:通常用来存放一个公钥或者私钥。
    • 查看KEY的办法:openssl rsa -in mykey.key -text -noout
    • 如果是DER格式的话,同理应该:openssl rsa -in mykey.key -text -noout -inform der,这是使用RSA算法生成的key这么查看,DSA算法生成的使用dsa参数
  • PEM – Openssl使用 PEM(Privacy Enhanced Mail)格式来存放各种信息,它是 openssl 默认采用的信息存放方式。Openssl 中的 PEM 文件一般包含如下信息:
    • 内容类型:表明本文件存放的是什么信息内容,它的形式为——-BEGIN XXXX ——,与结尾的——END XXXX——对应。
    • 头信息:表明数据是如果被处理后存放,openssl 中用的最多的是加密信息,比如加密算法以及初始化向量iv。
    • 信息体:为 BASE64 编码的数据。可以包括所有私钥(RSA 和 DSA)、公钥(RSA 和 DSA)和 (x509) 证书。它存储用 Base64 编码的 DER 格式数据,用 ascii 报头包围,因此适合系统之间的文本模式传输。

使用PEM格式存储的证书:
—–BEGIN CERTIFICATE—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END CERTIFICATE—–
使用PEM格式存储的私钥:
—–BEGIN RSA PRIVATE KEY—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END RSA PRIVATE KEY—–
使用PEM格式存储的证书请求文件:
—–BEGIN CERTIFICATE REQUEST—–
MIICJjCCAdCgAwIBAgIBITANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCVVMx
………
1p8h5vkHVbMu1frD1UgGnPlOO/K7Ig/KrsU=
—–END CERTIFICATE REQUEST—–

学习OpenSSL的使用方法

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

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

2、 openssl可以实现:秘钥证书管理、对称加密和非对称加密 。
3、 对称加密:对称加密需要使用的标准命令为 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位编码格式

4、 单向加密:单向加密需要使用的标准命令为 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:将加密的内容保存到指定文件中

5、 生成密码:生成密码需要使用的标准命令为 passwd ,用法如下:

openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}

  • 1:使用md5加密算法
  • salt string:加入随机数,最多8位随机数
  • in file:对输入的文件内容进行加密
  • stdion:对标准输入的内容进行加密

6、 生成随机数:生成随机数需要用到的标准命令为 rand ,用法如下:

openssl rand [-out file] [-rand file(s)] [-base64] [-hex] num

  • out file:将生成的随机数保存至指定文件中
  • base64:使用base64 编码格式
  • hex:使用16进制编码格式

7、 生成秘钥对:首先需要先使用 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
  • rsa 的用法如下:

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:根据私钥提取出公钥

  • 创建证书(我们下面再介绍叭)

安装OpenSSL

  • 我使用的Ubuntu版本是18.04
  • ubuntu18.04内置了1.1.0g版本的openssl

使用OpenSSL查看证书,并实现证书格式转换

创建根证书CA

1、 查看openssl的配置文件openssl.cnf的存放位置(即openssl的安装位置),如上图OPENSSLDIR

2、 查看openssl的配置文件openssl.cnf,因为配置文件中对证书的名称和存放位置等相关信息都做了定义

vim /usr/lib/ssl/openssl.cnf


3、 创建为根证书CA所需的目录及文件

#根据配置文件信息,到CA根目录,若没有则自己创建
cd /etc/pki/CA
 
#创建配置文件信息中所需的目录及文件
mkdir -pv {certs,crl,newcerts,private}
touch {serial,index.txt}

4、 指明证书的开始编号
echo 01 >> serial

5、 生成根证书的私钥(注意:私钥的文件名与存放位置要与配置文件中的设置相匹配)
(umask 077; openssl genrsa -out private/cakey.pem 2048)

  • umask 077:设置权限可写可执行,但不可读
  • genrsa :产生rsa密钥命令
  • out: 输出路径,这里指private/ca.key.pem
  • 2048,指的是密钥的长度位数,默认长度为512位

6、 生成自签证书,即根证书CA,自签证书的存放位置也要与配置文件中的设置相匹配,生成证书时需要填写相应的信息。
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out cacert.pem -days 365

  • new:表示生成一个新证书签署请求
  • x509:专用于CA生成自签证书,如果不是自签证书则不需要此项
  • key:用到的私钥文件
  • out:证书的保存路径
  • days:证书的有效期限,单位是day(天),默认是openssl.cnf的default_days

颁发证书

在需要证书的服务器上生成私钥,然后通过此私钥生成证书签署请求,最后将请求通过可靠的方式发送给根证书CA的主机。根证书CA服务器在拿到证书签署请求后,即可颁发那一服务器的证书。

1、 在需要证书的服务器上,生成证书签署请求

  • 生成私钥,该私钥的位置可随意定
    (umask 077; openssl genrsa -out test.key 2048)

  • 生成证书签署请求
    openssl req -new -key test.key -out test.csr -days 365

2、 在根证书服务器上,颁发证书

  • 颁发证书,即签名证书,生成crt文件
#我们创建一个req文件夹来接受服务器发送过来的文件(签署请求的csr文件、key文件等)
mkdir /etc/pki/CA/req
#颁发证书
openssl ca -in /etc/pki/CA/req/test.csr -out /etc/pki/CA/certs/test.crt -days 365
 
#查看证书信息
openssl x509 -in /etc/pki/CA/certs/test.crt -noout -serial -subject

证书格式转换

1、 格式转换为PFX格式的私钥

  • openssl pkcs12 -export -out test.pfx -inkey test.key -in test.crt
  • inkey的值test.key是需要证书服务器上生成的私钥key文件
  • 需要创建密码,读取该test.pfx文件的时候需要用到改密码

2、 格式转换为cer格式的公钥

openssl x509 -inform pem -in test.crt -outform der -out test.cer
 
#查看cer证书信息
openssl x509 -in test.cer -text -noout
#若报错unable to load certificate,则说明你打开的证书编码是der格式,需要用以下命令
openssl x509 -in test.cer -inform der -text -noout
  • inform pem,由于输入的test.crt文件是以pem编码的,故需要指定以pem编码来读取

  • outform der,输出的test.cer文件需要以der编码

遇到问题

Q:这是什么奇怪的我看不懂的问题,好像就是啥啥都打不开的样子,不能加载根CA的私钥

A:step1:openssl rand -writerand .rnd
step2:诶?好像刚刚查看了openssl.cnf的配置信息,里面有定义证书的存放位置,这和我刚刚保存的位置不太一样啊!
所以,vim /etc/pki/tls/openssl.cnf 编辑配置文件,修改../../CA/etc/pki/CA 就解决啦~

参考链接

证书格式转换
Linux openssl 生成证书的详解

原文地址:https://www.cnblogs.com/orii/p/12708211.html