本文大纲:

1、为什么网络通信要进行数据加密?

2、数据加密方式有哪些?它们是如何进行加密的?

3、通信中是如何进行数据加密传输的?

4、https方式进行数据传输的具体流程

5、SSL 的实现工具OpenSSL

6、创建私有CA和证书申请

1、为什么网络通信要进行数据加密?

我们在网络进行通信时候,如果数据以明文的方式传输,在传输过程中,数据可以被篡改、窃听、伪装等,如图:

当A向B通信时,C可以在数据传输的过程,将数据进行抓包,例如应用wireshark抓包软件,就可以抓取通信的数据包,进行对抓到的内容进行分析,得出传输数据的内容。

2、数据加密方式有哪些?

从分类上划分,加密技术有四种:

1)对称加密

◆ 对称加密:加密和解密使用同一个密钥

      ·DES:Data Encryption Standard,56bits

      ·3DES:

      ·AES:Advanced (128, 192, 256bits)

      ·Blowfish,Twofish

      ·IDEA,RC6,CAST5

◆ 特性:

      ·加密、解密使用同一个密钥,效率高;

      ·将原始数据分割成固定大小的块,逐个进行加密;

◆ 缺陷:

     ·密钥过多;

     ·密钥分发;

      ·数据来源无法确认

◆ 事例说明:其实我们平时用的最多的加密方式就是对称加密算法,比如我们使用通过https的方式浏览网页。只是在进行页面数据传输前,通过非对称加密的方式来传输对称秘钥,后面会详细介绍。

2)非对称加密(公钥加密)

◆ 非对称加密采用公钥加密,同时还需要另一个秘钥来解密,也就是私钥;两者统称为密钥对。

      ·公钥:从私钥中提取产生,公开给所有人;public key

      ·私钥:通过工具创建,使用者自己留存,必须保证其私密性;secret key

◆ 特点:

      用公钥加密数据,只能使用与之配对的私钥解密;反之亦然

◆ 功能:

      ·身份认证:私钥拥有者用自己的私钥加密的数据,只要用其公钥能解密,即可认证其身份;私钥加密的这个过程为数字签名。

      ·密钥交换:与被通信方之前,首先获取到对方的公钥,自己生成一个加密密码,用对方的公钥加密,并发送给对方;

      ·数据加密:适合加密较小数据(不常用,比对称加密要慢3个数量级)

◆ 缺点:

      密钥长,加密解密效率低下

◆ 算法:

      RSA(加密,数字签名),DSA(数字签名),ELGamal

◆ 基于一对公钥/私钥对

      用密钥对中的一个加密,另一个解密

◆ 实现加密过程:

       ·接收者

           生成公钥P和私钥S

           公开公钥P,保密私钥S

       ·发送者

           使用接收者的公钥P来加密消息M

           将P(M)发送给接收者

       ·接收者

          使用私钥S来解密:M=S(P(M))

◆ 实现数字签名:

       ·发送者

           生成公钥/私钥对:P和S

           公开公钥P,保密密钥S

           使用私钥S来加密消息M

           发送给接收者S(M)

       ·接收者

           使用发送者的公钥来解密M=P(S(M))

           结合签名和加密

           分离签名

事例说明:我们在银行办理网银时,银行提供的U盾就是含有公钥的证书。银行之所以当面提供U盾,就是以一种可靠的方式把公钥给我们,防止被冒充。记得以前在网页使用支付宝的时候,也必须要要下载加密控件,这也是含有公钥的证书,用来加密数据。

    

3)单向加密

◆ 只能加密,不能解密,因为解密过程是一个二次加密的过程;主要是提取数据的特征码,即“数据指纹”

◆ 特性:

       ·任意长度输入

       ·固定长度输出

       ·若修改数据,指纹也会改变(“不会产生冲突”)

       ·无法从指纹中重新生成数据(“单向”)

◆ 功能:

       数据完整性(完整性校验)

       系统账号密码校验

