通信加密与解密

一、通信加密和解密技术概述

1.1、Bob和Alice的爱情故事

  早些年间,恋人们之间的交往以书信沟通较为频繁,在那个年代,这种恋爱的人叫笔友。假设Bob和Alice正是处于这一时代,Bob和Alice恋爱了,他们两个好不容易走到一起,可是Eve也喜欢Alice,他妒忌他们两个人。于是想方设法的想窃取他们之间的书信联系。某天,Bob和Alice由于一些观念的不统一,闹矛盾了,于是Bob想写一封信向Alice道歉,并合好,信的内容大概是:

对不起,Alice,是我太狭隘,这次我是做错了。希望你能原谅我,我们合好吧。我还是喜欢你。

她们(Bob和Alice)的沟通方式大概图解如下(如果不加密的情况下):
通信加密与解密_第1张图片

  Eve作为第三方窃听者,他可以看到Bob发给Alice的信笺的内容,这样他就可以了解Bob和Alice之间的进展情况。他甚至可以通过一些特殊的手段来修改Bob发给Alice的信笺的内容,更改原来的意思。比如他把信笺的内容修改为以下部分:

Alice,我们分手吧,我们不适合,我不再喜欢你了。

  这样Bob和Alice之间就这样因为Eve的干预可能导致最终Alice心灰意冷,最终和Bob走向一个不好的结局。现在,我们假设,Bob对书信的内容进行加密,然后发送给Alice。
通信加密与解密_第2张图片

以上简单通过Bob与Alice的书信往来简单的说明了一下通信过程中加密与不加密的区别,实际情况远比这要复杂的多。我们先来看看常见的一些术语名词。
 

1.2、常见术语

明文(plaintext):没有加密过的原始内容;
密文(ciphertext):对原始内容经过特殊处理过的内容;

加密(encrypt):对明文经过特殊处理后,可以实现隐藏原始含义的操作;
解密(decrypt):对密文进行处理后,可以看到原始内容含义,是加密的反向过程;

伪装(spoofing):假设自己是某某某,去完成一些不可告人的事情;
否认(repudiation):对自己答应过的事情表示否认;
密码破译(cryptanalysis):简称为破译,有时候叫密码分析,就是可以对加密的数据进行破解;
破译者(cryptanalyst):实现密码破译的人或者机器;

密码算法,简称算法(algorithm):加密和解密过程中用到的规则;

加密算法:从明文生成密文的步骤,表示加密的步骤,加密过程中要用到加密算法;
解密算法:从密文生成明文的步骤,表示解密的步骤,解密过程中要用到解密算法;
密码算法:加密和解密的算法合在一起统称为"密码算法";
密钥(key):密码算法中需要密钥(key);
中间人(man-in-the-middle attack):假设自己是各种身份,与其他人进行伪装通信;假设A和B通信,中间人为C,C对A宣称自己就是B,对B宣称自己就是A;
暴力***(brute-force attack):也叫穷举搜索(exhaustive search),一种用于破解的方式;
单向加密(one way encryption):一种特殊加密方式,可以提取原始数据的特征码或者消息摘要码;
单向散列函数(one-way hash function):单向加密过程中用到的加密函数;
对称密码(symmetric cryptography):对称密码也叫对称加密(symmetric encryption),解密过程和解密过程使用同一个密钥的方式;
非对称密码(asymmetric cryptography):非对称密码也叫非对称加密(asymmetric encryption)或者叫公钥加密(public-key encryption);
密钥对(key pair):公钥加密体系中成对密钥(公钥和私钥);
公钥(public key):可以公开示人的密钥;
私钥(private key):不可以公开示人,要自己好好保留的密钥;
公钥加密算法:公钥加密过程中要用到的算法;
常用的公钥加密算法:RSA,DSA等;
对称加密算法:对称加密过程中要用到的算法;
常用的对称加密算法:DES,3DES,AES,IDEA,CAST5等;

公钥基础设施(Public-key Infrastructure,PKI):与证书颁发,吊销,申请注册等相关的一个庞大体系;
认证(签证)机构(Certification Authority,CA):PKI中的一部分,与证书签署有关的;
注册机构(Registration Authority,RA):对申请者的身份经过验证,并注册公钥成证书的一个机构,是PKI中的一部分;
证书吊销列表(Certificate Revocation List):与证书吊销有关系的,属于PKI中的一部分;
仓库(repository),证书存储库:保存证书的数据库;
证书(certificate):申请人向CA提交申请后,CA向申请人颁发的一种用于验证身份的东西,证书中包含了对应申请人的公钥以及其他相关信息;

数字签名(digital signature)
混合密码系统(hybrid cryptosystem):将对称加密体系和公钥加密体系结合起来的方式;
 

1.3、安全的目标以及常见***类型和解决方案

1、安全的目标有以下几点

  • 保密性(confidentiality)
  • 完整性(integrity)
  • 可用性(availability)

2、现实生活中,常见的***类型
(1) 威胁到保密性的

  • 窃听
  • 通信量分析

(2) 威胁到完整性的

  • 更改
  • 伪装
  • 重放
  • 否认

(3) 威胁到可用性的

  • 拒绝服务器(Dos)

3、解决方案
(1) 通过技术来实现
解密和解密。解密和解密可以分为两大类:

  • 传统加密方法(替代加密方法、置换加密方法等)
  • 现代加密方法(现代块加密方法)

(2) 通过服务来实现
用于抵御***的服务,也即是为了上述安全目标而特地设计的安全服务。

  • 认证机制
  • 访问控制机制

4、密钥算法和协议

  • 对称加密
  • 公钥加密(非对称加密)
  • 单向加密
  • 认证协议

二、对称加密、非对称加密、单向加密以及密钥交换

2.1、对称加密

对称加密就是加密和解密使用同一个密钥。常见的对称加密算法有:

DES:Data Encryption Standard,数据加密标准,已经被破解;
3DES:Triple DES,三重DES,有些场景中也在用,不过DES能被破解,3DES也能被破解;
AES:Advanced Encryption Standard,高级加密标准,比较推荐。
根据密钥长度,它有128bits,192bits,256bits以及384bits的;
还有其他的:
Blowfish,Twofish,IDEA,RC6,CAST5等.

对称加密特点

  • 加密和解密使用同一个密钥;
  • 将原始数据分割为多个固定大小的块(多个分组),逐个进行加密;

对称加密缺点:

  • 密钥过多;
  • 密钥分发困难;

对称加密请看下面图解:
通信加密与解密_第3张图片

2.2、非对称加密

非对称加密又称为公钥加密,它的密钥有公钥和私钥两种,是成对出现的,俗称密钥对儿。

  • 公钥:从私钥中提取产生,可公开给所有人;
  • 私钥:通过工具创建,使用者自己留存,必须保证其私密性;

公钥加密特点:
用公钥加密的数据,只能用与之对应的私钥才能解密;用私钥加密的数据,只能用与之对应的公钥才能解密。
公钥加密用途:

  • 数字签名(主要在于让接受方确认发送方的身份);
  • 密钥交换(发送方用对方的公钥加密一个用于对称加密的密钥,并发送给对方);
  • 数据加密(这里的数据指的是比较大的数据,有公钥加密效率较低,虽然安全,对于生活中的模型,加密大数据还是用对称加密的方式);

公钥加密常见的算法有:
RSA,DSA,ELGamal
RSA: Digital Signature Standard,数据签名标准;
DSA:Digital Signature Algorithm,数据签名算法

公钥加密图解如下:
通信加密与解密_第4张图片

2.3、单向加密

单向加密,即提取数据指纹信息,只能加密,不能解密;(一种计算特征码的方式)
特点:定长输出(不管要加密的数据量有多大),雪崩效应(原始数据微小的改变会导致整个结果彻底发生变化)

主要用途:用于保证数据的完整性(完整性校验);
常见算法有:
md5:Message Digest 5,128bits;
sha家族:
sha1:Secure Hash Algorithm 1,160bits
sha224,224bits
sha384,384bits
sha512,512bits

简单的消息摘要计算如下:
通信加密与解密_第5张图片

通信加密与解密_第6张图片

2.4、密钥交换

常见用于实现密钥交换的有:
DH(Deffie-Hellman)
公钥加密

三、基于openssl来实现通信加解密

3.1、基于TLS和SSL协议的开源实现程序以及基本概述

比较有名的开源实现方案:
GnuPG和OpenSSL
GnuPG官网:https://www.gnupg.org/
OpenSSL官网:https://www.openssl.org/

这里我们只介绍OpenSSL。OpenSSL是为了传输层安全协议(TLS)和安全套接字层(SSL)协议开发的一个开源组件。
功能非常强大,集成了很多密码库。大概包含以下几个部分:

libcrypto,libssl这两个是库;
openssl是多用途命令行工具(也是介绍的重点)。
linux实际上有两个软件包,分别为上面两类应用提供。分别是:

[root@node1 ~]# rpm -qa|grep openssl
openssl-1.0.2k-12.el7.x86_64
openssl-libs-1.0.2k-12.el7.x86_64
[root@node1 ~]# rpm -qi openssl
Name        : openssl
Epoch       : 1
Version     : 1.0.2k
Release     : 12.el7
Architecture: x86_64
Install Date: Tue 16 Oct 2018 07:54:33 PM CST
Group       : System Environment/Libraries
Size        : 833707
License     : OpenSSL
Signature   : RSA/SHA256, Wed 25 Apr 2018 07:32:58 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM  : openssl-1.0.2k-12.el7.src.rpm
Build Date  : Wed 11 Apr 2018 12:59:27 PM CST
Build Host  : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem 
Vendor      : CentOS
URL         : http://www.openssl.org/
Summary     : Utilities from the general purpose cryptography library with TLS implementation
Description :
The OpenSSL toolkit provides support for secure communications between
machines. OpenSSL includes a certificate management tool and shared
libraries which provide various cryptographic algorithms and
protocols.

[root@node1 ~]# rpm -qi openssl-libs
Name        : openssl-libs
Epoch       : 1
Version     : 1.0.2k
Release     : 12.el7
Architecture: x86_64
Install Date: Tue 16 Oct 2018 07:53:33 PM CST
Group       : System Environment/Libraries
Size        : 3200172
License     : OpenSSL
Signature   : RSA/SHA256, Wed 25 Apr 2018 07:33:03 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM  : openssl-1.0.2k-12.el7.src.rpm
Build Date  : Wed 11 Apr 2018 12:59:27 PM CST
Build Host  : x86-01.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem 
Vendor      : CentOS
URL         : http://www.openssl.org/
Summary     : A general purpose cryptography library with TLS implementation
Description :
OpenSSL is a toolkit for supporting cryptography. The openssl-libs
package contains the libraries that are used by various applications which
support cryptographic algorithms and protocols.

其中openssl-libs是分包,它主要是提供基于TLS实现的通用密码库;
openssl主要是提供了与加密,通信安全相关的一些组件,它是一个比较全面的工具包。
它提供的工具包提供了对不同主机时间通信安全的支持,包括证书管理工具以及提供
应用于各种加密算法和协议的共享库。

[root@node1 ~]# rpm -ql openssl-libs
/etc/pki/tls
/etc/pki/tls/certs
/etc/pki/tls/misc
/etc/pki/tls/openssl.cnf
/etc/pki/tls/private
/usr/lib64/.libcrypto.so.1.0.2k.hmac
/usr/lib64/.libcrypto.so.10.hmac
/usr/lib64/.libssl.so.1.0.2k.hmac
/usr/lib64/.libssl.so.10.hmac
/usr/lib64/libcrypto.so.1.0.2k
/usr/lib64/libcrypto.so.10
/usr/lib64/libssl.so.1.0.2k
/usr/lib64/libssl.so.10
/usr/lib64/openssl
/usr/lib64/openssl/engines
/usr/lib64/openssl/engines/lib4758cca.so
/usr/lib64/openssl/engines/libaep.so
/usr/lib64/openssl/engines/libatalla.so
/usr/lib64/openssl/engines/libcapi.so
/usr/lib64/openssl/engines/libchil.so
/usr/lib64/openssl/engines/libcswift.so
/usr/lib64/openssl/engines/libgmp.so
/usr/lib64/openssl/engines/libnuron.so
/usr/lib64/openssl/engines/libpadlock.so
/usr/lib64/openssl/engines/libsureware.so
/usr/lib64/openssl/engines/libubsec.so
/usr/share/licenses/openssl-libs-1.0.2k
/usr/share/licenses/openssl-libs-1.0.2k/LICENSE
[root@node1 ~]# ls -l /usr/lib64/libcrypto.so.10 
lrwxrwxrwx 1 root root 19 Oct 16 19:53 /usr/lib64/libcrypto.so.10 -> libcrypto.so.1.0.2k
[root@node1 ~]# ls -l /usr/lib64/libcrypto.so.1.0.2k 
-rwxr-xr-x 1 root root 2512832 Apr 11  2018 /usr/lib64/libcrypto.so.1.0.2k
[root@node1 ~]# ls -l /usr/lib64/libssl
libssl3.so        libssl.so.10      libssl.so.1.0.2k  
[root@node1 ~]# ls -l /usr/lib64/libssl.so.10 
lrwxrwxrwx 1 root root 16 Oct 16 19:53 /usr/lib64/libssl.so.10 -> libssl.so.1.0.2k
[root@node1 ~]# ls -l /usr/lib64/libssl.so.1.0.2k 
-rwxr-xr-x 1 root root 470360 Apr 11  2018 /usr/lib64/libssl.so.1.0.2k

