Linux学习68 运维安全-openssl原理与实战

一、回顾

  1、技术:加密和解密,服务

  2、加密算法和协议

    a、对称加密:数据加密(保密性),常用的加密算法为3DES,AES

    b、公钥加密:身份认证(加密的是特征码),密钥交换(加密的密钥),数据加密(不常用,比对称加密要慢三个数量级,即10的三次方倍),常用的算法为RSA,DSA

    c、单向加密:数据完整性,常用的算法为MD5,SHA1,...

    d、密钥交换:RSA,DH(迪菲-赫尔曼),ECDH(椭圆曲线DH),ECDHE(临时椭圆曲线DH)

  3、通信过程

    a、Bob请求Alice的证书

    b、Alice认可后就发送自己的证书给Bob,然后请求Bob的证书

    c、Bob然后发送证书给Alice,然后双方开始协商双方对称加密使用什么算法,公钥加密使用什么算法,单向加密使用什么算法,以及密钥交换使用什么算法,要选择双方都支持的算法的交集

    d、然后Bob发信息给Alice。首先Bob将文件数据的特征码取出来用自己的私钥去加密这个特征码,用自己的私钥去加密特征码就叫数字签名。这个时候Bob要保障对整个数据加密一次,因此把整个数据(文件数据+特征码)用自己生成的一个一次性会话密钥进行加密,为什么叫一次性的呢?即他只是发送这个数据时用这个密码,下次再发的时候就已经换过了。然后他用对方的公钥加密这段自己生成的这段一次性会话密钥然后附加在整段数据后面发给对方

    e、然后Alice收到Bob发送过来的数据后首先用自己的私钥去解密这段密码,然后我们的对称密钥的密码就被解密出来了。拿到这个密码后然后就去解密这段数据,然后得到了加密的数字签名和数据,然后再用对方的公钥去解密这段特征码,如果能解密的话表示肯定就是对方的私钥进行加密的,即身份认证。接下来我们使用同样的加密算法去计算 这段数据的特征码,然后与刚刚解密出来的特征码进行比较,如果两个特征码是一样的就表示数据的完整性得到了验证。

  4、SSL/TLS

    a、https就需要http依赖于ssl/tls

    b、SSL:安全套接字层(ssl 1.0,ssl 2.0,ssl3.0)

    c、TLS:传输层安全(tls1.0,tls1.1,tls1.2,tls1.3)

  5、OpenSSL:SSL协议的实现工具

    a、libcrypto库:用于实现加密解密,他的各种加密解密算法都在里面

    b、libssl:主要是实现ssl功能

    c、openssl:多用途的命令行工具

  6、SSL会话主要三步:

    a、客户端向服务器端索要并验证证书。(一般服务器端找客户端索要验证证书的情况比较少,只有银行U盾或加密狗这种情况才会找客户端索要并验证证书)。相应的过程如下

    b、双方协商生成“对话密钥”,这两步通常称为握手阶段

    c、双方采用“会话密钥”进行加密通信

    d、断开握手

  7、SSL会话的四个阶段(SSL Handshake Protocol)

    a、第一阶段:即ClientHello过程,这个过程客户端主要是以下操作:

      (1)、客户端支持的协议版本,比如tls1.2

      (2)、客户端生成一个随机数,稍后用户生成“会话密钥”

      (3)、支持的加密算法,比如AES,RSA

      (4)、支持的压缩算法

    b、第二阶段:即ServerHello,服务器端主要是以下操作

      (1)、确认使用的加密通信协议版本,比如tls1.2;

      (2)、服务器端生成一个随机数,稍后用于生成“会话密钥”

      (3)、确认使用的加密方法

      (4)、发送服务器证书

      (5)、索要客户端证书(若不验证客户端证书的话就没有)

    c、第三阶段

      (1)、客户端验证服务器证书,在确认无误后取出其公钥(发证机构,证书完整性,证书持有者,证书有效期,吊销列表)

      (2)、发送以下信息给服务器端:

        1)、一个随机数;用于服务器上的公钥加密;

        2)、编码变更通知;即随后信息都将用双方商定的加密方法和秘钥发送

        3)、客户端握手结束通知

    d、第四阶段

      (1)、收到客户端发来的第二个随机数(因为全局有三个随机数存在,服务器端一个客户端两个,可在上述内容中查看到)pre-master-key后,计算生成本次会话所用到的会话密钥

      (2)、向客户端发送如下信息

        1)、编码变更通知;即随后信息都将用双方商定的加密方法和秘钥发送

        2)、服务器端握手结束通知

     e、我们上面的四个阶段也就是6中的前两步,这四个阶段也叫做SSL Handshake Protocol

  8、我们无论是手动通信也好或者是用SSL/TLS通信也好,都必然用到证书,这就强依赖于第三方签证机构,但是第三方签证机构只是依赖于我们庞大的安全体系PKI中的一部分,即公钥基础设施。他就是为了保证双方,尤其是服务器端向客户端发送过程中发送服务器证书的。而PKI中的CA主要就是为了提供和维护证书服务的。

    a、他包含四个方面

      (1)、签证机构:CA

      (2)、注册机构:RA

      (3)、证书吊销列表:CRL

      (4)、证书存取库

    e、所以现在我们任何一个服务器在互连网上要想能够进行通信他要依赖于我们互连网上的上述中的四个方面以便其能安全通信,不然你的公钥通信就没法进行了。问题是全球谁能发证呢?因此全球有根CA和下面的各个CA来进行发证

