zoukankan      html  css  js  c++  java
  • 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 生成证书的详解

  • 相关阅读:
    eclipse如何与git 配合工作。
    git托管代码(二)
    PPC2003 安装 CFNET 3.5成功
    我的Window Mobile WCF 項目 第三篇 WM窗体设计
    我的Window Mobile WCF 項目 第一篇Mobile开发和WinForm开发的区别
    我的Window Mobile WCF 項目 第七天
    我的Window Mobile WCF 項目 第二篇 WindowsMobile访问WCF
    WCF 用vs2010 和 vs2008的简单对比测试
    vs2010beta1 和 搜狗输入法 冲突,按下 Ctrl 键就报错,重装搜狗解决
    我的Window Mobile WCF 項目 第六天 (二)
  • 原文地址:https://www.cnblogs.com/orii/p/12708211.html
Copyright © 2011-2022 走看看