除此之外,还有一个不是由OpenSSL提供的另外一个与安全相关的包,叫nss:

[root@node1 ~]# rpm -qi nss
Name        : nss
Version     : 3.16.2.3
Release     : 5.el7
Architecture: x86_64
Install Date: Tue 16 Oct 2018 07:05:15 PM CST
Group       : System Environment/Libraries
Size        : 2544424
License     : MPLv2.0
Signature   : RSA/SHA256, Sat 14 Mar 2015 04:20:21 PM CST, Key ID 24c6a8a7f4a80eb5
Source RPM  : nss-3.16.2.3-5.el7.src.rpm
Build Date  : Fri 06 Mar 2015 12:48:15 PM CST
Build Host  : worker1.bsys.centos.org
Relocations : (not relocatable)
Packager    : CentOS BuildSystem 
Vendor      : CentOS
URL         : http://www.mozilla.org/projects/security/pki/nss/
Summary     : Network Security Services
Description :
Network Security Services (NSS) is a set of libraries designed to
support cross-platform development of security-enabled client and
server applications. Applications built with NSS can support SSL v2
and v3, TLS, PKCS #5, PKCS #7, PKCS #11, PKCS #12, S/MIME, X.509
v3 certificates, and other security standards.

[root@node1 ~]# rpm -ql nss
/etc/pki/nssdb
/etc/pki/nssdb/cert8.db
/etc/pki/nssdb/cert9.db
/etc/pki/nssdb/key3.db
/etc/pki/nssdb/key4.db
/etc/pki/nssdb/pkcs11.txt
/etc/pki/nssdb/secmod.db
/usr/lib64/libnss3.so
/usr/lib64/libnssckbi.so
/usr/lib64/libnsspem.so
/usr/lib64/libsmime3.so
/usr/lib64/libssl3.so
/usr/lib64/nss/libnssckbi.so
/usr/share/man/man5/cert8.db.5.gz
/usr/share/man/man5/cert9.db.5.gz
/usr/share/man/man5/key3.db.5.gz
/usr/share/man/man5/key4.db.5.gz
/usr/share/man/man5/pkcs11.txt.5.gz
/usr/share/man/man5/secmod.db.5.gz

3.2、openssl命令行工具

man手册的翻译配合自己的理解:

语法结构:
openssl command [ command_opts ] [ command_args ]
说明:
command表示openssl工具支持的命令;
command_opts表示openssl支持的命令所用到的选项;
command_args是openssl支持命令的参数;

语法结构:
openssl [ list-standard-commands | list-message-digest-commands | list-cipher-commands | list-cipher-
algorithms | list-message-digest-algorithms | list-public-key-algorithms]
说明:
这部分是openssl的伪命令,可以查看可用的命令或算法。

openssl支持的命令分类:
(1) 标准命令(可以通过执行openssl list-standard-commands查看支持的标准命令)
(2) 消息摘要命令(可以通过执行openssl list-message-digest-commands 查看支持的消息摘要命令)
(3) 加密命令(可以通过执行openssl list-cipher-commands 查看支持的加密命令)
(4) 加密算法(可以通过执行openssl list-cipher-algorithms 查看支持的加密算法)
(5) 消息摘要算法(可以通过执行openssl list-message-digest-algorithms 查看支持的消息摘要算法)
(6) 公钥算法(可以通过执行openssl list-public-key-algorithms 查看支持的公钥算法)

OpenSSL是实现安全套接字层(SSL v2/v3)和传输层安全(TLS v1)网络协议及其所需的相关加密标准的加密工具包。
而openssl这个程序是一个可以调用OpenSSL中加密库提供的各种加密函数的命令行工具,它可以做以下事情:
(1) Creation and management of private keys, public keys and parameters
创建和管理私钥、公钥和与之相关的各种参数;
(2) Public key cryptographic operations
公钥加密操作(非对称加密);
(3) Creation of X.509 certificates, CSRs and CRLs
创建标准格式(X.509格式)证书,生成签署请求(CSR格式)以及吊销证书列表(CRL)维护等。
(4) Calculation of Message Digests
计算消息摘要码
(5) Encryption and Decryption with Ciphers
使用密钥加密和解密(对称加解密);
(6) SSL/TLS Client and Server Tests
模拟基于SSL或TLS协议的客户端和服务端进行测试;
(7) Handling of S/MIME signed or encrypted mail
处理基于S/MIME的签名和加密邮件等;
(8) Time Stamp requests, generation and verification
时间戳的请求、生成和验证。

特别说明:查看openssl用法,还可以直接openssl 加一个类似于help或者?等不被openssl不识别的命令
[root@node1 ~]# openssl help
openssl:Error: 'help' is an invalid command.

Standard commands
asn1parse         ca                ciphers           cms               
crl               crl2pkcs7         dgst              dh                
dhparam           dsa               dsaparam          ec                
ecparam           enc               engine            errstr            
gendh             gendsa            genpkey           genrsa            
nseq              ocsp              passwd            pkcs12            
pkcs7             pkcs8             pkey              pkeyparam         
pkeyutl           prime             rand              req               
rsa               rsautl            s_client          s_server          
s_time            sess_id           smime             speed             
spkac             ts                verify            version           
x509              