二、OpenSSL

  1、组件

    a、libcrypto,libssl主要由开发者使用

    b、openssl:多用途命令行工具

[root@www ~]# openssl version
OpenSSL 1.0.2k-fips  26 Jan 2017

  2、命令

    a、众多子命令,大体分为三类,可用openssl ? 来显示

      (1)、标准命令(Standard commands):每一个命令都使用命令自身来调用

      (2)、消息摘要命令(Message Digest commands):使用dgst命令来调用

      (3)、加密命令(Cipher commands):使用enc命令来调用

    b、标准命令:enc,ca,req,genrsa,...

  3、基于openssl完成对称加密

    a、工具:openssl enc,gpg等

    b、支持的算法:3des,aes,blowflsh,towflsh

    c、enc命令,可以使用whatis enc命令查看

[root@www ~]# whatis enc
enc (1ssl)           - symmetric cipher routines

      (1)、我们来加密/etc/fstable文件中的内容

[root@www ~]# openssl enc -e -des3 -a -salt -in /etc/fstab -out fstab.ciphertext
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:

        1)、上述命令的意思是使用openssl enc命令,-e表示进行加密(如果解密需要-d参数),-des3表示使用des3算法进行加密,-a表示使用base64的编码格式,文本编码,即编码为文本,看上去就是一大推乱码,如果不加-a就表示默认使用二进制编码。-salt表示加一些杂志进去,至于要怎么加不用管。-in /etc/fstab表示加密/etc/fstab文件中的内容,-out fstab.ciphertext表示加密后的文件保存在fstab.ciphertext文件中,接下来会让我们输入密码,我们可以看到他是用des-ede3-cbc进行加密的。

        2)、接下来我们来查看这个文件

[root@www ~]# cat fstab.ciphertext 
U2FsdGVkX19STF7lAA7piZzcev3pdXQO4ePLYsdfhaizhgStbgYTPZjbxK5qp+js
lkNdZ40aCYTwEqFaaDItIvMUfSRSWUjznOC0fU9wiFNfCI2MPPPZFqbeV6zC2/c3
DoY2g4IOybYiLOC8jK1Iz4z0xI5BX/TTA70QlfIIDZZst4HkYUHlty5bv89u7fJF
6XEA4Ke2VU2fj2lkgNfosyOMb8GlXQm2bGVxOEooj603w7GCpH/a1SDvoXyFrbnf
Yr6bKP+GqABBB1sQ9hpxacbwakrK8kbpsraS9umbY59tVsdUdb6u9cRFiyXvvG1F
gyujZ9Uv/A0SBQ3p4XL3P1EVHmDoOfKpGr+2zHkTu3o9BLJqqPQgrdBip3Dg6oft
zmeb3HI+2hIhaHr/kzifIXifbt6jRX2hcFVhCrucwa9jmiSP9sJECBHWcfw0xn+i
Z6Qt1BXMBCbuVthRcoQwTFWcZWrCGml4PO7oG2KFc4LZfyKqnKdy7BVZJLVImHGb
x/KbzeW77haf63GZsAkvFzu+8e3M4E2s8MmuyySzJdKsQj20l/XyKBinGa2yXczw
G5ajZ0jDIGo7zU1OfdmnX+bRX2c7qnDoxeLYQYUDgr777VG534M4xociedMVYJI+
BgnZ/4RSmeA=

      (2)、接下来我们来解密这个文件,解密和刚刚过程一样,只是把-e换成-d,-in和-out对调