◆ 算法:

       md5:Message Digest 5(消息摘要),128bits;

       sha1:Secure Hash Algorithm 1(安全哈希算法) ,160bits

       sha224,sha256,sha384,sha512

事例说明:我们平时访问网站,需要注册账号密码,网站就是以单向加密的方式,将密码加密放到数据库,我们在下次输入认证时,网站程序根据相应的加密算法加密我们提供的密码数据,与数据库里加密的密码进行对比,网站就是基于这种方式进行认证的,所以网站后台服务器也不知道我们的明文密码,这就是当你的密码忘记时,只能修改的原因了。当然,我们提供原始密码给网站是,也是通过加密传送的。

4)密钥交换

◆ 密钥交换(IKE):双方通过交换密钥来实现数据加密解密;密钥交换有两种

公钥交换:将公钥加密后通过网络传输到对方进行解密,这种方式很有可能别截获破解,不常用;

 DH:双方共有一些参数,共同协商加密算法,除此之外双方还有属于自己的私有参数,通过共有参数、私有参数和算法信息来进行加密,然后双方将计算后的结果进行交换,交换完成后再和属于自己私有的参数进行特殊算法,经过双反计算后的结果是相同的,而这个结果就是密钥。

        如:A有p和g两个参数,A还有一个属于自己的私有参数x;

          B有p和g两个参数,B还有一个属于自己的私有参数y;

          A和B有相同的加密算法即:

              A:p^x%g

              B:p^y%g

          然后双方交换计算后的结果,此时

          A拿到B的p^y%g,B拿到A的p^x%g,双方再和自己私有参数进行相同的算法,即

              A:对p^y%g 再求x次方得(p^y%G)^x=p^xy%g

              B:对p^x%g 再求y次方得(p^x%G)^y=P^xy%g

          最后A和B的结果是一样的

  注意:整个过程中对于第三方人员来说只能获取p,g两个值,AB双方交换的是经过计算后的值,因此这种加密算法是很安全的。

3、通信中是如何进行数据加密传输的?

当Tom要向Jerry通信时,在网络世界A和B肯定是素未谋面的,如果使用非对称加密,那么Tom、Jerry肯定要先交换公钥,用来加密传送的数据。如下图:

Tom和Jerry通过公共网络交换公钥,TOM和Jerry通过对方的公钥加密数据,用自己的私钥解密数据,看似天衣无缝,大家有没有想过,在通信链路上,会有第三个人,在TOM向Jerry通信时,冒充Jerry,在Jerry通信时,在冒充Tom。然后Tom和Jerry看似两个人通信,实则有个中间人,不停的窃取信息,过程如图:

当Tom向Jerry发送公钥时,第三方jack冒充Jerry,接受到Tom的公钥,并将自己的公钥发给Tom,Tom以为一直在和Jerry通信,其实是在Jack通信。

如何避免这种情况呢?

这里就不得不提到PKI了:公钥基础设施

先说明几个概念:

◆ PKI: Public Key Infrastructure

 公钥基础设施:

       签证机构:CA(Certificate Authority)

       注册机构:RA

       证书吊销列表:CRL

       证书存取库:

◆ X.509:定义了证书的结构以及认证协议标准

       版本号:version

       序列号:serial number CA用于唯一标识此证书;

       签名算法标志:

       颁发者:即CA自己的名称;

       有效期限:两个日期,起始日期和终止日期

       主体名称:证书拥有者自己的名字

       主体公钥:证书拥有者自己的公钥信息

       发行者的唯一标识:

       证书主体的唯一标识

       CRL分发点:

       扩展信息

       发行者签名:CA对此证书的数字签名

◆ 验证证书过程:

     1.用CA的公钥去解密CA的全名,能解密说明证书来源可靠;

     2.用同样的加密算法去加密证书取得特征码,与解密出的特征码相比较,如果二者相同,说明证书完整性可靠;

     3.检查证书的有效期限在不在当前合理的有效范围内;

     4.验证主体名称和期望通信的对方是否一致;

     5.检查证书是否被吊销。

