2020_1课程设计—基于BC的证书格式转换工具的设计与实现—Week1
目录
- 2020_1课程设计—基于BC的证书格式转换工具的设计与实现—Week1
- 任务要求
- Week1 任务安排
- 实践过程
- 学习证书格式的相关知识
- 学习OpenSSL的使用方法
- 安装OpenSSL
- 使用OpenSSL查看证书,并实现证书格式转换
- 创建根证书CA
- 颁发证书
- 证书格式转换
- 遇到问题
- 参考链接
任务要求
- 清楚.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、 各种后缀含义:文件的内容和后缀没有必然的关系,但是一般使用这些后缀来表示这是什么文件。
- CER 或 DER
- 一般指使用DER格式的证书,二进制格式存放
- 只含有证书信息,不包含私钥
- CRT :二进制格式,也可以是文本格式,一般均为文本格式,功能与
.der
和.cer
证书文件相同。 - PFX 或 P12:证书文件,可以是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参数
- 查看KEY的办法:
- 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.pem2048
,指的是密钥的长度位数,默认长度为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
就解决啦~
参考链接
原文地址:https://www.cnblogs.com/orii/p/12708211.html