[root@www openssl]# ls
fstab.ciphertext
[root@www openssl]# openssl enc -d -des3 -a -salt -in /application/openssl/fstab.ciphertext -out /application/openssl/fstab
enter des-ede3-cbc decryption password:
[root@www openssl]# ls
fstab  fstab.ciphertext
[root@www openssl]# cat fstab

#
# /etc/fstab
# Created by anaconda on Tue Jun  4 22:30:32 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=fd514a18-84be-4460-8130-706b3ec88673 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

  4、基于openssl完成单向加密

    a、工具:openssl dgst,md5sum,sha1sum,sha224sum,...

    b、dgst命令:openssl dgst -md5 /PATH/TO/SOMEFILE

[root@www openssl]# ls
fstab  fstab.ciphertext
[root@www openssl]# md5sum fstab
bc5dda5c7a4563573fb79ac3cc08d4ed  fstab
[root@www openssl]# openssl dgst -md5 fstab
MD5(fstab)= bc5dda5c7a4563573fb79ac3cc08d4ed

  5、生成用户密码的命令

    a、工具:passwd,openssl passwd

    b、命令:openssl passwd -1 -salt SALT

[root@www openssl]# openssl passwd -1 -salt 123456
Password: 
$1$123456$wOSEtcyiP2N/IfIl15W6Z0

      -1表示使用第一种算法进行加密,也就是md5,-salt 123456表示加上123456的solt内容

  6、生成随机数

    a、工具:openssl rand

    b、命令:openssl rand -base64 NUM或openssl rand -hex NUM

[root@www openssl]# openssl rand -base64 10
i05ZwdfaLObvxw==

      (1)、上述命令意思是用base64的编码格式生成10个字节的随机数(注意是10个字节,生成后的字符肯定不止4个),base64编码后面的两个==是固定格式,我们可以通过base64 -d命令接除编码

[root@www openssl]# echo "i05ZwdfaLObvxw==" |base64 -d
NYج簇

      (2)、我们也可以使用十六进制编码,他就只有十六进制的数字,0-F之间,使用-hex即可

[root@www openssl]# openssl rand -hex 10
cbdf5b97b25e493a35c3

    c、简单使用

      (1)、我们现在来使用4个字节的十六进制编码的随机数来生成密码(4个字节的十六进制编码的随机数就是8个16进制字符)

[root@www openssl]# openssl passwd -1 -salt $(openssl rand -hex 4)
Password: 
$1$8e1bd0ef$4H3DOA9N0jU8J9QsZq4Xi/
[root@www openssl]# openssl passwd -1 -salt $(openssl rand -hex 4)
Password: 
$1$3f6be28d$88IIUT4vCHyLCXnTOpyvp0

        我们将来认证时输入一样的salt就行了,就没必要再随机生成了

[root@www openssl]# openssl passwd -1 -salt 3f6be28d
Password: 
$1$3f6be28d$7vhGkkr3IFh.0pQ.Pubtd0

  7、公钥加密

    a、加密

      (1)、算法:RSA,ELGamal

      (2)、工具:openssl rsautl,gpg

    b、数字签名

      (1)、算法:RSA,DSA,ELGamal

      (2)、工具:openssl rsautl,gpg

    c、密钥交换

      (1)、算法:DH,RSA也支持

    d、生成密钥

      (1)、生成私钥:要想完成公钥加密技术加密数据首先我们要生成密钥对,如果去获取密钥对就变得比较关键了,openssl 有个子命令叫openssl genrsa或openssl gendsa,我们可以通过openssl genrsa指明要生成多少位的密钥,他的密钥位数支持512,768,1024,2048,4096等,必须是2的n次方倍的位数。所以只能是上述的这种位数

        (umask 077;openssl genrsa -out /PATH/TO/PRIVATE_KEY_FILE NUM_BITS)

        1)、我们现在来生成一个1024位的密钥