◆ 证书类型:

      证书授权机构的证书

      服务器

      用户证书

◆ 获取证书两种方法:

     1.使用证书授权机构;

          生成签名请求(csr)

          将csr发送给CA

          从CA处接收签名

     2.自签名的证书;

          自已签发自己的公钥

上面在介绍非对称加密是也说过了,非对称加密的缺点是加密速度慢,所以在进行数据传输时,我们是不使用非对称加密的。而是使用公钥加密对称密码,传输给对方,私钥进行数据签名。利用CA证书,进行公钥认证

具体是如何实现的呢?

看下图:

加密过程说明:

1)Tom和Jerry利用非对称加密算法获得一对公钥私钥,利用公钥向证书颁发机构CA申请证书;

2)Tom需要和Jerry通信时,会将双发的公钥发给对方,对方通过根证书验证,防止证书被验证;

3)Jerry向Tom发送数据时,Jerry会利用某种单向加密算法,提取data的特征码,再利用自己的私钥加密特征码,形成数字签名(数据签名是为了实现身份认证);Jerry会生成一个随机对称秘钥,用于加密Tom请求的数据、特征码和数字签名,然后用Tom的公钥加密随机对称秘钥。最后将这一段数据通过网络发送给Tom。

4)Tom收到数据,利用自己的私钥解密,得到对称密钥,进而用对称密钥解密得到data、特征码和数字签名;使用同一种算法来计算data的特征码,与Jerry发来的特征码对比,如果相同,数据 的完整性得到验证;用Jerry的公钥解密数字签名,能够解密,Jerry的身份得到验证。

CA证书最主要的功能就是认证我们要访问的服务器公钥有权威性;而公钥是可以公开的,为了加密传送的数据(一般是用来加密对称密钥的);对称密钥是临时随机生成的,为了更快的加密解密数据。

4、https方式进行数据传输的具体流程

下面来说说PKI的具体实现,我们以SSL(安全套接字层)为例。

http是超文本传输协议,https就是以ssl为基础的超文本传输协议,我们平时上网,像支付宝网站使用的就是https协议。为什么呢?因为支付宝涉及到金融方面,当然要加密。但是现在百度也用https了,上面说过了,数据加密传输会导致传输过程变慢,那百度又为什么使用https协议呢,因为如果不加密,我们申请的页面在中途可以被网络运营商添加了其他数据(比如广告)。

SSL是在应用层和传输层之间:

流程如下:

具体的四个阶段说明:

第一阶段:ClientHello:

     支持的协议版本,比如tls 1.2;

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

     支持的加密算法,比如AES、3DES、RSA;

     支持的压缩算法;

第二阶段:ServerHello

     确认使用的加密通信协议版本,比如tls 1.2;

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

     确认使用的加密方法;

     服务器证书;

第三阶段:

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

     发送以下信息给服务器端:

     一个随机数;

     编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;

     客户端握手结束通知;

第四阶段:

     收到客户端发来的第三个随机数pre-master-key后,计算生成本次会话所有到的“会话密钥”;

     向客户端发送如下信息:

     编码变更通知,表示随后的信息都将用双方商定的加密方法和密钥发送;

     服务端握手结束通知;

5、SSL 的实现 工具OpenSSL

 1)OpenSSL介绍

◆ OpenSSL:是ssl的开源项目,有三部分组成:

    ·openssl: 多用途的命令行工具,每种功能都使专用的子命令来实现;

      ·libcrypto: 加密,解密库文件;

      ·libssl:加密模块应用库,实现了ssl及tls;

◆ Openssl命令:

      ·两种运行模式:交互模式和批处理模式

      ·opensslversion:程序版本号

      ·子命令分类:

             标准命令:enc, ca, req, …

             消息摘要命令(dgst命令)

             加密命令(enc子命令)

 2)OpenSSL在几种加密方式上的实现:

  ◆ 对称加密   