Message Digest commands (see the `dgst' command for more details)
md2               md4               md5               rmd160            
sha               sha1              

Cipher commands (see the `enc' command for more details)
aes-128-cbc       aes-128-ecb       aes-192-cbc       aes-192-ecb       
aes-256-cbc       aes-256-ecb       base64            bf                
bf-cbc            bf-cfb            bf-ecb            bf-ofb            
camellia-128-cbc  camellia-128-ecb  camellia-192-cbc  camellia-192-ecb  
camellia-256-cbc  camellia-256-ecb  cast              cast-cbc          
cast5-cbc         cast5-cfb         cast5-ecb         cast5-ofb         
des               des-cbc           des-cfb           des-ecb           
des-ede           des-ede-cbc       des-ede-cfb       des-ede-ofb       
des-ede3          des-ede3-cbc      des-ede3-cfb      des-ede3-ofb      
des-ofb           des3              desx              idea              
idea-cbc          idea-cfb          idea-ecb          idea-ofb          
rc2               rc2-40-cbc        rc2-64-cbc        rc2-cbc           
rc2-cfb           rc2-ecb           rc2-ofb           rc4               
rc4-40            rc5               rc5-cbc           rc5-cfb           
rc5-ecb           rc5-ofb           seed              seed-cbc          
seed-cfb          seed-ecb          seed-ofb          zlib  

第一部分是标准命令,第二部分是消息摘要命令,第三部分是(对称)加密命令;

3.2.1、openssl支持的标准命令

可以执行以下命令查看支持的标准命令有哪些:

openssl list-standard-commands
如果要查看这些标准命令用法,可以执行:
whatis COMMAND
看看在man手册的信息后对应查看man手册。

这些标准命令的概述如下:

(1) 命令asn1parse
asn1parse  Parse an ASN.1 sequence.
解析ASN.1序列。
(2)命令ca
Certificate Authority (CA) Management.
证书颁发管理机构。
(3)命令ciphers
Cipher Suite Description Determination.
加密套件描述换算。
请参考:https://blog.csdn.net/as3luyuan123/article/details/13609819
(4)命令cms
CMS (Cryptographic Message Syntax) utility
密码消息语法组件。
The cms command handles S/MIME v3.1 mail. It can encrypt, decrypt, sign and verify, compress and uncompress S/MIME messages.
加密,解密,签名,验证,压缩,解压 S/MIME消息。
关于S/MIME请参考:https://baike.baidu.com/item/%E5%A4%9A%E7%94%A8%E9%80%94%E7%BD%91%E9%99%85%E9%82%AE%E4%BB%B6%E6%89%A9%E5%85%85%E5%8D%8F%E8%AE%AE/266397?fr=aladdin&fromid=8866895&fromtitle=S%2FMIME
(5)命令crl
Certificate Revocation List (CRL) Management.
证书吊销列表管理。
(6)命令crl2pkcs7
CRL to PKCS#7 Conversion.
通过CRL和1个或多个证书,把它们转换成PKCS#7格式。
(7)命令dgst
Message Digest Calculation.
消息摘要(特性码)计算。
(8)命令dh
Diffie-Hellman Parameter Management.  Obsoleted by dhparam.
DH参数管理。建议用dhparam替代它,
(9)命令dhparam
Generation and Management of Diffie-Hellman Parameters. Superseded by genpkey and pkeyparam
生成和管理DH参数,已经被genpkey和pkeyparam所替换。
(10)命令dsa
DSA Data Management.
DSA数据管理。
(11)命令dsaparam
DSA Parameter Generation and Management. Superseded by genpkey and pkeyparam
DSA参数产生和管理。已经被genpkey和pkeyparam所替代。
(12)命令ec
EC (Elliptic curve) key processing
椭圆曲线键处理。
(13)命令ecparam
EC parameter manipulation and generation
椭圆曲线维护和生产。
(14)命令enc
Encoding with Ciphers.
通过密码编码(加密相关)
(15)命令engine
Engine (loadble module) information and manipulation.
(16)命令errstr
Error Number to Error String Conversion.
通过错误编码查找错误的描述。
(17)命令gendh
Generation of Diffie-Hellman Parameters.  Obsoleted by dhparam.
(18)命令gendsa
Generation of DSA Private Key from Parameters. Superseded by genpkey and pkey
从参数文件中生成一个DSA的私钥。被genpkey和pkey所替代。
(19)命令genpkey
Generation of Private Key or Parameters.
产生一个私钥或者一个参数文件。
(20)命令genrsa
Generation of RSA Private Key. Superceded by genpkey.
生成RSA私钥,被genpkey所替代。
(21)命令nseq
Create or examine a netscape certificate sequence
创建或检查一个网景证书序列号。
(22)命令ocsp
Online Certificate Status Protocol utility.
在线证书状态协议组件。
(23)命令passwd
Generation of hashed passwords.
产生一个哈希的密码。
(24)命令pkcs12
 PKCS#12 Data Management.
 PKCS#12 数据管理。
(25)命令pkcs7
PKCS#7 Data Management.
The pkcs7 command processes PKCS#7 files in DER or PEM format.
(26)命令pkcs8
PKCS#8 format private key conversion tool
(27)命令pkey
Public and private key management.
公钥和私钥管理。
示例:
To remove the pass phrase on an RSA private key:(移除RSA私钥的使用密码)
openssl pkey -in key.pem -out keyout.pem
To encrypt a private key using triple DES:(使用3重DES加密一个私钥)
openssl pkey -in key.pem -des3 -out keyout.pem
To convert a private key from PEM to DER format:(把私钥从PEM格式转换成DER格式)
openssl pkey -in key.pem -outform DER -out keyout.der
To print out the components of a private key to standard output:(查看私钥的组成信息)
openssl pkey -in key.pem -text -noout
To print out the public components of a private key to standard output:(查看私钥中关于公钥的组成信息)
openssl pkey -in key.pem -text_pub -noout
To just output the public part of a private key:(提取私钥中的公钥)
openssl pkey -in key.pem -pubout -out pubkey.pem

(28)命令pkeyparam
Public key algorithm parameter management.
公钥算法参数管理。
(29)命令pkeyutl
Public key algorithm cryptographic operation utility.
(30)命令rand
Generate pseudo-random bytes.
生成伪随机字节。
(31)命令req
PKCS#10 X.509 Certificate Signing Request (CSR) Management.
PKCS#10 X.509格式证书的签署请求管理。
(32)命令rsa
RSA key management.
RSA密钥管理。
(33)命令rsautl
RSA utility for signing, verification, encryption, and decryption. Superseded by  pkeyutl
用于RSA算法的签名,验证,加密,解密的组建。
(34)命令s_client
基于SSL/TLS实现的一个用于测试的客户端。要与s_server一起配合使用;
(35)命令s_server
基于SSL/TLS实现的一个用于测试的服务端。要与s_client一起配合使用;
(36)命令s_time
SSL Connection Timer.
SSL连接定时器。
(37)命令sess_id
SSL Session Data Management.
SSL会话数据管理。
(38)命令smime
S/MIME mail processing.
(39)命令speed
 Algorithm Speed Measurement.
算法测速。用于测试加密算法的性能。
(40)命令spkac
SPKAC printing and generating utility
(41)命令ts
 Time Stamping Authority tool (client/server)
 时间戳授权工具。
(42)命令verify
X.509 Certificate Verification.
X.509格式证书的验证。
(43)命令version
查看openssl的版本信息。
(44)命令x509
X.509 Certificate Data Management.
X.509格式证书数据管理。

3.2.2、openssl支持的消息摘要命令

可以执行以下命令查看支持的消息摘要命令有哪些:

openssl list-message-digest-commands
如果要查看这些消息摘要命令用法,可以执行:
whatis COMMAND
看看在man手册的信息后对应查看man手册。

支持的消息摘要命令有以下这些:

md2    MD2 Digest  
md4    MD4 Digest
md5    MD5 Digest
rmd160  RMD-160 Digest
sha     SHA Digest
sha1   SHA-1 Digest
sha224    SHA-224 Digest
sha256    SHA-256 Digest
sha384    SHA-384 Digest
sha512    SHA-512 Digest

3.2.3、openssl支持的对称加密命令

可以执行以下命令查看支持的对称加密命令有哪些:

openssl list-cipher-commands
如果要查看这些消息摘要命令用法,可以执行:
whatis COMMAND
看看在man手册的信息后对应查看man手册。

支持的加密命令有:

aes-128-cbc
aes-128-ecb
aes-192-cbc
aes-192-ecb
aes-256-cbc
aes-256-ecb
##上面这些是基于AES的

base64      Base64 Encoding

bf
bf-cbc
bf-cfb
bf-ecb
bf-ofb
上面这些是基于Blowfish的

camellia-128-cbc
camellia-128-ecb
camellia-192-cbc
camellia-192-ecb
camellia-256-cbc
camellia-256-ecb
上面这些是基于camellia的

cast
cast-cbc
上面这些是基于CAST的

cast5-cbc
cast5-cfb
cast5-ecb
cast5-ofb
上面这些是基于CAST5的

des
des-cbc
des-cfb
des-ecb
des-ede
des-ede-cbc
des-ede-cfb
des-ede-ofb
des-ofb
上面这些是基于DES的

des3
des-ede3
des-ede3-cbc
des-ede3-cfb
des-ede3-ofb
上面这些是基于Triple-DES的

desx

idea
idea-cbc
idea-cfb
idea-ecb
idea-ofb
上面是这些是基于IDEA的

rc2
rc2-40-cbc
rc2-64-cbc
rc2-cbc
rc2-cfb
rc2-ecb
rc2-ofb
上面这些是基于RC2的

rc4
rc4-40
上面这些是基于RC4的

rc5
rc5-cbc
rc5-cfb
rc5-ecb
rc5-ofb
上面这些是基于RC5的

seed
seed-cbc
seed-cfb
seed-ecb
seed-ofb
上面这写是基于seed的
zlib

3.2.4、openssl支持的对称加密算法

可以执行以下命令查看支持的对称加密算法有哪些:

openssl list-cipher-algorithms

算法大概有:

AES-128-CBC
AES-128-CBC-HMAC-SHA1
AES-128-CBC-HMAC-SHA256
AES-128-CFB
AES-128-CFB1
AES-128-CFB8
AES-128-CTR
AES-128-ECB
AES-128-OFB
AES-128-XTS
AES-192-CBC
AES-192-CFB
AES-192-CFB1
AES-192-CFB8
AES-192-CTR
AES-192-ECB
AES-192-OFB
AES-256-CBC
AES-256-CBC-HMAC-SHA1
AES-256-CBC-HMAC-SHA256
AES-256-CFB
AES-256-CFB1
AES-256-CFB8
AES-256-CTR
AES-256-ECB
AES-256-OFB
AES-256-XTS
AES128 => AES-128-CBC
AES192 => AES-192-CBC
AES256 => AES-256-CBC
BF => BF-CBC
BF-CBC
BF-CFB
BF-ECB
BF-OFB
CAMELLIA-128-CBC
CAMELLIA-128-CFB
CAMELLIA-128-CFB1
CAMELLIA-128-CFB8
CAMELLIA-128-ECB
CAMELLIA-128-OFB
CAMELLIA-192-CBC
CAMELLIA-192-CFB
CAMELLIA-192-CFB1
CAMELLIA-192-CFB8
CAMELLIA-192-ECB
CAMELLIA-192-OFB
CAMELLIA-256-CBC
CAMELLIA-256-CFB
CAMELLIA-256-CFB1
CAMELLIA-256-CFB8
CAMELLIA-256-ECB
CAMELLIA-256-OFB
CAMELLIA128 => CAMELLIA-128-CBC
CAMELLIA192 => CAMELLIA-192-CBC
CAMELLIA256 => CAMELLIA-256-CBC
CAST => CAST5-CBC
CAST-cbc => CAST5-CBC
CAST5-CBC
CAST5-CFB
CAST5-ECB
CAST5-OFB
DES => DES-CBC
DES-CBC
DES-CFB
DES-CFB1
DES-CFB8
DES-ECB
DES-EDE
DES-EDE-CBC
DES-EDE-CFB
DES-EDE-OFB
DES-EDE3
DES-EDE3-CBC
DES-EDE3-CFB
DES-EDE3-CFB1
DES-EDE3-CFB8
DES-EDE3-OFB
DES-OFB
DES3 => DES-EDE3-CBC
DESX => DESX-CBC
DESX-CBC
IDEA => IDEA-CBC
IDEA-CBC
IDEA-CFB
IDEA-ECB
IDEA-OFB
RC2 => RC2-CBC
RC2-40-CBC
RC2-64-CBC
RC2-CBC
RC2-CFB
RC2-ECB
RC2-OFB
RC4
RC4-40
RC4-HMAC-MD5
RC5 => RC5-CBC
RC5-CBC
RC5-CFB
RC5-ECB
RC5-OFB
SEED => SEED-CBC
SEED-CBC
SEED-CFB
SEED-ECB
SEED-OFB
AES-128-CBC
AES-128-CBC-HMAC-SHA1
AES-128-CBC-HMAC-SHA256
id-aes128-CCM
AES-128-CFB
AES-128-CFB1
AES-128-CFB8
AES-128-CTR
AES-128-ECB
id-aes128-GCM
AES-128-OFB
AES-128-XTS
AES-192-CBC
id-aes192-CCM
AES-192-CFB
AES-192-CFB1
AES-192-CFB8
AES-192-CTR
AES-192-ECB
id-aes192-GCM
AES-192-OFB
AES-256-CBC
AES-256-CBC-HMAC-SHA1
AES-256-CBC-HMAC-SHA256
id-aes256-CCM
AES-256-CFB
AES-256-CFB1
AES-256-CFB8
AES-256-CTR
AES-256-ECB
id-aes256-GCM
AES-256-OFB
AES-256-XTS
aes128 => AES-128-CBC
aes192 => AES-192-CBC
aes256 => AES-256-CBC
bf => BF-CBC
BF-CBC
BF-CFB
BF-ECB
BF-OFB
blowfish => BF-CBC
CAMELLIA-128-CBC
CAMELLIA-128-CFB
CAMELLIA-128-CFB1
CAMELLIA-128-CFB8
CAMELLIA-128-ECB
CAMELLIA-128-OFB
CAMELLIA-192-CBC
CAMELLIA-192-CFB
CAMELLIA-192-CFB1
CAMELLIA-192-CFB8
CAMELLIA-192-ECB
CAMELLIA-192-OFB
CAMELLIA-256-CBC
CAMELLIA-256-CFB
CAMELLIA-256-CFB1
CAMELLIA-256-CFB8
CAMELLIA-256-ECB
CAMELLIA-256-OFB
camellia128 => CAMELLIA-128-CBC
camellia192 => CAMELLIA-192-CBC
camellia256 => CAMELLIA-256-CBC
cast => CAST5-CBC
cast-cbc => CAST5-CBC
CAST5-CBC
CAST5-CFB
CAST5-ECB
CAST5-OFB
des => DES-CBC
DES-CBC
DES-CFB
DES-CFB1
DES-CFB8
DES-ECB
DES-EDE
DES-EDE-CBC
DES-EDE-CFB
DES-EDE-OFB
DES-EDE3
DES-EDE3-CBC
DES-EDE3-CFB
DES-EDE3-CFB1
DES-EDE3-CFB8
DES-EDE3-OFB
DES-OFB
des3 => DES-EDE3-CBC
desx => DESX-CBC
DESX-CBC
id-aes128-CCM
id-aes128-GCM
id-aes128-wrap
id-aes128-wrap-pad
id-aes192-CCM
id-aes192-GCM
id-aes192-wrap
id-aes192-wrap-pad
id-aes256-CCM
id-aes256-GCM
id-aes256-wrap
id-aes256-wrap-pad
id-smime-alg-CMS3DESwrap
idea => IDEA-CBC
IDEA-CBC
IDEA-CFB
IDEA-ECB
IDEA-OFB
rc2 => RC2-CBC
RC2-40-CBC
RC2-64-CBC
RC2-CBC
RC2-CFB
RC2-ECB
RC2-OFB
RC4
RC4-40
RC4-HMAC-MD5
rc5 => RC5-CBC
RC5-CBC
RC5-CFB
RC5-ECB
RC5-OFB
seed => SEED-CBC
SEED-CBC
SEED-CFB
SEED-ECB
SEED-OFB

上面的加密算法大概有AES,DES,Blowfish,CAST,IDEA,RC2,RC5等这些都是分组加密算法;
RC4是流加密算法。分组加密算法都支持密码本模式(ECB),加密分组链接模式(CBC),加密反馈模式(CFB),
以及输出返回模式(OFB).其中DES,CAST等都有其演变版本,比如3重DES,CAST5等。具体使用请参照
对称加密算法配合对称加密命令使用。上边出现的这种形式“from => to”表示别名的含义,例如:
rc5 => RC5-CBC
表示rc5实际上用的是RC5-CBC

3.2.5、openssl支持的消息摘要算法

可以执行以下命令查看支持的消息摘要算法有哪些:

openssl list-message-digest-commands
如果要查看这些消息摘要算法用法,可以执行:
whatis COMMAND
看看在man手册的信息后对应查看man手册。

支持的消息摘要算法:

DSA
DSA-SHA
DSA-SHA1 => DSA
DSA-SHA1-old => DSA-SHA1
DSS1 => DSA-SHA1
MD4
MD5
RIPEMD160
RSA-MD4 => MD4
RSA-MD5 => MD5
RSA-RIPEMD160 => RIPEMD160
RSA-SHA => SHA
RSA-SHA1 => SHA1
RSA-SHA1-2 => RSA-SHA1
RSA-SHA224 => SHA224
RSA-SHA256 => SHA256
RSA-SHA384 => SHA384
RSA-SHA512 => SHA512
SHA
SHA1
SHA224
SHA256
SHA384
SHA512
DSA
DSA-SHA
dsaWithSHA1 => DSA
dss1 => DSA-SHA1
ecdsa-with-SHA1
MD4
md4WithRSAEncryption => MD4
MD5
md5WithRSAEncryption => MD5
ripemd => RIPEMD160
RIPEMD160
ripemd160WithRSA => RIPEMD160
rmd160 => RIPEMD160
SHA
SHA1
sha1WithRSAEncryption => SHA1
SHA224
sha224WithRSAEncryption => SHA224
SHA256
sha256WithRSAEncryption => SHA256
SHA384
sha384WithRSAEncryption => SHA384
SHA512
sha512WithRSAEncryption => SHA512
shaWithRSAEncryption => SHA
ssl2-md5 => MD5
ssl3-md5 => MD5
ssl3-sha1 => SHA1
whirlpool

3.2.6、openssl支持的公钥加密算法

可以执行以下命令查看支持的公钥加密算法有哪些:

openssl list-public-key-algorithms

公钥加密算法有:

Name: OpenSSL RSA method
    Type: Builtin Algorithm
    OID: rsaEncryption
    PEM string: RSA
Name: rsa
    Type: Alias to rsaEncryption
Name: OpenSSL PKCS#3 DH method
    Type: Builtin Algorithm
    OID: dhKeyAgreement
    PEM string: DH
Name: dsaWithSHA
    Type: Alias to dsaEncryption
Name: dsaEncryption-old
    Type: Alias to dsaEncryption
Name: dsaWithSHA1-old
    Type: Alias to dsaEncryption
Name: dsaWithSHA1
    Type: Alias to dsaEncryption
Name: OpenSSL DSA method
    Type: Builtin Algorithm
    OID: dsaEncryption
    PEM string: DSA
Name: OpenSSL EC algorithm
    Type: Builtin Algorithm
    OID: id-ecPublicKey
    PEM string: EC
Name: OpenSSL HMAC method
    Type: Builtin Algorithm
    OID: hmac
    PEM string: HMAC
Name: OpenSSL CMAC method
    Type: Builtin Algorithm
    OID: cmac
    PEM string: CMAC
Name: OpenSSL X9.42 DH method
    Type: Builtin Algorithm
    OID: X9.42 DH
    PEM string: X9.42 DH

3.3、openssl 命令,算法等综合介绍

关于openssl常见的问题解答(英):
https://www.openssl.org/docs/faq.html
在线阅读官网推荐阅读书籍(英):
https://www.feistyduck.com/library/openssl-cookbook/online/

各版本的变更:
https://github.com/openssl/openssl/blob/master/CHANGES

3.3.1、标准命令version

查看OpenSSL版本信息的命令;
openssl version 为常用形式。简单查看版本信息,可以配置的选项有:
-a 查看所有信息;
-v 查看当前的OpenSSL的版本(默认);
-b 查看当前版本的OpenSSL编译的日期;
-o 查看库被编译时候的各种选项设置信息;
-p 查看平台设置信息;
-d 查看OPENSSLDIR设置,即openssl的配置文件路径;
openssl version -a
openssl version -v
openssl version -b

CentOS  6.x版本:
OpenSSL 1.0.1e-fips

CentOS 7.x版本:
OpenSSL 1.0.2k-fips

3.3.2、标准命令enc

enc - symmetric cipher routines
enc - 对称加密列程

既然是对称加密,自然要知道对称加密的算法,在前边的部分,与加密相关的命令都可以使用该标准命令。
openssl enc -ciphername [-in filename] [-out filename] [-e] [-d] [-a/-base64] [-A] [-k password] [-kfile filename]
[-K key] [-iv IV] [-S salt] [-salt] [-nosalt]
这里的-ciphername 表明要指明的对称加密算法或者叫对应加密命令。对应关系表:
下边的第一列表示openssl可选的ciphername值,后边对可选值进行来注解
================================================================
base64             Base 64
bf-cbc             Blowfish in CBC mode
bf                 Alias for bf-cbc
bf-cfb             Blowfish in CFB mode
bf-ecb             Blowfish in ECB mode
bf-ofb             Blowfish in OFB mode
cast-cbc           CAST in CBC mode
cast               Alias for cast-cbc
cast5-cbc          CAST5 in CBC mode
cast5-cfb          CAST5 in CFB mode
cast5-ecb          CAST5 in ECB mode
cast5-ofb          CAST5 in OFB mode
des-cbc            DES in CBC mode
des                Alias for des-cbc
des-cfb            DES in CBC mode
des-ofb            DES in OFB mode
des-ecb            DES in ECB mode
des-ede-cbc        Two key triple DES EDE in CBC mode
des-ede            Two key triple DES EDE in ECB mode
des-ede-cfb        Two key triple DES EDE in CFB mode
des-ede-ofb        Two key triple DES EDE in OFB mode
des-ede3-cbc       Three key triple DES EDE in CBC mode
des-ede3           Three key triple DES EDE in ECB mode
des3               Alias for des-ede3-cbc
des-ede3-cfb       Three key triple DES EDE CFB mode
des-ede3-ofb       Three key triple DES EDE in OFB mode
desx               DESX algorithm.
gost89             GOST 28147-89 in CFB mode (provided by ccgost engine)
gost89-cnt        `GOST 28147-89 in CNT mode (provided by ccgost engine)
idea-cbc           IDEA algorithm in CBC mode
idea               same as idea-cbc
idea-cfb           IDEA in CFB mode
idea-ecb           IDEA in ECB mode
idea-ofb           IDEA in OFB mode
rc2-cbc            128 bit RC2 in CBC mode
rc2                Alias for rc2-cbc
rc2-cfb            128 bit RC2 in CFB mode
rc2-ecb            128 bit RC2 in ECB mode
rc2-ofb            128 bit RC2 in OFB mode
rc2-64-cbc         64 bit RC2 in CBC mode
rc2-40-cbc         40 bit RC2 in CBC mode
rc4                128 bit RC4
rc4-64             64 bit RC4
rc4-40             40 bit RC4
rc5-cbc            RC5 cipher in CBC mode
rc5                Alias for rc5-cbc
rc5-cfb            RC5 cipher in CFB mode
rc5-ecb            RC5 cipher in ECB mode
rc5-ofb            RC5 cipher in OFB mode
aes-[128|192|256]-cbc  128/192/256 bit AES in CBC mode
aes-[128|192|256]      Alias for aes-[128|192|256]-cbc
aes-[128|192|256]-cfb  128/192/256 bit AES in 128 bit CFB mode
aes-[128|192|256]-cfb1 128/192/256 bit AES in 1 bit CFB mode
aes-[128|192|256]-cfb8 128/192/256 bit AES in 8 bit CFB mode
aes-[128|192|256]-ecb  128/192/256 bit AES in ECB mode
aes-[128|192|256]-ofb  128/192/256 bit AES in OFB mode
========================================================================
有两种方式,如果要显示指明enc命令,后边的加密算法要以短破折号的形式给出(openssl enc -ciphername);例如openssl enc -des3 .....
另外一种方式就是省略enc命令,然后算法不能以段破折号的形式给出(openssl ciphername),例如openssl des3 .....
推荐使用第一种方式(openssl enc -ciphername)

选项:
-in filename
指明要加密的文件,默认是标准输入;
-out filename
指明加密后的文件,默认是标准输出;
-pass arg
指明获取密码的方式。有以下几种:
(1) pass:password
password表示要设置的密码。
(2) env:var
密码为环境变量var的值;(记得要用export把变量导出)
(3) file:pathname
文件pathname中的第一行为密码;
(4) fd:number
从文件描述符number中读取密码;
(5) stdin
从标准输入中请求密码。

-salt
加点盐/杂质,更加安全。在密钥推导过程中加点杂质。
默认选项,不指明也会使用。
-nosalt
不加盐或杂质,不建议使用。除非为了兼容或测试。
-S salt
用户自己指定要加的盐或杂质的串。用户指明的盐值必须是16进制的字符串。
指定的杂质16进制的字符个数长度最大为16(可以使用openssl rand -hex 8 来产生最大长度)
生成随机16进制指定长度(这里以2字节为例,2字节为二进制的16位,每4位二进制可以由一位16进制表示,
那么一共结果有4位16进制数)的字符串如下:
openssl rand -hex 2   #后边会讲解rand的标准命令用法
-e
表明本次过程是加密输入数据。默认选项,默认就是加密。
-d
表明本次过程是解密输入数据。
-a或-base64
表明加密使用base64编码。如果加密的时候有指定,解密的时候也要指定(如果有人为转编码格式另说)。
默认不指定使用base64编码,加密的文件是二进制格式的,如果使用base64编码后,格式是ASCII文本格式的。
-A
如果指定来base64位编码,那么将会在在一行处理base64位数据。
有个问题,-A选项配合大文件加解密的时候会有问题,所以建议使用-a或者--base64
-k password
命令行指定对称加密过程中用到的密码。这是一个兼容选项,建议使用-pass
-kfile filename
从filename中读取第一行作为密码。这是一个兼容选项,建议使用-pass

示例:
(1) 
Just base64 encode a binary file:(使用base64编码一个二进制文件)
openssl base64 -in file.bin -out file.b64       #file.bin是存在的一个二进制文件,file.b64是编码后ASCII格式的文本
文件。-e是默认选项,所以可以省略。
Decode the same file (从base64编码文件中解码出二进制格式文件)
openssl base64 -d -in file.b64 -out file.bin
(2)
Encrypt a file using triple DES in CBC mode using a prompted password: 使用CBC模式的3DES对称加密算法
加密文件file.txt,并且密钥(密码)通过交互式给出。
openssl des3 -salt -in file.txt -out file.des3
Decrypt a file using a supplied password:(加密文件时显式的指明密码)
openssl des3 -d -salt -in file.des3 -out file.txt -k mypassword   #-k显式指定密码 
(3)
Encrypt a file then base64 encode it (so it can be sent via mail for example) using Blowfish in CBC mode:
使用CBC模式的Blowfish算法,配合base64编码加密文件
openssl bf -a -salt -in file.txt -out file.bf
Base64 decode a file then decrypt it:(使用base64解码然后解密文件)
openssl bf -d -salt -a -in file.bf -out file.txt

3.3.3、标准命令rand

产生随机字节。
openssl rand [-out file] [-base64] [-hex] num

选项:
-out file 把产生的随机数写入到文件而非标准输出;
-base64 以base64位编码
-hex 16进制字符串

openssl rand -out text.txt -hex 8  8字节长度,16进制随机字符串输出到text.txt文件中;
openssl rand -hex 8   #8字节长度,16进制随机字符串输出到标准输出
openssl rand -base64 12 #base64编码格式字符串,12字节长度的随机字符串,输出到标准输出。

[root@node1 ~]# openssl rand -hex 8
94244cbc281ac399
输出结果有16个16进制的字符,每个16进制字符转换成二进制可以由4位二进制数表示。
指定的长度为8字节,所以有64位二进制数字(1字节对应8位)。
16*4=64刚好符合给定的长度。

3.3.4、标准命令passwd

计算密码哈希值
openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] {password}

选项:

-crypt UNIX标准加密算法(默认值),表示生成标准的unix口令密文。 (如果加盐(-salt)算密码,只取盐的前2位,2位后面的所有字符都忽略,而且密码的长度位数不能超过8位)
-1  基于BSD的MD5算法
-apr1 apache的md5密文口令,不能与-1共同使用,实质还是md5
-salt string  指定要加的盐的字符串
-in file 从文件中读取密码
-noverify 不验证从终端读取的密码
-quiet 当给定密码长度过长而被截断的时候,不会打印警告信息

openssl passwd -1 -salt abcd yanhui.com

3.3.5、标准命令genrsa(重点)

产生一个RSA私钥;
openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]
选项:
-out filename
将输出结果写到指定文件中,默认是直接打印到标准输出。
-passout arg
指明获取密码的方式。有以下几种:
(1) pass:password
password表示要设置的密码。
(2) env:var
密码为环境变量var的值;(记得要用export把变量导出)
(3) file:pathname
文件pathname中的第一行为密码;
(4) fd:number
从文件描述符number中读取密码;
(5) stdin
从标准输入中请求密码。

-des|-des3|-idea
生成的私钥使用des方式进行加密;
生成的私钥使用3des方式进行加密;
生成的秘钥使用idea方式进行加密;
-F4|-3
选择实现过程中使用的指数的值,可以选择的值为65537(-F4)或3(-3)
默认值为65537
-rand file(s)
产生随机数的种子文件。使用的比较少。
-engine id
指定三方的加密库或硬件。
numbits
以bit为单位表示生成的私钥的大小。该值必须写在最后。
默认是512bit

示例1:
openssl genrsa -out mykey1.key -passout pass:123456 512
echo -e "654321\n234561" >>/tmp/pass.txt
export mypass="yanhui.com"
openssl genrsa -out mykey2.key -passout file:/tmp/pass.txt 512
openssl genrsa -out mykey3.key -passout env:mypass 512

示例2:
openssl genrsa -out mykey.key -idea -F4 1024    #交互式提示输入用户输入密码,可以为空。(有密码,每次
使用私钥文件要键入密码。)
示例3:
openssl genrsa -out mykey.key -des3 -passout pass:yanhui.com 2048
示例4:
openssl genrsa -out mykey.key -des -passout stdin 1024  #阻塞等待用户键入密码,没有交互式提示
示例5(私钥一般权限要控制为600,或者400。可以配合umask在子shell中执行)
[root@node1 ~]# (umask 077;openssl genrsa -out yanhui.pem 2048)
Generating RSA private key, 2048 bit long modulus
..............................................................................+++
..........................................+++
e is 65537 (0x10001)
[root@node1 ~]# ls -l yanhui.pem 
-rw------- 1 root root 1675 Nov  9 16:39 yanhui.pem

3.3.6、标准命令dsaparam

生成、处理DSA密钥参数,
也可以直接生成DSA密钥;
用gendsa之前要先了解dsaparam,因为需要先用dsaparam生成需要的密钥参数。
openssl dsaparam [-inform DER|PEM] [-outform DER|PEM] [-in filename] [-out filename] [-noout] [-text] [-C] [-genkey] [numbits]
选项:
-inform DER|PEM
输入格式,DER或PEM。DER格式以.der为后缀的格式,PEM格式以.pem为后缀的格式;
-outform DER|PEM
输出格式,DER或PEM。指定格式der或pem 书写格式忽略字符大小写。
关于DER和PEM格式:
der类型的不用在编码解码,直接就是二进制的数据可以直接使用;
pem类型的数据要根据base64编码解码后,得到的数据需要进行增加或裁剪
特殊字符-、\n、\r、begin信息、end信息等。

-in filename
指明要读参数的来源,默认是从标准输入中获取,指定该参数表示从文件中读取。
如果显式指定了numbits,该参数会被忽略。
-out filename
指定输出的文件。默认是标准输出。
-noout
禁止编码版本的参数的输出。
查看的文件不能是DER格式的。
-text
易读的方式打印DSA参数。关于私钥中的P,Q,G参数值,请参考:
https://baike.baidu.com/item/DSA%E7%AE%97%E6%B3%95/10856660?fr=aladdin
涉及到了数学知识。
查看的文件不能是DER格式的。

-C 
把参数(P,Q,G)转换成C代码。
P,Q,G参数部分会转换成C代码。
-genkey
产生一个DSA私钥。

numbits
长度。必须是最后一个参数。

参考:
示例1:生成1024位的密钥参数
openssl dsaparam -out mydsaparam.pem 1024
明文查看密钥参数的值:
openssl dsaparam -in mydsaparam.pem -text -noout
示例2:密钥参数格式间的转换
(1) PEM格式的密钥参数转为DER格式
openssl dsaparam -inform PEM -outform DER -in mydsaparam.pem -out mydsaparam.der
(2) DER格式的密钥参数转为PEM格式
openssl dsaparam -in mydsaparam.der -inform DER -outform PEM -out mydsaparam.pem
示例3:生成DSA私钥
openssl dsaparam -genkey -out mykey.pem 1024

3.3.7、标准命令gendsa

从DSA参数文件中生成一个DSA私钥。
openssl gendsa [-out filename] [-des] [-des3] [-idea] [paramfile]

选项:

-des|-des3|-idea
指定私钥的加密方式。建议使用后两种(des3,idea),如果不指定这里的选项,不会加密私钥。
貌似指定三者之一后,表示加密,而且必须要提供一个至少4个且至多1024个字符作为密码。

paramfile   
指明生成dsa私钥时候使用的dsa参数文件(openssl dsaparam可以产生),参数文件中有定义
dsa私钥的长度。dsa参数文件格式要是PEM格式的,如果是DSA格式的DSA参数文件,先要对其
做格式转换。

示例1:配合参数文件生成DSA私钥
[root@node1 ~]# openssl dsaparam -out mydsaparam.pem 1024
Generating DSA parameters, 1024 bit long prime
This could take some time
.......+........+...+.....+......+..............+..........+.+..+..+....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
....+.......+...............+........+..+.......+.............................+.....................+......+...........+..............+.................+........+.......................+.+..........................+..........+....+..+...+..........+..............+.+........+................+...+......+.+...........+...........+.............+...........+..........+....+.........................+.......+.........+........+................+.........................+...+..+...+.....+.............+........+...+..............+.........+...+..+.+.....+........+.......+...+................+....+....................+.+...........+.+.+.+.....+.......+..............+.......+.............+..........+.................+....+......+..........+............+.+...............+.........+................+........+.+......+......+.....+..........+.....+.........+.....+........+..+.................+..+......................+.....+.......+.....+......+...+.....+.........+...+........+..........................+........+...+......+.............+.........+...+....+.........................+...+....+....+.....+.......+..........................+.+.......+.+........+.........+.+.............+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*
[root@node1 ~]# ls -l mydsaparam.pem 
-rw-r--r-- 1 root root 455 Nov  9 16:44 mydsaparam.pem
[root@node1 ~]# openssl gendsa -out yanhuidsa.pem mydsaparam.pem 
Generating DSA key, 1024 bits
[root@node1 ~]# ls -l yanhuidsa.pem 
-rw-r--r-- 1 root root 668 Nov  9 16:44 yanhuidsa.pem
[root@node1 ~]# (umask 077;openssl gendsa -out new_yanhuidsa.pem mydsaparam.pem)
Generating DSA key, 1024 bits
[root@node1 ~]# ls -l new_yanhuidsa.pem 
-rw------- 1 root root 668 Nov  9 16:45 new_yanhuidsa.pem

3.3.8、标准命令rsa(重点)

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]

选项:
-inform DER|NET|PEM  输入格式为DER或NET或PEM,格式转换时候的一个常用选项)
-outform DER|NET|PEM (输出格式为DER或NET或PEM,格式转换时候的一个常用选项)
-in filename 指定输入文件(私钥文件)。

-passin arg
the input file password source.
输入文件的密码来源;
用在为私钥增加使用密码的时候,指明密码来源的方式。
指明获取密码的方式。有以下几种:
(1) pass:password
password表示要设置的密码。
(2) env:var
密码为环境变量var的值;(记得要用export把变量导出)
(3) file:pathname
文件pathname中的第一行为密码;
(4) fd:number
从文件描述符number中读取密码;
(5) stdin
从标准输入中请求密码。
-passout password
the output file password source.
输出文件的密码来源。用来去掉密码过程中,原先的私钥使用要输入密码,去掉密码。
可以指定这个参数指定原先的密码。

指明获取密码的方式。有以下几种:
(1) pass:password
password表示要设置的密码。
(2) env:var
密码为环境变量var的值;(记得要用export把变量导出)
(3) file:pathname
文件pathname中的第一行为密码;
(4) fd:number
从文件描述符number中读取密码;
(5) stdin
从标准输入中请求密码。

-out filename
指定生成的私钥保存的文件名,默认输出到标准输出。
注意产生私钥文件的权限,用户属组,其他者不能有权限,而且拥有者不能带有执行权限。
建议设置成600。
-sgckey
指定SGC编码格式,兼容老版本,不应再使用
-des|-des3|-idea|-seed|-aes128
使用des,des3,idea,seed或加密输出的文件。
-text
除了编码的信息之外,以文本形式输出各种公钥或私钥的组件信息。
可以理解为参数。
-noout
禁止私钥的编码后的字符串的输出。
-modulus
输出私钥的计算过程中的临时指数值。
-check
检查RSA私钥的一致性。
-pubin
默认情况,会从文件中读取私钥,指定该选项后,会从文件中读取公钥。
-pubout
默认情况,私钥输出。指定该选项,表示输出公钥。如果读入的文件就是一个公钥,
这个选项自动被指定。

示例:
先生成一个不加密的私钥文件:
(umask 077;openssl genrsa -out mykey.pem 1024)
查看私钥中的各个参数:
openssl rsa -in mykey.pem -text -noout
为私钥增加使用密码:
openssl rsa -in mykey.pem -des3 -passout pass:yanhui.com -out e_myrsa.pem
可以把刚才的查看私钥的参数信息命令再执行一遍,这时候会提示使用密码。
删除私钥的使用密码:
openssl rsa -in e_myrsa.pem -passin pass:yanhui.com -out p_myrsa.pem
可以用同样的方法验证p_myrsa.pem私钥。或者比较p_myrsa.pem和mykey.pem的md5值是否相同。
生成一个指定算法加密且有使用密码的私钥文件yanhui.pem(算法用3des,密码就是123456):
openssl genrsa -des3 -passout pass:123456 -out yanhui.pem
修改指定算法为aes128,口令为654321:
openssl rsa -in yanhui.pem -passin pass:123456 -aes128 -passout pass:654321 -out new_yanhui.pem
提取私钥中的公钥并且查看提取公钥的相关信息
openssl rsa -in new_yanhui.pem -passin pass:654321 -pubout
openssl rsa -in new_yanhui.pem -passin pass:654321 -pubout -out newyanhuipub.pem
openssl rsa -in newyanhuipub.pem -pubin -modulus -noout
转换私钥格式:
(1) 把PEM格式转换成DER格式
openssl rsa -in new_yanhui.pem -passin pass:654321 -aes128 -passout pass:123456 -outform DER -out new_yanhui.der
(2) 把DER格式转换成PEM格式
openssl rsa -in new_yanhui.der -inform DER -passin pass:123456 -des3 -passout pass:yanhui.com -out new_yanhui_rsa.pem

3.3.9、标准命令dsa

openssl dsa [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout arg]
[-aes128] [-aes192] [-aes256] [-camellia128] [-camellia192] [-camellia256] [-des] [-des3] [-idea] [-text]
[-noout] [-pubin] [-pubout]

选项:
-inform DER|PEM
-outform DER|PEM
-in filename
-passin arg
-out filename
-passout arg
-aes128|-aes192|-aes256|-camellia128|-camellia192|-camellia256|-des|-des3|-idea
-text
-noout
-pubout
-pubin

上边选项和rsa一样,这里不一 一说明。

示例:
先生成一个不加密的dsa私钥文件:(要提前生成一个dsa的参数文件)
openssl dsaparam -out mydsaparam_file1 1024
(umask 077;openssl gendsa -out mydsa.pem mydsaparam_file1)

查看私钥中的各个参数:
openssl dsa -in mydsa.pem -text -noout
为私钥增加使用密码:
openssl dsa -in mydsa.pem -aes128 -passout pass:yanhui.com -out e_mydsa.pem
可以把刚才的查看私钥的参数信息再执行一遍,这时候会提示使用密码。
删除私钥的使用密码:
openssl dsa -in e_mydsa.pem -passin pass:yanhui.com -out p_mydsa.pem
可以用同样的方法验证p_myrsa.pem私钥。或者比较p_mydsa.pem和mydsa.pem的md5值是否相同。
生成一个指定算法加密且有使用密码的私钥文件yanhui.pem(算法用3des,密码就是123456):
openssl dsaparam -out yanhuidsaparam1 1024
(umask 077;openssl gendsa -des3 -passout pass:123456 -out yanhui.pem yanhuidsaparam1)
修改指定算法为aes128,口令为654321:
openssl dsa -in yanhui.pem -passin pass:123456 -aes128 -passout pass:654321 -out new_yanhui.pem
提取私钥中的公钥并且查看提取公钥的相关信息
openssl dsa -in new_yanhui.pem -passin pass:654321 -pubout
openssl dsa -in new_yanhui.pem -passin pass:654321 -pubout -out newyanhuipub.pem
openssl dsa -in newyanhuipub.pem -pubin -modulus -noout

转换私钥格式:
(1) 把PEM格式转换成DER格式
openssl dsa -in new_yanhui.pem -passin pass:654321 -aes128 -passout pass:123456 -outform DER -out new_yanhui.der
(2) 把DER格式转换成PEM格式
openssl dsa -in new_yanhui.der -inform DER -passin pass:123456 -des3 -passout pass:yanhui.com -out new_yanhui_dsa.pem

3.3.10、标准命令dgst(重点)

sha, sha1, ripemd160, sha224, sha256, sha384, sha512, md4, md5, dss1 - message digests(常见消息摘要算法)

openssl dgst [-sha|-sha1|-mdc2|-ripemd160|-sha224|-sha256|-sha384|-sha512|-md2|-md4|-md5|-dss1] [-c] [-d]
[-hex] [-binary] [-r] [-non-fips-allow] [-out filename] [-sign filename] [-keyform arg] [-passin arg] [-verify
filename] [-prverify filename] [-signature filename] [file...]

openssl [digest] [...]
有两种形式,第一种是指定dgst命令后边通过短破折号介绍可选的散列函数;第二种是指不需要加dgst命令,直接指定散列函数名(不能加上短破折号)
openssl dgst -md5 file...
openssl md5 file...
例如:
[root@node1 ~]# openssl md5 smartmontools-6.6.tar.gz uncompyle2-master.zip 
MD5(smartmontools-6.6.tar.gz)= 9ae2c6e7131cd2813edcc65cbe5f223f
MD5(uncompyle2-master.zip)= 12d956d3efcd7c7086966d9f7ab5bcc9
[root@node1 ~]# openssl dgst -md5 smartmontools-6.6.tar.gz uncompyle2-master.zip 
MD5(smartmontools-6.6.tar.gz)= 9ae2c6e7131cd2813edcc65cbe5f223f
MD5(uncompyle2-master.zip)= 12d956d3efcd7c7086966d9f7ab5bcc9

-c  输出的摘要信息以分号分隔,和-hex同时使用(默认选项),可以每两位16进制以符号":"来分隔;
-d  输出BIO调试信息;
-hex 以16进制输出摘要信息;
-binary  以二进制形式输出摘要或者签名信息;
-r  以特定格式输出(不包含算法名字了,默认包含算法名)
-non-fips-allow  在FIPS模式下,允许使用不符合fips标准的摘要算法。如果不是在FIPS模式,选项无用;
enable use of non-FIPS algorithms such as MD5 even in FIPS mode.
-out filename 把输出结果写入指定文件。文件名不存在可以创建,如果涉及多层目录不存在,则不行。
-sign filename 
使用私钥文件来对文件进行数字签名。这里的filename是一个私钥文件。
-keyform arg
指定签名时候使用的私钥的格式,支持DER,PEM,P12以及ENGINE格式。
-sigopt nm:v
指定签名的参数。
-verify filename
使用包含公钥的文件来验证签名,输出结果只能是"Verification OK"表示验证通过或者"Verification Failure"表示验证不通过;
-prverify filename
使用包含私钥的文件来验证签名;
-signature filename
指定实际要验证的签名文件;(验证签名的时候要用)
file... 
指定的文件参数,可以有一个或多个。要作为命令的最后部分显示,不然配合有些特定选型会有问题。
参考:https://www.cnblogs.com/274914765qq/p/5005378.html

功能一:提取指定文件特征码或者叫消息摘要值;
功能二:实现数字签名

数字签名大概是这样,比如想发送一段敏感数据,比如A发送数据给B,防止别人篡改。假设B知道A的
公钥(公钥是公开,通常都应该知道),而且100%确认(如果展开说明,就不属于数字签名的知识部分了,
所以就假设一下)就是A的公钥。A向B发送一段数据,A先通过协商的消息摘要计算算法对整个数据做一消息
摘要计算,把计算出来的特征码或者叫消息摘要值附加在要发送的数据的结尾,不过附加的是加密的数据,
是用A自己的私钥对这段特征码进行加密,加密后的数据即为我们常说的数字签名。一当B收到数据后,
会用A的公钥进行尾部的数字签名进行解密。如果能解密,说明数字签名是A的,而且可以确认A的身份无误。
然后使用实现商量的消息摘要计算算法对数据进行计算,然后比较计算的值与解密后数字签名提取的特征码,
如果一致,说明数据没有被篡改或者传输没有损坏。

示例:
1、准备一个rsa的私钥,并利用这个私钥对指定文件进行数字签名。
(umask 077;openssl genrsa -out yanhui.pem 1024)  
#产生一个PEM格式的长度为1024位的没有使用密码的私钥yanhui.pem
openssl rsa -inform PEM -in yanhui.pem -outform DER -out yanhui.der 
#把PEM格式的私钥转换一份DER格式的留存

openssl dgst -sign yanhui.pem -keyform PEM -out sign1.txt uncompyle2-master.zip 
#如果指定的私钥是DEM格式的,可以省略-keyform
openssl dgst -sign yanhui.der -keyform DER -out sign2.txt uncompyle2-master.zip 
#如果指定的私钥是DER格式的,不能省略-keyform
openssl dgst -sign yanhui.pem -out sign_sha256.txt uncompyle2-master.zip 
#使用特定散列函数sha256进行签名

2、利用私钥验证上面签名是否正确
openssl dgst -prverify yanhui.pem -signature sign1.txt uncompyle2-master.zip
openssl dgst -prverify yanhui.pem -sha256 -signature sign_sha256.txt uncompyle2-master.zip  
#建议验证的时候也指定签名时候使用到的散列函数

3、利用公钥验证上面的签名是否正确
openssl rsa -in yanhui.pem -out yanhui.pub -pubout  #从私钥中提取公钥
openssl dgst -verify yanhui.pub -sha256 -signature sign_sha256.txt uncompyle2-master.zip

4、使用md5和sha256对文件进行hash运算(算出文件的特性码)
openssl dgst -md5 uncompyle2-master.zip 
openssl dgst -sha256 uncompyle2-master.zip
openssl dgst -r -sha256 uncompyle2-master.zip  #不输出算法名字

5、打印调试信息
openssl dgst -d -md5 uncompyle2-master.zip

6、二进制格式和16进制格式
openssl dgst -md5 -binary uncompyle2-master.zip 
openssl dgst -md5 -hex uncompyle2-master.zip
openssl dgst -md5 -hex -c uncompyle2-master.zip   #以冒号分隔16进制结果,每两个16进制字符以冒号隔开

3.3.11、标准命令ca(非常重要)

最小ca的应用实现。可以签署各种格式的证书请求,以及产生吊销列表。
它对于已经签署的证书以及它们的状态会通过文本数据库来管理。

第一部分:CA的选项
(1) -config filename
指定CA使用的配置文件;
(2) -name section
指定CA配置文件中使用的段落是哪一段(默认是default_ca)
在后边应用中会详细介绍。
(3) -in filename
an input filename containing a single certificate request to be signed by the CA.
证书签署请求的原文件,通常是CSR格式文件。
(3) -ss_cert filename
指定由CA自签的证书;
(4) -spkac filename
a file containing a single Netscape signed public key and challenge and additional field values to be signed by the CA. 
See the SPKAC FORMAT section for information on the required input and output format.
(5) -infiles
如果一次签署多个CSR,指定该参数后,后边可以跟多个文件名。
(6) -out filename
签名后的证书文件名。证书的相关信息也会写入。
(7) -outdir directory
证书保存的目录。证书名是证书序列号,后缀还是.pem
(8) -cert
CA的证书文件名。
(9) -keyfile filename
签署请求的私钥文件;
(10) -keyform PEM|DER
私钥文件的格式,默认是PEM格式。
(11) -key password
指定加密私钥的密码。要注释命令行使用密码的安全。
(12) -passin arg
使用密码来源。5中形式,前边已经讲过了,这里不再赘述。
(13) -verbose
详细模式输出。
(14) -notext
不要把证书文件的明文内容输出到文件中去。
(15) -startdate date
this allows the start date to be explicitly set. The format of the date is YYMMDDHHMMSSZ (the same as an ASN1 UTCTime structure).
指定明确证书生效的日期。格式为YYMMDDHHMMSSZ
(16) -enddate date
this allows the expiry date to be explicitly set. The format of the date is YYMMDDHHMMSSZ (the same as an ASN1 UTCTime structure).
指定证书的截止(过期)日期。格式为YYMMDDHHMMSSZ
(17) -days arg
签署证书的天数。
(18) -md alg
指定使用的消息摘要算法。可选值常见的有md5,sha1,mdc2,详细信息请参见openssl dgst -h的输出
(19) -policy arg
指定CA使用的策略。
(20) -msie_back
老版本兼容的一个选项。
(23) -batch
设置批处理的模式。所有的CSR会被自动处理。
(24) -extensions section
一般都用X509格式的证书,X509有几个版本。使用此选项可以会改变办法的证书的版本。
(25) -extfile file
an additional configuration file to read certificate extensions from (using the default section unless the -extensions option is also used).
(26) -utf8
this option causes field values to be interpreted as UTF8 strings, by default they are interpreted as ASCII. 
This means that the field values, whether prompted from a terminal or obtained from a configuration file, 
must be valid UTF8 strings.

第二部分:吊销列表的选项
(1) -gencrl
this option generates a CRL based on information in the index file.
生成一个基于索引信息的吊销列表文件;
(2) -crldays num
the number of days before the next CRL is due. That is the days from now to place in the CRL nextUpdate field.
吊销的日期时间周期。
(3) -crlhours num
the number of hours before the next CRL is due.
具体时间。
(4) -revoke filename
撤销吊销的证书文件。
(5) -status serial
通过指定的序列号来查询证书撤销的状态并退出。
(6) -updatedb
更新索引数据库,并移除过期的证书。
(7) -crl_reason reason
revocation reason, where reason is one of: unspecified, keyCompromise, CACompromise, affiliationChanged, superseded, cessationOfOperation, certificateHold or removeFromCRL.
The matching of reason is case insensitive. Setting any revocation reason will make the CRL v2.
In practive removeFromCRL is not particularly useful because it is only used in delta CRLs which are not currently implemented.

(8) -crl_hold instruction
This sets the CRL revocation reason code to certificateHold and the hold instruction to instruction which must be an OID. Although any OID can be used only holdInstructionNone (the use of which is discouraged by RFC2459) holdInstructionCallIssuer or holdInstructionReject will normally be used.

(9) -crl_compromise time
This sets the revocation reason to keyCompromise and the compromise time to time. time should be in GeneralizedTime format that is YYYYMMDDHHMMSSZ.

(10) -crl_CA_compromise time
This is the same as crl_compromise except the revocation reason is set to CACompromise.

(11) -crlexts section
 the section of the configuration file containing CRL extensions to include. If no CRL extension section is present then a V1 CRL is created, if the CRL extension section is present (even if it is empty) then a V2 CRL is created. The CRL extensions specified are CRL extensions and not CRL entry extensions.  It should be noted that some software (for example Netscape) can't handle V2 CRLs. See x509v3_config(5) manual page for details of the extension section format.

第三部分:配置文件选项
默认的配置文件:/etc/pki/tls/openssl.cnf
oid_file
oid_section
new_certs_dir
和命令行选项-outdir作用一样。指明签好的证书路径。
默认值配置文件中的值为: /etc/pki/CA/newcerts
必须要提供。

certificate
和命令行选项-cert作用一样。指明CA自签的证书.
默认配置文件中的值为: /etc/pki/CA/cacert.pem
必须要提供。

private_key
和-keyfile选项一样。指明CA的私钥路径。
默认配置文件中的值为: /etc/pki/CA/private/cakey.pem

RANDFILE
指明一个用来读写时候产生随机值的文件。
默认配置文件中的值为: /etc/pki/CA/private/.rand

default_days
和-days选项一样。指明签署证书的有效时间有多长。
默认配置文件中的值为:365  #表示365天,默认是签署1年

default_startdate
和命令行选项-startdate相同,如果没有设置标识生成证书时间开始,往后退多久

default_enddate
和命令行选项-enddate相同,表示证书有效的截止日期。

default_crl_hours default_crl_days
分别对应-crlhours选项和--crldays选项。

default_md
和-md选项相同的。指明消息摘要算法。
默认配置文件中的值为: sha256
必须要提供。

database
文件数据库索引文件。如果不存在要创建,创建一个空文件。
必须要提供。

unique_subject
默认值是yes,默认配置文件中是注释的。
如果设置为no表示允许创建相同主题(subject)的证书。

serial
a text file containing the next serial number to use in hex. Mandatory.  
This file must be present and contain a valid serial number.
包含下一个可用的16进制序列号的文本文件。
默认配置文件值:/etc/pki/CA/serial
必须要提供。

crlnumber
a text file containing the next CRL number to use in hex. 
The crl number will be inserted in the CRLs only if this file exists. 
If this file is present, it must contain a valid CRL number.
包含下一个,吊销证书的16进制的编号。
默认配置文件值:/etc/pki/CA/crlnumber

x509_extensions
the same as -extensions.

crl_extensions
the same as -crlexts.

参考:
https://max.book118.com/html/2015/0627/19896336.shtm

案例等讲了后面几个标准命令后一起配合讲解。

3.3.12、标准命令req(重点)

req - PKCS#10 certificate request and certificate generating utility.

req命令主要是创建和处理PKCS#10格式的证书签署请求。也可以为根CA创建自签证书。

格式:
openssl req [-inform PEM|DER] [-outform PEM|DER] [-in filename] [-passin arg] [-out filename] [-passout arg] [-text] 
[-pubkey] [-noout] [-verify] [-modulus] [-new] [-rand file(s)] [-newkey rsa:bits] [-newkey alg:file]  [-nodes] [-key filename] 
[-keyform PEM|DER] [-keyout filename] [-keygen_engine id] [-[digest]] [-config filename] [-multivalue-rdn] [-x509] 
[-days n] [-set_serial n] [-asn1-kludge] [-no-asn1-kludge] [-newhdr] [-extensionssection] [-reqexts section] [-utf8] 
[-nameopt] [-reqopt] [-subject] [-subj arg] [-batch] [-verbose] [-engine id]

选项:
-inform DER|PEM
指定输入文件格式。DER格式采用的是ASN1 DER编码,是兼容PKCS#10格式的。PEM形式是默认的格式。是通过DER格式经过base64编码而来,附加了一些
头和尾部的输出信息。
-outform DER|PEM
指定的输出格式。
-in filename
要处理的CSR的文件名称,如果指定了-new 或 -newkey选项,该选项无效;
-passin arg
输入文件密码来源。
-out filename
要输出的文件名。
-passout arg
输出文件密码来源。
-text 
将CSR文件里的内容以可读的方式打印出来。
-subject
打印请求主体或者证书(要指定-x509选项)主体信息。
-pubkey
打印公钥信息。
-noout
不要打印CSR文件编码版本信息。
-modulus
将CSR里面包含的请求的公共系数。
-verify
验证请求文件里的签名信息。
-new
this option generates a new certificate request. 
It will prompt the user for the relevant field values. 
The actual fields prompted for and their maximum and minimum sizes are specified in the configuration file and any requested extensions. 
If the -key option is not used it will generate a new RSA private key using information specified in the configuration file.
这个选项用于产生一个新的证书签署请求。会提示用户交互式输入一些相关的参数值。
实际设置的值提示以及他们的最大最小值都是在配置文件中指定的以及任何其他的请求扩展。
如果-key选项没有指定,因为不管是自签也好,还是证书签署请求也罢,都必须要有一个私钥,
如果没有-key选项,将会根据配置文件设置的缺省值来先产生一个RSA的私钥文件。
-newkey arg
创建新的证书签署请求(CSR格式文件)和一个新的私钥文件。
参数有几种形式:
    rsa:nbits 其中的nbits表示产生RSA私钥的长度,如果省略,会根据配置文件缺省值生成;
如果产生DSA格式的私钥文件,参数应该是DSA私钥产生需要的参数文件名。格式:
dsa:dsa_parafile    
-key filename
指定私钥文件,支持PKCS#8格式的私钥。
-keyform PEM|DER
通过-key指向的私钥文件的格式,默认是PEM的。
-keyout filename
指明创建的新的私有密钥文件的文件名。如果该选项没有设置,将使用配置文件里面指定的文件名。
-nodes
如果指定该选项后,生成的私有密钥文件将不会被加密。
-[digest]
指定签署请求用到的消息摘要算法。
-[md5|sha1|md2|mdc2]
如果没有指定该选项,将会使用配置文件中对应的消息摘要算法设置的值。
如果是DSA的CSR将忽略这个选项,而采用sha1。
-config filename
允许指定额外的配置文件。(指定配置文件后,如果有相同的值对应不同参数,会以这个额外指定的配置文件为准。)
-x509
用来自签证书而不是证书签署请求。一般用作产生一个测试证书或者为根CA做自签。
-days n
when the -x509 option is being used this specifies the number of days to certify the certificate for. The default is 30 days.
如果指定-x509选项,这个表示的数字为签署证书的天数。默认是30天。
没有指定-x509时候,也可以使用这个选项。表示生成证书签署请求,想要签署的证书有效期时间天数。
-set_serial n
serial number to use when outputting a self signed certificate. 
This may be specified as a decimal value or a hex value if preceded by 0x.  
It is possible to use negative serial numbers but this is not recommended.
输出一个自签证书时候使用的序列号。可以指定为10进制数字或16进制数值(要加上0x前缀)。
可以设置为负值但是不推荐。

3.3.13、标准命令x509

x509是一个多用途的证书组件。他可以用于显示证书的信息,转换证书成各种形式,也可以向ca标准命令实现的"最小CA"一样实现证书签署请求,
也可以编辑设置证书的信任。
由于选项太多,按照一般功能划分:
(1) 输入,输出以及一般选项

-inform DER|PEM|NET
This specifies the input format normally the command will expect an X509 certificate but this can change if other options such as -req are present.
The DER format is the DER encoding of the certificate and PEM is the base64 encoding of the DER encoding with header and footer lines added.
The NET option is an obscure Netscape server format that is now obsolete. 

指定输入文件的格式,建议使用DER或PEM,NET将被丢弃; 
DER格式是DER编码的证书格式;PEM一个在DER编码格式基础上使用base64编码,然后添加一些头部和尾部的行的证书格式。
NET是早期网景公司设计的一个比较晦涩的格式,现在将要被弃用。
-outform DER|PEM|NET
This specifies the output format, the options have the same meaning as the -inform option.
指定输出文件格式,DER和PEM。不建议使用NET。
-in filename
This specifies the input filename to read a certificate from or standard input if this option is not specified.
指定读取的证书文件,如果不指定会从标准输入中读取。
-out filename
This specifies the output filename to write to or standard output by default.
表示写入的文件,不指定表示直接写入标准输出。
-md2|md5|-sha1|-mdc2
指定使用的消息摘要算法。如果默认不指定,会使用SHA1,对于DSA的私钥,就算指定了该选项,也不会生效,因为DSA的私钥会一直使用SHA1。

(2) 显示相关选项
-text
打印输出信息以文本格式。全部详细信息包括:公钥,签名算法,发行人和主题名字,序列号以及其他扩展信息以及信任设置信息。

-noout 
this option prevents output of the encoded version of the request.
不允许输出编码后的部分的信息。
-pubkey
输出证书的公钥信息块,以PEM格式输出。
-modulus
this option prints out the value of the modulus of the public key contained in the certificate.
显示证书中公钥的模数值。
-serial
outputs the certificate serial number.
输出证书的序列号信息。
-subject_hash 或-hash
outputs the "hash" of the certificate subject name. This is used in OpenSSL to form an index to allow certificates in a directory to be looked up by subject name.
输出证书主体的"哈希"值。-hash选项是为了向后兼容,所以暂时保留,含义一样。
-issuer_hash
outputs the "hash" of the certificate issuer name.
输出证书发型名的hash值。
-subject
显示证书的主题信息。
-issuer
显示证书的发型的名字。
-email
输出邮件地址信息(如果没有设置,将没有结果)
-startdate
prints out the start date of the certificate, that is the notBefore date.
打印证书开始生效的日期。(证书如果涉及续费,这个时刻点表示最近一次续费的时刻)
-enddate
prints out the expiry date of the certificate, that is the notAfter date.
打印证书的过期日期时间。
-dates
prints out the start and expiry dates of a certificate.
打印证书的开始时间日期以及过期的时间日期。
-checkend arg
checks if the certificate expires within the next arg seconds and exits non-zero if yes it will expire or zero if not.
指定数值(单位秒),检测经过这些时间后,证书是否过期。
-fingerprint
打印证书的指纹信息。
prints out the digest of the DER encoded version of the whole certificate (see digest options).
如果要查看的正式是DER格式的,记得要配合-inform DER来使用。
-C
打印证书以C代码的形式。
(3) 信任设置相关选项
因为信任设置属性目前是实验阶段,有些选项可能会变化
-trustout
打印出可以信任的证书信息。
-setalias arg
设置证书别名。
-alias
打印证书别名。
-clrtrust
清除证书附加项里所有有关用途允许的内容。
-clrreject
清楚证书附加项里所有有关用途禁止的内容。
-addtrust arg
添加证书附加项里所有有关用途允许的内容。
-addreject arg
添加证书附加项里所有有关用途禁止的内容。
-purpose
打印证书附加项里所有有关用途允许和用途禁止的内容。

3.3.14、标准命令crl

CRL表示吊销列表;
crl命令用来处理DER格式或PEM格式的CRL文件。
openssl crl [-inform PEM|DER] [-outform PEM|DER] [-text] [-in filename] [-out filename] [-noout] [-hash] [-issuer] [-lastupdate] [-nextupdate] [-CAfile file] [-CApath dir]

-inform DER|PEM
指定输入格式。
-outform DER|PEM
指定输出格式。
-in filename
输入文件。
-out filename
输出文件。
-text
以文本格式打印CRL
-noout
don't output the encoded version of the CRL.
-hash
打印发型者的hash值。
-issuer
打印发行者的名字。
-lastupdate
output the lastUpdate field.
-nextupdate
output the nextUpdate field.
-CAfile file
verify the signature on a CRL by looking up the issuing certificate in file
-CApath dir
verify the signature on a CRL by looking up the issuing certificate in dir. 
This directory must be a standard certificate directory: that is a hash of each subject name (using x509 -hash) 
should be linked to each  certificate.

四、CA介绍,自建CA,颁发证书

4.1、混合加密解密图解

加密:
通信加密与解密_第7张图片

解密:
通信加密与解密_第8张图片

思考:
通信加密与解密_第9张图片

4.2、PKI和CA相关图解

PKI(公钥基础设施),主要由以下部分组成:
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存储库
通信加密与解密_第10张图片

通信加密与解密_第11张图片

通信加密与解密_第12张图片

4.3、openssl的默认配置文件部分节选说明

默认配置文件:/etc/pki/tls/openssl.cnf
####################################################################
[ ca ]       #表示ca分组配置
default_ca      = CA_default            # The default ca section,表示ca默认的配置段

####################################################################
[ CA_default ]   #实际ca使用的是这个分组配置

dir             = /etc/pki/CA           # Where everything is kept,根路径
certs           = $dir/certs            # Where the issued certs are kept,ca颁发过的证书默认存储路径
crl_dir         = $dir/crl              # Where the issued crl are kept,吊销证书路径
database        = $dir/index.txt        # database index file.存储证书的数据库索引文件,一个普通文本文件
#unique_subject = no                    # Set to 'no' to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # default place for new certs.颁发的新证书留存路径

certificate     = $dir/cacert.pem       # The CA certificate,ca自己的证书,要绝对与这里指向的一样。
serial          = $dir/serial           # The current serial number,当前的序列号记录文件
crlnumber       = $dir/crlnumber        # the current crl number,当前的吊销编号记录文件
                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL
private_key     = $dir/private/cakey.pem # The private key,ca的私钥存储路径,要与这里绝对一致
RANDFILE        = $dir/private/.rand    # private random number file,要产生随机数用到的文件

x509_extensions = usr_cert              # The extentions to add to the cert,证书的扩展信息,后边有定义usr_cert分组
...... #省略一些信息
default_days    = 365                   # how long to certify for,签署证书默认有效期,默认365天
default_crl_days= 30                    # how long before next CRL,证书吊销时间,默认30天
default_md      = sha256                # use SHA-256 by default,默认的消息摘要sha256
preserve        = no                    # keep passed DN ordering
......#省略一些信息
[ req ]   #表示签署请求时候的选项
default_bits            = 2048,默认的长度2048位
default_md              = sha256,默认的摘要算法,sha256
default_keyfile         = privkey.pem,默认生成的私钥名字
distinguished_name      = req_distinguished_name
attributes              = req_attributes
x509_extensions = v3_ca # The extentions to add to the self signed cert

4.4、一台服务器做根ca,一台web服务器

ca的服务器ip信息:172.168.110.22
web服务器ip信息:172.168.110.21

1、在确定配置为ca的服务器上生成一个自签证书,并为ca提供所需要的目录及文件即可
以下部分在172.168.110.22上执行。
(1)生成私钥(注意CA配置文件中指定的路径和名字要与生成的私钥保持一致)

(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)

[root@node1 ~]# (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
Generating RSA private key, 4096 bit long modulus
............++
...........................................................................++
e is 65537 (0x10001)
[root@node1 ~]# ls -l /etc/pki/CA/private/cakey.pem 
-rw------- 1 root root 3243 Nov  9 18:02 /etc/pki/CA/private/cakey.pem

(2)生成自签证书(注意要和openssl的配置文件中指定的位置和名字保持一致)

openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655

[root@node1 ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN     #国家
State or Province Name (full name) []:FuJian    #省份
Locality Name (eg, city) [Default City]:FuZhou   #城市,地方
Organization Name (eg, company) [Default Company Ltd]:yanhui #公司,组织
Organizational Unit Name (eg, section) []:ops #部门
Common Name (eg, your name or your server's hostname) []:ca.yanhui.com #ca的主机名
Email Address []:[email protected]  #email地址

(3)为ca提供所需的目录及文件

mkdir -p /etc/pki/CA/{certs,crl,newcerts}
touch /etc/pki/CA/{serial,index.txt}
echo 01 >/etc/pki/CA/serial

[root@node1 ~]# mkdir -p /etc/pki/CA/{certs,crl,newcerts}
[root@node1 ~]# touch /etc/pki/CA/{serial,index.txt}
[root@node1 ~]# echo 01 > /etc/pki/CA/serial 

2、要在到证书进行安全通信的服务器,需要向ca请求签署证书
以下步骤在172.168.110.21上执行。
(1) 用到证书的主机生成证书签署请求用到的私钥

cd /var/tmp/
(umask 077;openssl genrsa -out private.key 2048)

[root@node2 tmp]# cd /var/tmp/
[root@node2 tmp]# (umask 077;openssl genrsa -out private.key 2048)
Generating RSA private key, 2048 bit long modulus
................................................................................+++
..................................+++
e is 65537 (0x10001)

(2)生成证书签署请求

openssl req -new -key /var/tmp/private.key -out /var/tmp/certificate.csr -days 365

[root@node2 tmp]# openssl req -new -key /var/tmp/private.key -out /var/tmp/certificate.csr -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN  #因为是本地自建ca,记住要与自签ca证书时候填写一样。
State or Province Name (full name) []:FuJian  #因为是本地自建ca,记住要与自签ca证书时候填写一样
Locality Name (eg, city) [Default City]:FuZhou  #因为是本地自建ca,记住要与自签ca证书时候填写一样
Organization Name (eg, company) [Default Company Ltd]:yanhui  #因为是本地自建ca,记住要与自签ca证书时候填写一样
Organizational Unit Name (eg, section) []:ops  #因为是本地自建ca,记住要与自签ca证书时候填写一样
Common Name (eg, your name or your server's hostname) []:www.yanhui.com #非常重要,这个就是站点使用的域名
Email Address []:[email protected] #邮箱,可以填写自己的邮箱

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:     #是否要为证书使用提供一个额外的密码,回车即可,不需要。
An optional company name []: #是否提供一个可选的公司名,回车,不需要填写。

(3) 通过工具将证书签署请求文件文件发送给ca,利用ftp或者scp网络拷贝工具都行

[root@node2 tmp]# scp -P22 -p /var/tmp/certificate.csr [email protected]:/var/tmp/
[email protected]'s password: 
certificate.csr                                                                        100% 1054   649.4KB/s   00:00    
[root@node2 tmp]# 

(4)特定步骤,在ca主机上执行证书签署步骤

openssl ca -in /var/tmp/certificate.csr -out /var/tmp/certificate.crt -days 365

Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Nov  9 10:30:59 2018 GMT
            Not After : Nov  9 10:30:59 2019 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = FuJian
            organizationName          = yanhui
            organizationalUnitName    = ops
            commonName                = www.yanhui.com
            emailAddress              = [email protected]
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                DA:E8:F8:DC:72:40:F5:BB:D2:AC:E7:7D:7F:FE:DF:3D:33:73:64:9E
            X509v3 Authority Key Identifier: 
                keyid:C6:1B:54:1E:74:4E:D9:C5:63:14:66:A6:F3:C1:C1:48:40:4B:F7:A2

Certificate is to be certified until Nov  9 10:30:59 2019 GMT (365 days)
Sign the certificate? [y/n]:y   #是否要签署证书

1 out of 1 certificate requests certified, commit? [y/n]y   #是否提交
Write out database with 1 new entries
Data Base Updated

4.5、不单独生成私钥,自签时或签署证书请求时候一次生成所需密钥

ca的服务器ip信息:172.168.110.22
web服务器ip信息:172.168.110.21

以下步骤在ca主机上执行:
(1) 生成自签证书(会生成所需要的私钥)

(umask 077;openssl req -x509 -newkey rsa:4096 -nodes -keyout /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655)

[root@node1 CA]# (umask 077;openssl req -x509 -newkey rsa:4096 -nodes -keyout /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655)
Generating a 4096 bit RSA private key
................................++
...........................++
writing new private key to '/etc/pki/CA/private/cakey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:FuJian
Locality Name (eg, city) [Default City]:FuZhou
Organization Name (eg, company) [Default Company Ltd]:yanhui
Organizational Unit Name (eg, section) []:ops
Common Name (eg, your name or your server's hostname) []:ca.yanhui.com
Email Address []:[email protected]
[root@node1 CA]# ls -l /etc/pki/CA/private/cakey.pem 
-rw------- 1 root root 3272 Nov  9 22:54 /etc/pki/CA/private/cakey.pem
[root@node1 CA]# ls -l /etc/pki/CA/cacert.pem 
-rw------- 1 root root 2106 Nov  9 22:54 /etc/pki/CA/cacert.pem
[root@node1 CA]# file /etc/pki/CA/cacert.pem
/etc/pki/CA/cacert.pem: PEM certificate
[root@node1 CA]# file /etc/pki/CA/private/cakey.pem 
/etc/pki/CA/private/cakey.pem: ASCII text

用到的选项再次解释:
    -x509表示自签证书用到的一个比较特殊的选项
    -newkey rsa:4096 表示创建一个新的证书请求和一个新的RSA的4096长度的私钥
    -nodes表示生成的私钥不加使用密码
    -keyout表示指明私钥的路径和名字,一定要与默认配置文件中ca所需要的私钥路径和名字一致
    -out指明创建爱你新的证书的路径和名字,一定要与默认配置文件中ca所需要的证书路径和名字一致
    -days表示这里给ca自签证书的使用天数为3655一天

(2) 为CA提供所需的目录及文件

mkdir -p /etc/pki/CA/{certs,crl,newcerts}
touch /etc/pki/CA/{serial,index.txt}
echo 01 >/etc/pki/CA/serial

以下步骤在web主机上执行:
(1) 生成证书签署请求(会生成所需的私钥)

(umask 077;openssl req -newkey rsa:2048 -nodes -keyout /var/tmp/private.key -out /var/tmp/certificate.csr -days 365)

[root@node2 tmp]# (umask 077;openssl req -newkey rsa:2048 -nodes -keyout /var/tmp/private.key -out /var/tmp/certificate.csr -days 365)
Generating a 2048 bit RSA private key
.................................................................+++
..............................+++
writing new private key to '/var/tmp/private.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:FuJian
Locality Name (eg, city) [Default City]:FuZhou
Organization Name (eg, company) [Default Company Ltd]:yanhui
Organizational Unit Name (eg, section) []:ops
Common Name (eg, your name or your server's hostname) []:www.yanhui.com
Email Address []:[email protected]

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:    
[root@node2 tmp]#   

(2) 将证书签署请求文件通过工具(ftp或scp或rsync等)传递给ca主机

scp -P22 -p /var/tmp/certificate.csr [email protected]:/var/tmp/

[root@node2 tmp]# scp -P22 -p /var/tmp/certificate.csr [email protected]:/var/tmp/
[email protected]'s password: 
certificate.csr                                                                        100% 1054   584.9KB/s   00:00    
[root@node2 tmp]# 

以下步骤在ca主机上执行:
(3) 在ca主机上完成证书签署请求并提供给站点主机下载或者传递给站点主机

openssl ca -in /var/tmp/certificate.csr -out /etc/pki/CA/certs/certificate.crt -days 365

[root@node1 CA]# openssl ca -in /var/tmp/certificate.csr -out /etc/pki/CA/certs/certificate.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Nov  9 15:09:07 2018 GMT
            Not After : Nov  9 15:09:07 2019 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = FuJian
            organizationName          = yanhui
            organizationalUnitName    = ops
            commonName                = www.yanhui.com
            emailAddress              = [email protected]
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                C8:54:4C:34:A5:67:5E:BB:D8:5C:35:2B:A2:68:61:A9:91:E7:D7:A8
            X509v3 Authority Key Identifier: 
                keyid:74:DE:B7:5F:FF:AC:08:25:F1:AD:91:83:2D:5F:1A:E1:6E:B7:77:43

Certificate is to be certified until Nov  9 15:09:07 2019 GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

(4)把签证的证书传递给站点服务器

scp -P22 -p /etc/pki/CA/certs/certificate.crt [email protected]:/var/tmp/
[root@node1 CA]# scp -P22 -p /etc/pki/CA/certs/certificate.crt [email protected]:/var/tmp/
[email protected]'s password: 
certificate.crt                                                                        100% 5866     2.0MB/s   00:00    
[root@node1 CA]# 

[root@node1 CA]# ls
cacert.pem  certs  crl  index.txt  index.txt.attr  index.txt.old  newcerts  private  serial  serial.old
[root@node1 CA]# ls -l /etc/pki/CA/cacert.pem  #这个是ca的自签的PEM格式的证书
-rw------- 1 root root 2106 Nov  9 22:54 /etc/pki/CA/cacert.pem
[root@node1 CA]# ls -l /etc/pki/CA/private/cakey.pem #这个是ca自签证书时生成的PEM格式的私钥
-rw------- 1 root root 3272 Nov  9 22:54 /etc/pki/CA/private/cakey.pem
[root@node1 CA]# ls -l /etc/pki/CA/index.txt
-rw-r--r-- 1 root root 110 Nov  9 23:09 /etc/pki/CA/index.txt
[root@node1 CA]# cat /etc/pki/CA/index.txt  #这里是记录证书的索引文件,下面有信息
V   191109150907Z       01  unknown /C=CN/ST=FuJian/O=yanhui/OU=ops/CN=www.yanhui.com/[email protected]
[root@node1 CA]# ls -l /etc/pki/CA/certs/certificate.crt  #这个是我ca签署过的证书的保存路径,也可以不存在这里
-rw-r--r-- 1 root root 5866 Nov  9 23:09 /etc/pki/CA/certs/certificate.crt
[root@node1 CA]# md5sum /etc/pki/CA/certs/certificate.crt
2a6e90569f18b85ee49ee4a23452de12  /etc/pki/CA/certs/certificate.crt
[root@node1 CA]# ls -l /etc/pki/CA/newcerts/01.pem 
#每次签署一个新的证书,这个目录下都会有一份备份,名字是编号加格式后缀(默认都是PEM格式)
-rw-r--r-- 1 root root 5866 Nov  9 23:09 /etc/pki/CA/newcerts/01.pem
[root@node1 CA]# md5sum /etc/pki/CA/newcerts/01.pem
2a6e90569f18b85ee49ee4a23452de12  /etc/pki/CA/newcerts/01.pem
[root@node1 CA]# ls -l /etc/pki/CA/serial #这个文件记录当前签署过的证书的序列号
-rw-r--r-- 1 root root 3 Nov  9 23:09 /etc/pki/CA/serial
[root@node1 CA]# ls -l /etc/pki/CA/serial.old 
-rw-r--r-- 1 root root 3 Nov  9 23:09 /etc/pki/CA/serial.old
[root@node1 CA]# cat /etc/pki/CA/serial
02
[root@node1 CA]# cat /etc/pki/CA/serial.old 
01
[root@node1 CA]# cat /etc/pki/CA/index.txt.attr
unique_subject = yes
[root@node1 CA]# ls -l /etc/pki/CA/index.txt.old 
-rw-r--r-- 1 root root 0 Nov  9 23:09 /etc/pki/CA/index.txt.old
[root@node1 CA]# cat /etc/pki/CA/index.txt.old
[root@node1 CA]# 
#上边所有以.old为后缀的文件都是备份文件。

五、TCP/IP四层模型配合半层ssl开发库以及SSL会话的步骤和阶段

5.1、TCP/IP模型图解

通信加密与解密_第13张图片

通信加密与解密_第14张图片

通信加密与解密_第15张图片

5.2、SSL会话阶段图解

通信加密与解密_第16张图片

通信加密与解密

通信加密与解密_第17张图片

通信加密与解密_第18张图片

你可能感兴趣的:(通信加密与解密)