[root@www openssl]# openssl genrsa 1024
Generating RSA private key, 1024 bit long modulus
.........................................................++++++
......................++++++
e is 65537 (0x10001)
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDFEQgnB+nfeCF/ZmqukVRuktiQ6z/Yr4r96F1tLnflJNFg5Kg4
AIr5tdCMObfNhnLNO8NBtk9ctcmmWHo6uLVrb39KR76bhteA/VKQlysMEE3EvEfS
I6CadWf/XWg5Ckzv6UJBCMrRjd5jl+MkOzmy9KuHQ1043apFGCUFK4chRQIDAQAB
AoGASet8ml9ui8OdFRPOupKLEDsG/z0vItGeGmX5/YVrtclcvLKoovEZMFfR1Xel
CXQARhm/wTtog4cxD7OqjbJRYkXSqdTOKtu0M3zH6DV3IgnfE6hvQ2JXDddcsu9T
gSA0UNOq+qToRkeUI7gay6bTOBmOB366cT8Jwti9HmuEuxUCQQDlbLhWcYSnDdVn
d2bNUFi1sUS80ZvaKc//ocpXIy2XxvdVKlsAtK1sctY+rl8nRxRlr/fsFoXThA0s
Ni5+c5MLAkEA2+TGND2LkknUZZhMBl1ge08kOh96bY2oTyeVIdyHMkbPxHI5R6cO
ZhAYjmeEsad2589nws8GgB2Y24ggaKrO7wJBAK+/pUazF0dRlZT5JstJLWuiLGHo
wFdTiH7vVa2CyT5nsLiRBb14qxFUt0K1GTdhgAKV1noIluP9WInxx5QevRkCQC+P
kOs1sJ2IiH8c7Lynr7mcCYrkyhct/4x3VENJrphKRqAH0KnV0UB0FMugSkwem5JS
AvBY1OAbBrfc/p2E7FMCQGA4MQLojLYeV3EyCAAfqvK3bbMtwt/fQAxq1GgczVnZ
OpWFRg5T7oVC1JhWTYXecXAVy9iVyCmfRTVSul2u+kY=
-----END RSA PRIVATE KEY-----

          我们可以看到,他生成的是一个私钥,我们的公钥是从私钥中提取出来的。我们也可以将这个密钥对保存下来,可以通过输出重定向或者-out参数

[root@www openssl]# openssl genrsa 1024 > /application/openssl/mykey.private
Generating RSA private key, 1024 bit long modulus
........++++++
...........................................................................++++++
e is 65537 (0x10001)
[root@www openssl]# openssl genrsa -out  /application/openssl/mykey2.private 1024
Generating RSA private key, 1024 bit long modulus
...++++++
...............++++++
e is 65537 (0x10001)
[root@www openssl]# ll /application/openssl/mykey*
-rw-r--r-- 1 root root 887 4月  20 04:01 /application/openssl/mykey2.private
-rw-r--r-- 1 root root 891 4月  20 04:00 /application/openssl/mykey.private

          我们可以看到我们的文件所有用户都是有读权限的,即我们的私钥能被其他人读取,因此任何时候我们生成的私钥都应该改为仅自己能读能写,因此我们可以通过这种方式来进行创建

[root@www openssl]# (umask 077;openssl genrsa -out /application/openssl/mykey3.private 2048)
Generating RSA private key, 2048 bit long modulus
......................................................+++
...................................................................+++
e is 65537 (0x10001)
[root@www openssl]# ls -l /application/openssl/mykey3.private 
-rw------- 1 root root 1675 4月  20 04:04 /application/openssl/mykey3.private

          我们可以看到通过这种方式创建出来的文件权限为600,即只有自己可以读写。我们使用括号括起来表示在子shell中运行, 我们在子shell中设置umask为077然后第二个命令也就受子shell影响了,等结束后回到主进程我们的父shell umask是不变的

      (2)、提出公钥。我们一般不需要自己提,但是我们现在介绍方法

        1)、命令:openssl rsa -in /application/openssl/mykey3.private -pubout