工具:openssl enc, gpg     算法:3des, aes, blowfish, twofish     enc命令:man enc     加密:openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher     解密:openssl enc -d -des3 -a -salt -out testfile.cipher -in testfile     说明:     des3 为算法,     in 后面的testfile 表示要加密和解密的文件,     out后面的testfile.copher表示加密和解密后输出的文件名。

使用实例

加密:[root@wlm ~]# openssl enc -e -des3 -a -salt -in /etc/fstab -out fstab.ciphertextenter des-ede3-cbc encryption password:    # 输入加密解密的密码Verifying - enter des-ede3-cbc encryption password:#对文件fstab采用des3算法,加盐进行加密后生成fstab.ciphertext文件[root@wlm ~]# cat fstab.ciphertext  # 查看加密后生成的文件U2FsdGVkX18OFHgdamDTdh9Xkh5SnT1nafB/a1mX/u521aE6uVLZKwrMvpWEGpxe+5tlaIT2iZ6C3x9a4mV3JVtvieUzvZiF8uCQ02Wzgan4sDDJjbcWZRV6RH+xNEVNvmK7G2F1pNBx/1zZ2CVz6D40ijnWWO4g5K6kUFXptVn7myRQGO5IaJl9q4/CxLkljrzz5P9O/mpWgMPU6bDM9Itp06Bs2t5Lh3LUfB0Kc/Z9DiaiG44sakU1H/xgkGO7QDoTeq4Jew8zRIwVOBh/7oyYAst7FlQZ+Ep10Hr3rk7nFm9z2+2wpnfslSJ6MdnmVW0/kqBE5UAOK9MWmKDnDgiJbr+TwxUltCW6+NpbWFrS6uUTsSqa/uD5IEv9FI2PxjdOO3I4MtCphlMvao16cwS0TXiggHoyA3KiI+ubH8+vlTvGsV/rmFjg44r5d9U2PdKxJn8vQSccEV97d4Az8qnmZy0G6CZ9JMe1u95BirJ5tfl2csBJdIkH2LyNgVi4otVe7ZHVlHuaT+4D2sBlqz1jbon3ldWE1c9r8MXVOxJW/NMzt9AQTnh46jqXhoSC6cRa1wZtmWKcUlxgbQP5itGgk4gR85z1Vzw8f8tXWOOE4fZ98WvJb7gjoIVLxzgNCR5wltR98p/foiVd7XUayJbqhM5UVvnoC+ONspHu/I8YxrEMF7qy6lfm7zBrhcJr1yjrMv5YXh1DmCx1lyJYg+pukw398JUzdhZmS4sd17g=解密:[root@wlm ~]# openssl enc -d -des3 -a -salt -out fstab.plaintext -in fstab.ciphertext #对生成的加密文件进行解密后生成fstab.plaintext文件enter des-ede3-cbc decryption password:[root@wlm ~]# cat fstab.plaintext ## /etc/fstab# Created by anaconda on Tue Oct 25 23:13:51 2016## 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 0UUID=3dc2559c-29f0-4e22-83b7-d979e6f60504 /boot                   xfs     defaults        0 0/dev/mapper/centos-home /home                   xfs     defaults        0 0/dev/mapper/centos-swap swap                    swap    defaults        0 0

   ◆ 单向加密  

工具:openssl dgst,md5sum, sha1sum, sha224sum,sha256sum… dgst命令:man dgst openssl dgst -md5 [-hex默认] /PATH/SOMEFILE md5sum /PATH/TO/SOMEFILE 生成用户密码(passwd、openssl passwd) passwd命令:man sslpasswd openssl passwd -1 -salt SALT(最多8位) (-1表示md5加密算法) MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现网络通信中保证所传输数据的完整性机制       CBC-MAC       HMAC:使用md5或sha1算法 生成随机数:man sslrand openssl rand -base64|-hex NUM NUM: 表示字节数;-hex时,每个字符4位,出现的字符数为NUM*2

使用实例:

[root@wlm ~]# md5sum /etc/fstab  # 用md5sum工具单向加密4ff1c89ff262b69b052da3b39dc55dd1  /etc/fstab[root@wlm ~]# openssl dgst -md5 /etc/fstab   # 用openssl dgst工具加密,指明算法MD5(/etc/fstab)= 4ff1c89ff262b69b052da3b39dc55dd1# 可以看到虽然两种加密的工具不一样,但算法相同,所以生成的特征码也相同[root@wlm ~]# openssl passwd -1 -salt 12345678  # 生成用户密码,salt最好用随机数Password: $1$12345678$dIIIm/OyqjkXByKhUmS87.[root@wlm ~]# openssl passwd -1 -salt 12345679Password: $1$12345679$y9/F8SevA2iXmnvxmvovH/# 雪崩效应:初始数据的微小变化,导致加密结果的巨大变化生产随机数:[root@wlm ~]# openssl rand -base64 10  # 10代表的是长度QITPCPNvb6jsBQ==[root@wlm ~]# openssl rand -hex 1097150eca6a7b1a3ef88f[root@wlm ~]# openssl passwd -1 -salt `openssl rand -hex 4` # 命令替换生成随机数Password:     # 添加随机数使密码跟难破解$1$d6c13587$1azIVIk.dCVtz66ePVF5i0

  ◆ 公钥加密

加密解密:     算法:RSA, ELGamal     工具:gpg, openssl rsautl(man rsautl) 数字签名:     算法:RSA, DSA, ELGamal     工具:gpg, openssl rsautl(man rsautl) 密钥交换     算法:DH     DSA: Digital Signature Algorithm     DSS:Digital Signature Standard     RSA      利用OpenSSL制作非对称密钥步骤: 生成密钥对(man genrsa) 生成私钥:     openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS 生成的的私钥不安全     (umask 077; openssl genrsa -out key.pri–des 2048)     私钥仅自己能读能写,使用括号是启用了一个子shell,仅对子shell有效,对父shell不受影响; 从私钥中提取公钥:     openssl rsa -in /PATH/TO/SOMEFILE –pubout 随机数生成器(伪随机数字)     熵池:在操作系统上有一个叫做熵池的地方,他是用来保存硬件中断产生的随机数(每一次硬件中断都会产生一个随机数)     /dev/random:仅从熵池中返回随机数,随机数耗尽时,取随机数的进程将会被阻塞;     /dev/unrandom:仅从熵池中取随机数,随机数耗尽时,就通过伪随机数生成器生成伪随机数;(伪随机数不安全) 熵池中随机数的来源     硬盘IO中断时间间隔     键盘IO中断时间间隔

使用实例:

制作私钥:[root@wlm ~]# openssl genrsa 1024     # 直接使用命令生成1024位的私钥Generating RSA private key, 1024 bit long modulus.++++++....++++++e is 65537 (0x10001)-----BEGIN RSA PRIVATE KEY-----MIICXgIBAAKBgQDABQtFqye6AhsMiDLZTi7IP62H/4PBg7jKUbTmrreL5wkJtu4X3DXSfZYJqIgcoe/d0LlSyncL6pTWikQKYIE+GBU7QRgTYcxHx+wVplQjCRjnLJwCj5KGfDML+IzePoq79kR2bf/9QrJqayek8jMFby0e8JXk6QW7lKZpE46k1QIDAQABAoGBAL9+yEUMcavxGaSf14YbkFAoIRk12uIMSSeL4IsFxwqAt+S2SDAHbq2ijRTIvCVB4gMmewtz2tFJenGSplRq9beGzX8cnMS9Iim4SvJx2IIFGtiQUIy3jvUgutsCw8aLob4il8xzJS9x5xN+6XgTr3/W7iuZBwQKt9ZKclKCT5gpAkEA/k3AbiZe87xMrllcNpCEm0HxJhzFWATss5AVi4GQS9ttlDD/WcysLrLd4ETKc0o0ci7zaIxBhNdXWU4TytEq1wJBAMFM77QaYVxmzJzLTAjnJUP6/Wh4P1Lo8py2cDodGwPc9lyJrjubFKLiYNyGp2Y6E/ciFfnaKU+QLTbOkIlORDMCQQCxaVrbPae2kOJKLAtaAb6RdhKfjSjb/CuKJfXx6oTZdw7eeMRcSJ7CwYRrBnLataUbF8g2Ysr+uyC0K/VA5GXnAkAZFFlZXb7aFUBg64OO+CZ+nnb4cfmNUUoBCS6ga5xQsP+J3BcuBp3z0DlPA21+tvRWMSb2xtZrS0KChOR93Bi/AkEAiNa+p3IunLRSlqn2KIXQIjTYoMvZrPo51lWq2NyPHTBsIKu4/8hcwrSvBr8Xy+Lmywze7NhTXMOnAJPJtaqRYA==-----END RSA PRIVATE KEY-----[root@wlm ~]# openssl genrsa 1024 >/tmp/opensll/mykey.private    Generating RSA private key, 1024 bit long modulus.....++++++        # 可以使用重定向的方式将密钥保存到某个文件..++++++e is 65537 (0x10001)[root@wlm ~]# openssl genrsa -out /tmp/opensll/mykey.private 1024Generating RSA private key, 1024 bit long modulus..++++++            # 也可以使用-out参数来保存...............++++++e is 65537 (0x10001)[root@wlm ~]# (umask 077;openssl genrsa -out /tmp/opensll/mykey1.private 1024)#使用()里面执行umask 077,代表在子shell中设置umask,不影响当前shell,默认生成的文件只有所有者的rw权限Generating RSA private key, 1024 bit long modulus.........................................++++++.............................................................................++++++e is 65537 (0x10001)[root@wlm ~]# ll /tmp/opensll/总用量 8-rw-------. 1 root root 887 11月 15 10:15 mykey1.private-rw-r--r--. 1 root root 887 11月 15 10:14 mykey.private从私钥中提取公钥:root@wlm ~]# openssl rsa -in /tmp/opensll/mykey1.private -pubout # 自己生成公钥writing RSA key-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC0IOhVR9c12ckpZKvCqcbd+A463h3nLRdx0iP1xvV8SdwLhXrdGBZolxc8MVF6xwxetQBt1qZI+6bjXqyDly2mcTTHV1qQJ/oxNKnyxNq92kLACz/IVXLpG9P8ln0LgXVi7PyIbXA0B+2a0WXsy07kCFCJDCDV8aqXOTTq76iLmQIDAQAB-----END PUBLIC KEY-----[root@wlm ~]# openssl rsa -in /tmp/opensll/mykey1.private -pubout > /tmp/opensll/mykey.public    # 将公钥保存为文件writing RSA key[root@wlm ~]# ll /tmp/opensll/总用量 12-rw-------. 1 root root 887 11月 15 10:15 mykey1.private-rw-r--r--. 1 root root 887 11月 15 10:14 mykey.private-rw-r--r--. 1 root root 272 11月 15 10:22 mykey.public

6、创建私有CA和证书申请

 1)创建CA