[root@www openssl]# openssl rsa -in /application/openssl/mykey3.private -pubout -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmVYzxY1JBDmTB+IDbf3O
oGQoTlnrkKqpZMfFFDG87niSAfHqvPU8EcMu/duLjSZy88MR6JsUpt9+9Q2NVNHa
SKbozM17OGvg9PvybNsBXAoWplkC4SV8Wh5N9NjfPxNWq+YerTiTFNjKn9KVDKQi
1dWAc2/FhD7Xu3GuhzsfHhO8Ve89EixPxh+jT1dNfsfmp0k1Zc6AZg1dra5ZMSl6
XlOyxaZRKL5OLQ6ZTjHmX/kGsuAV/EXcaxcZEaFbLqKauad/Eis8qfm5ilZ9X6ck
xpenuVgXpNXUNqmTwW6+acB2/OQxbvPYGEar3PjNThlak6KU3bdlt1G1BST8xUfG
swIDAQAB
-----END PUBLIC KEY-----

  8、Linux系统上的随机数生成器

    a、/dev/random:仅从熵池返回随机数,随机数用尽,阻塞

    b、/dev/urandom:从熵池返回随机数,随机数用尽,会利用软件生成伪随机数,非阻塞。但是伪随机数是不安全的

    c、熵池中的随机数来源:熵池就是运行中的内核在内存中维护的一段空间,这段空间中存储了大量的随机数,不过刚启动时是空的。他的来源一般有两种

      (1)、硬盘IO中断时间间隔

      (2)、键盘IO中断时间间隔,获取随机数的时候不是复制,而是剪切,如果取的随机数多余生成的随机数随机数就被耗尽了。

      (3)、所以我们的随机数取的时候被阻塞我们就猛着敲键盘,或者复制文件,这种操作会有大量的磁盘IO

三、自己生成CA做证书

  1、公共信任CA,私有CA

  2、建立私有CA:

    a、openssl

    b、OpenCA:一个开源的CA工具,其实其底层也是用的opensll,只是使用起来更简单了

  3、openssl命令

    a、配置文件 /etc/pki/tls/openssl.cnf。这个配置文件中为openssl扮演一个CA管理工具提供了相关配置,我们可以在[ca]这个字段中查看

[root@www openssl]# cat /etc/pki/tls/openssl.cnf |grep -Ev "^#|^$"|grep -wA22 ca
[ ca ]
default_ca    = CA_default        # The default ca section
[ CA_default ]
dir        = /etc/pki/CA        # Where everything is kept,即作为CA的默认工作目录
certs        = $dir/certs        # Where the issued certs are kept,用来放签发过的证书的位置
crl_dir        = $dir/crl        # Where the issued crl are kept,用来存放吊销的证书
database    = $dir/index.txt    # database index file. #数据库文件,存放了已经颁发过的证书的索引
                    # 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
name_opt     = ca_default        # Subject Name options
cert_opt     = ca_default        # Certificate field options
default_days    = 365            # how long to certify for #证书的默认有效期
default_crl_days= 30            # how long before next CRL 
default_md    = sha256        # use SHA-256 by default #默认消息摘要算法是sha256
preserve    = no            # keep passed DN ordering
policy        = policy_match

  4、构建私有CA

    a、在确定配置为CA的服务器上生成一个自签证书,并为CA提供所需的目录及文件即可

    b、步骤

      (1)、生成私钥;默认放在/etc/pki/CA/private/目录下

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

[root@www openssl]# (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@www openssl]# ll /etc/pki/CA/private/cakey.pem 
-rw------- 1 root root 3243 4月  20 04:52 /etc/pki/CA/private/cakey.pem

      (2)、生成自签证书

[root@www openssl]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3656 
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) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:wohaoshuai
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:ca.wohaoshuai.com
Email Address []:1209989516@qq.com
[root@www openssl]# ll /etc/pki/CA/
总用量 4
-rw-r--r--  1 root root 2130 4月  20 04:59 cacert.pem 
drwxr-xr-x. 2 root root    6 8月   4 2017 certs
drwxr-xr-x. 2 root root    6 8月   4 2017 crl
drwxr-xr-x. 2 root root    6 8月   4 2017 newcerts
drwx------. 2 root root   23 4月  20 04:52 private

        上述/etc/pki/CA/目录下的其它目录如果存在不用管它如果不存在需要手动创建

        1)、我们上述命令解释如下:

          -new:表示生成一个新请求

          -x509:如果是自签证书就需要加此参数

          -key:表示私钥在什么地方(因为证书中的公钥是在私钥中提取的)

          -out:指明证书保存在什么地方,/etc/pki/CA/目录是固定位置

          -days:指明我们证书的有效期限是多少天,默认是365天,我们这儿指明的是10年

        2)、需要我们输入的内容

          Country Name:两个字符的国家代码,此处我们写的是CN,即中国

          State or Province Name:在哪个州,此处我们写的Beijing

          Locality Name:在哪个城市,此处我们也写的Beijing

          Organization Name:公司名字,此处我们写的是wohaoshuai

          Organizational Unit Name:部门名称,此处我们写的是运维部,即Ops

          Common Name:证书持有者自己的人名或证书所在的服务器的名字,此处我们写的ca.wohaoshuai.com

          Email Address:管理员邮箱,此处我们写的1209989516@qq.com

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

        1)、创建目录

[root@www openssl]# mkdir /etc/pki/CA/{certs,crl,newcerts}

        2)、创建文件

[root@www openssl]# touch /etc/pki/CA/{serial,index.txt}
[root@www openssl]# ll /etc/pki/CA/
总用量 4
-rw-r--r--  1 root root 2130 4月  20 04:59 cacert.pem
drwxr-xr-x. 2 root root    6 8月   4 2017 certs
drwxr-xr-x. 2 root root    6 8月   4 2017 crl
-rw-r--r--  1 root root    0 4月  20 05:21 index.txt
drwxr-xr-x. 2 root root    6 8月   4 2017 newcerts
drwx------. 2 root root   23 4月  20 04:52 private
-rw-r--r--  1 root root    0 4月  20 05:21 serial

        3)、我们serial文件不能为空因此我们可以重定向一个数据进去

[root@www openssl]# echo 01 > /etc/pki/CA/serial

  5、要用到证书进行安全通信的服务器,需要向CA请求签署证书

    a、步骤

      (1)、这个步骤需要在要用到证书进行安全通信的服务器上面,假如我们现在有一台服务器node2中有httpd服务,然后我们进入到相应的httpd目录中创建ssl目录,在目录中生成相应的私钥和对应的证书签署请求,并将公钥发给我们的CA服务器www请求证书

        1)、我们创建相应的文件夹

[root@node2 ~]# mkdir /etc/httpd/conf/ssl
[root@node2 ~]# cd /etc/httpd/conf/ssl
[root@node2 ssl]# ls

        2)、生成私钥

[root@node2 ssl]# (umask 077;openssl genrsa -out /etc/httpd/conf/ssl/httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
...................................................+++
............................................+++
e is 65537 (0x10001)
[root@node2 ssl]# ll
total 4
-rw------- 1 root root 1679 Apr 20 05:34 httpd.key

        3)、生成证书签署请求

[root@node2 ssl]# openssl req -new -key /etc/httpd/conf/ssl/httpd.key -out /etc/httpd/conf/ssl/httpd.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
State or Province Name (full name) []:Beijing
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:wohaoshuai
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:www.wohaoshuai.com
Email Address []:1209989516@qq.com

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

          上述-out 参数后的/etc/httpd/ssl/httpd.csr文件即为我们的签署请求

          下面让输入的内容中www.wohaoshuai.com这个内容一般是我们互联网访问我们的主机的域名,访问时也必须严格按照此名字否则证书不通过

          最后两行的密码敲enter即可

        4)、然后我们把httpd.csr这个证书签署请求发给我们的CA服务器www让其给签署一下,下面是我们的www服务器的操作

          首先我们拷贝我们node2服务器上的证书签署请求