★数字证书的获取有两种方法:     第一种:向RA注册申请即公共信任的CA;     第二种:自己创建私有CA          openssl           OpenCA  ★使用OpenSSL创建私有CA的步骤:      在确定配置为CA的服务上生成一个自签证书,并为CA提供所需要的目录及文件即可;        1)生成私钥;        2)生成自签署证书;           私钥用于签发证书时,向证书添加数字签名使用;           证书:每个通信方都导入此证书至“受信任的证书颁发机构”  ★openssl配置文件:/etc/pki/tls/openssl.cnf    工作目录:/etc/pki/CA  ★具体步骤:    1)生成私钥文件/etc/pki/CA/private/cakey.pem         # (umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)    2)生成自签证书;        # openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650        其中:              -new:生成新证书签署请求;             -x509:生成自签格式证书,专用于创建私有CA时;             -key: 生成请求时用到的私有文件路径;             -days n:证书的有效时间,单位是day;             -out /PATH/TO/SOMECERTFILE: 生成的请求证书路径;如果自签操作将直接                                  生成签署过得证书     3)为CA提供所需的目录及文件        # mkdir /etc/pki/CA/{certs,crl,newcerts} (存在的话就不用创建了)        # toouch /etc/pkl/CA/index.txt (数据库文件)        # echo 01 > /etc/pki/CA/serial (序列号文件并给明第一个证书的序列号码) ★给节点颁发证书 要用到证书进行安全通信的服务器,需要向CA请求签署证书; 在证书申请的主机上进行如下步骤:         1)生成私钥;         2)生成证书签署请求; (注意:默认国家,省,公司名称必须和CA一致)         3)将请求通过可靠方式发送给CA主机 在CA主机上签发证书         1)验证请求者信息;         2)签署证书         3)把签署好的证书发还给请求者 ★吊销证书(了解) 在客户端获取要吊销的证书的序列号serial;    # openssl x509 -in httpd.crt -noout -serial -subject        在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致; 吊销证书;   # openssl ca -revoke /etc/pki/CA/newcerts/SERIAL.pem     其中SERIAL要替换成证书真正的序列号 生成吊销证书的编号(第一次吊销证书时才需要执行);   # echo 01 > /etc/pki/CA/crlnumber 更新证书吊销列表    # openssl crl -gencrl -out THISCA.crl

   2)创建私有CA的具体操作步骤

    创建私有CA

    (1)生成私钥文件

[root@wlm ~]# mkdir -p /etc/pki/CA/private    #创建私钥保存的目录[root@wlm ~]# (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@wlm ~]# ll /etc/pki/CA/private/ # 私钥只能自己保存,对保密性要求高总用量 4-rw-------. 1 root root 3243 11月 15 10:34 cakey.pem

    (2)生成自签证书