[root@www /]# scp root@192.168.10.14:/etc/httpd/conf/ssl/httpd.csr /application/
root@192.168.10.14's password: 
httpd.csr                      
[root@www /]# ll /application/httpd.csr
-rw-r--r-- 1 root root 1066 4月  20 05:45 /application/httpd.csr

          然后我们开始签署

[root@www /]# openssl ca -in /application/httpd.csr -out /etc/pki/CA/certs/httpd.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: Apr 19 21:49:21 2020 GMT
            Not After : Apr 19 21:49:21 2021 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Beijing
            organizationName          = wohaoshuai
            organizationalUnitName    = Ops
            commonName                = www.wohaoshuai.com
            emailAddress              = 1209989516@qq.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                A3:69:40:E3:BA:9A:31:C7:B4:83:D1:A9:E6:66:F1:4B:6B:3D:CB:66
            X509v3 Authority Key Identifier: 
                keyid:0F:8F:62:47:89:2E:2F:AD:3D:B0:FD:79:E9:C8:A7:57:B2:23:74:1C

Certificate is to be certified until Apr 19 21:49:21 2021 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

          注意我们签署后的证书是httpd.crt,开始证书签署请求的名字是httpd.crs。后面两个询问是问你签不签,并且确认签不签,输入y即可

           然后我们来看我们此时的database文件

[root@www /]# cat /etc/pki/CA/index.txt
V    210419214921Z        01    unknown    /C=CN/ST=Beijing/O=wohaoshuai/OU=Ops/CN=www.wohaoshuai.com/emailAddress=1209989516@qq.com

          V表示已经签过的。01是序列号,最后这一段是subject,是主题信息,也叫主题标识

         5)、然后我们把签好了的证书发送给node2

[root@www /]# scp /etc/pki/CA/certs/httpd.crt root@192.168.10.14:/etc/httpd/conf/ssl/
root@192.168.10.14's password: 
httpd.crt                  

    b、总结(以httpd为例)

      (1)、用到证书的主机生成私钥

        mkdir /etc/httpd/conf/ssl

        cd /etc/httpd/conf/ssl

        (umask 077;openssl genrsa -out /etc/httpd/conf/ssl/httpd.key 2048)

      (2)、生成证书签署请求

        openssl req -new -key /etc/httpd/conf/ssl/httpd.key -out /etc/httpd/conf/ssl/httpd.csr -days 365

      (3)、将请求通过可靠方式发送给CA主机

        scp root@192.168.10.14:/etc/httpd/conf/ssl/httpd.csr /application/

      (4)、在CA主机上签署证书

openssl ca -in /application/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365

        1)、查看证书中的信息,我们可以通过参数查看相应的字段内容,此处我们只查看序列号和subject信息 

[root@node2 ssl]# openssl x509 -in httpd.crt -noout -serial -subject
serial=01
subject= /C=CN/ST=Beijing/O=wohaoshuai/OU=Ops/CN=www.wohaoshuai.com/emailAddress=1209989516@qq.com

  6、吊销证书

     a、步骤

      (1)、客户端获取要吊销的证书的serial(在使用证书的主机上执行);

[root@node2 ssl]# openssl x509 -in httpd.crt -noout -serial -subject
serial=01
subject= /C=CN/ST=Beijing/O=wohaoshuai/OU=Ops/CN=www.wohaoshuai.com/emailAddress=1209989516@qq.com

      (2)、在CA上执行,CA主机吊销证书

        1)、先根据客户端提交的serial和subject信息,对比本机数据库index.txt中存储的是否一致

        2)、吊销

[root@www /]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem

          其中的01.pem即serial.pem,也就是我们相应httpd.crt证书的序列号,证书创建时该序列号就有了

        3)、生成吊销证书的吊销编号(第一次吊销证书时执行)

          echo 01 > /etc/pki/CA/crinumber

        4)、更新证书吊销列表

          openssl ca -gencrl -out thisca.crl

        5)、查看crl文件

          openssl crl -in /PATH/FROM/CRL_FILE.crl -noout -text 

原文地址:https://www.cnblogs.com/Presley-lpc/p/12731332.html