[root@wlm ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650# 如果是自请自签 加-x509 如果不是就不用加了#这个过程会自动从刚才第一步的私钥中抽取公钥#-new 生成新证书签署请求#-x509 生成自签格式证书 专用于创建私有CA时#-key 生成请求时用到的私有文件路径#-out 生成的请求文件路径 如果是自签操作将生成签署过的证书#-days 证书的有效时常 但为是day You are about to be asked to enter information that will be incorporatedinto 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 blankFor 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) []:SH    #省Locality Name (eg, city) [Default City]:SH    #城市Organization Name (eg, company) [Default Company Ltd]:DZH    #公司组织Organizational Unit Name (eg, section) []:Ops    #职位Common Name (eg, your name or your server's hostname) []:ca.wlm.com    #主机名Email Address []:mail@wlm.com    #邮箱

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

[root@wlm ~]# touch /etc/pki/CA/index.txt # 创建数据库文件[root@wlm ~]# echo 01 > /etc/pki/CA/serial # 创建序列号文件并给明第一个证书的序列号码[root@wlm ~]# ll /etc/pki/CA总用量 8-rw-r--r--. 1 root root 2049 11月 15 10:41 cacert.pemdrwxr-xr-x. 2 root root    6 6月  29 2015 certsdrwxr-xr-x. 2 root root    6 6月  29 2015 crl-rw-r--r--. 1 root root    0 11月 15 10:45 index.txtdrwxr-xr-x. 2 root root    6 6月  29 2015 newcertsdrwx------. 2 root root   22 11月 15 10:34 private-rw-r--r--. 1 root root    3 11月 15 10:46 serial

    至此,私有CA创建完毕。

   证书申请:    

    (我们这里以https为例,首先自己先建立一个可以访问的站点,详细步骤就不说了)

   (1)在证书申请的主机上生成私钥

[root@wlm ~]# cd /etc/httpd/[root@wlm httpd]# mkdir ssl    #创建保存私钥的目录[root@wlm httpd]# cd ssl[root@wlm ssl]# (umask 077;openssl genrsa -out httpd.key 2048) #生成私钥Generating RSA private key, 2048 bit long modulus......................................................+++...........................................+++e is 65537 (0x10001)[root@wlm ssl]# ll总用量 4-rw-------. 1 root root 1675 11月 15 11:05 httpd.key

   (2)生成证书签署请求

[root@wlm ssl]# openssl req -new -key httpd.key -out httpd.csr -days 365 # 在本地生成You are about to be asked to enter information that will be incorporatedinto 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 blankFor 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) []:SHLocality Name (eg, city) [Default City]:SHOrganization Name (eg, company) [Default Company Ltd]:DZHOrganizational Unit Name (eg, section) []:Ops    Common Name (eg, your name or your server's hostname) []:www.wlm.comEmail Address []:mail.wlm.comPlease enter the following 'extra' attributesto be sent with your certificate requestA challenge password []:     #密码可以不设置An optional company name []:

  (3)把请求发送给CA

[root@wlm ssl]# scp httpd.csr root@192.168.208.130:/tmp/ # 将请求签发的证书发个证书服务器,我们这里是同一台机器模拟了证书服务器和申请签发的客户机The authenticity of host '192.168.208.130 (192.168.208.130)' can't be established.ECDSA key fingerprint is 93:b6:c3:bf:a6:51:a7:4a:be:0c:14:93:ab:86:a1:56.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '192.168.208.130' (ECDSA) to the list of known hosts.root@192.168.208.130's password: httpd.csr                                           100% 1025     1.0KB/s   00:0

  (4)CA签发证书

[root@wlm tmp]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365# 签发证书,有效期为一年Using configuration from /etc/pki/tls/openssl.cnfCheck that the request matches the signatureSignature okCertificate Details:        Serial Number: 1 (0x1)        Validity            Not Before: Nov 15 03:15:54 2016 GMT            Not After : Nov 15 03:15:54 2017 GMT        Subject:            countryName               = CN            stateOrProvinceName       = SH            organizationName          = DZH            organizationalUnitName    = Ops            commonName                = www.wlm.com            emailAddress              = mail.wlm.com        X509v3 extensions:            X509v3 Basic Constraints:                 CA:FALSE            Netscape Comment:                 OpenSSL Generated Certificate            X509v3 Subject Key Identifier:                 49:7A:99:41:6E:72:27:8F:B8:F0:C3:77:6C:B8:8B:C0:9F:C7:7D:2A            X509v3 Authority Key Identifier:                 keyid:A8:28:9A:3B:91:A9:4C:90:A4:08:3D:79:34:0D:D3:19:0E:68:6F:1ACertificate is to be certified until Nov 15 03:15:54 2017 GMT (365 days)Sign the certificate? [y/n]:y1 out of 1 certificate requests certified, commit? [y/n]yWrite out database with 1 new entriesData Base Updated[root@wlm tmp]# cd /etc/pki/CA/[root@wlm CA]# lscacert.pem  crl        index.txt.attr  newcerts  serialcerts       index.txt  index.txt.old   private   serial.old[root@wlm CA]# cat index.txt    #查看第一个签发的证书V	171115031554Z		01	unknown	/C=CN/ST=SH/O=DZH/OU=Ops/CN=www.wlm.com/emailAddress=mail.wlm.com

  (5)把签署好的证书发还给请求者

[root@wlm CA]# [root@wlm CA]# pwd/etc/pki/CA[root@wlm CA]# scp certs/httpd.crt root@192.168.208.130:/etc/httpd/ssl/ # 发送证书root@192.168.208.130's password: httpd.crt                                           100% 5781     5.7KB/s   00:00    [root@wlm CA]# ls /etc/httpd/ssl/httpd.crt  httpd.csr  httpd.key  root@192.168.208.130    # 查看已经签发好的证书

httpd配置见:http://afterdawn.blog.51cto.com/7503144/1873617

https配置见:http://afterdawn.blog.51cto.com/7503144/1875173