OpenSSL

加密和解密技术



本章内容:

  • 安全机制

  • 对称加密

  • 不对称加密

  • 散列算法

  • PKI和CA



相关知识:

1)传输层协议

       TCP(面向连接),UDP(面向无连接),SCTP(流控协议)

2)port(端口):传输层协议都会提供端口,

       端口(port)是标记进程的地址,进程向内核注册才能使用某端口(独占)

       任何一个进程占领某个端口之后,其他进程进不能使用了;

3)同一主机上的进程间通信:

       IPC,message qoeue(消息队列),shm(共享内存),semerphor

4)不同主机间的进程通信

        通过套接字方式来实现(socket) 

               cip:port<– –>sip:port(客户端ip和端口到服务端ip和端口)

5)监听模式LINTEN(ip:port),

       无论有没有人访问,它都要打开自己的进程,并监听在某个ip:port上,随时等待客户端请求;

       为某些众所周知的应用,事先分配好一个固定的端口(比如http的80端口)

6)SSL :Secure Socket Layer

       http–>ssl–>https

    http协议一但调用了ssl就变成了https,从而能够完成安全通信

1.介绍

★  SSL 也就是Secure Socket Layer 叫做安全套接字协议,是一种应用层协议,主要用于数据传输的加密。OpeenSSL是SSL协议开源形式,是广泛使用的商业及SSL工具,同时OpeenSSL也是一种命令行工具;

  在计算机网络中,我们知道跨主机之间的进程通信是通过套接字方式实现的,服务器监听在某个TCP Socket之上(IP:Port),客户端在本地打开一个随机的Socket,然后通过TCP/IP协议,将请求通过交换机、路由器层层转发到目标服务器上,然后服务器可以判断出客户端请求的资源,进而转交到应用层相关服务上,服务端应用进程从磁盘上获得相应的资源信息,然后封装成相应的网络数据包格式以同样的方式层层传输给客户端对应的端口上。

  无论数据从应用层向下传输还是从下层到应用层传输,每个层次中的协议都仅仅是对数据进行封装解封装,而里面的数据本身并没有发生变化,所以,数据在发送过程当中是什么还是什么,也就是明文发送的,没有加密,任何人只要获取到了相关的数据包就能通过其他方法获知其中的铭文内容;因此就需要有一种加密机制能够保护互联网数据在传输过程中的隐秘性了;

 NIST(美国国家标准与技术研究院)定义的安全属性:

      ·保密性:数据保密性,隐私性 

      ·完整性(不可篡改):数据完整性,系统完整性

      ·可用性

 攻击类型:

      ·威胁保密性的攻击:窃听、通信量分析 ;

      ·威胁完整性攻击:篡改,伪装,重放,否认;

      ·威胁可用性的攻击:拒绝服务(Dos)

 解决方案:

      ·安全机制:

              加密解密;

              数字签名;

              访问控制;

              数据完整性;

              认证交换;

              流量填充;

              路由控制;

              公证

     ·安全服务用于抵御攻击的服务

              认证服务;

              访问控制服务;

              数据保密性服务:连接保密性、无连接保密性、选择域保密性、流量保密性

              数据完整性服务;

              不可否认性服务;

 设计原则:

       ·使用成熟的安全系统

       ·以小人之心度输入数据

       ·外部系统是不安全的

       ·最小授权

       ·减少外部接口

       ·缺省使用安全模式

       ·安全不是似是而非

       ·从STRIDE思考

       ·在入口处检查

       ·从管理上保护好你的系统

 安全算法

       ·常用安全技术

             认证

             授权

             安全通信

             审计

       ·密码算法和协议

             对称加密:数据加密(保密性)(算法:3DES,AES)

             公钥加密:身份认证,密钥交换,数据加密 (RSA,DSA)

             单向加密:数据完整性(MD5,SHA1…)

        密钥交换:RSA、DH、ECDH(椭圆曲线DH),ECDHE(临时椭圆曲线DH)

             认证协议

   Linux系统:OpenSSL, gpg(pgp协议的实现)

2.常见的加密算法和协议

1)对称加密

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

      ·DES:Data Encryption Standard,56bits

      ·3DES:

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

      ·Blowfish,Twofish

      ·IDEA,RC6,CAST5

 特性:

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

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

 缺陷:

     ·密钥过多;

      ·密钥分发;

      ·数据来源无法确认

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))

           结合签名和加密

           分离签名

    

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双方交换的是经过计算后的值,因此这种加密算法是很安全的。

5)一次加密通信过程:

发送者:

   1.使用单向加密算法提取生成数据的特征码;    (单向加密技术)

     2.使用自己的私钥加密特征码附在数据的后面; (公钥加密技术)

     3.生成用于对称加密的临时密钥; 

     4.用此临时密钥加密数据和已经使用私钥加密后的特征码;(对称加密技术)

     5.使用接收方的公钥加密此临时密钥,附在对称加密后的数据的后方;(密钥交换技术)

接收者:

     1.使用自己的私钥解密加密的临时密钥,从而获取对称密钥;

     2.使用对称密钥解密对称加密的 数据和私钥加密的特征码密文; 从而获取数据和特征码密文;

     3.使用发送方的公钥解密特征码密文,从而获取计算生成的特征码;

     4.使用与对方同样的单向加密算法计算数据的特征码,并与解密而来的特征码进行比较

6)CA和证书

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.自签名的证书;

          自已签发自己的公钥

3.SSL/TSL

1)介绍

SSL: Secure Socket Layer 

  • 安全套接层,是为网络通信提供安全及数据完整性的一种安全协议;

  • SSL为Netscape在1994年所研发,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络之上传输过程中不会被截取及窃听;

TLS(传输层安全):Transport Layer Security(SSL的继承版本)与SSL在传输层对网络连接进行加密;

  • 发展历程:

        1995:SSL 2.0 Netscape研发

        1996: SSL 3.0 

        1999: TLS 1.0 IETE研发

        2006: TLS 1.1 RFC(Request For Comments )4346

        2008:TLS 1.2 当前使用

        2015: TLS 1.3

功能:机密性,认证,完整性,重放保护;

分层设计:

  • 最底层:基础算法原语的实现;

  • 向上一层:各种算法的实现;

  • 再向上一层:组合算法实现的半成品;

  • 用各种组件拼装而成的各种成品密码及协议软件

两阶段协议,分为握手阶段和应用阶段

  • 握手阶段(协商阶段):

         客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是通过MasterSecret生成。

  • 应用阶段:

        在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安全通信。

wKioL1fpD-LS9l2AAAGeIg_qiaM287.png

2)相关协议如下:

  • Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换

  • ChangeCipherSpec 协议:一条消息表明握手协议已经完成

  • Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告

  • Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等

  • HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输

3)SSL会话主要三步

   ·客户端向服务器端索要并验证证书;

      ·双方协商生成“会话密钥”

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

 详细过程如下:

  • 第一阶段ClintHello(客户端发送加密通信请求

         支持的协议版本,比如tls1.2

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

         支持的加密算法:比如AES、RSA

         支持的压缩算法

  • 第二阶段ServerHello(服务器端回应

         确认使用的加密通信版本,比如tls1.2;

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

         确认使用的加密算法;

         发送服务器证书;

  • 第三阶段

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

         发送以下信息给服务器:

              一个随机数;

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

              客户端握手结束通知;

  • 第四阶段

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

          向客户端发送如下信息:

                     

wKiom1fpESvzshfsAAD6f1d-QMc064.png

3.Openssl

1)介绍

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

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

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

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

Openssl命令:

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

      ·opensslversion:程序版本号

     ·子命令分类:

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

             消息摘要命令(dgst命令)

             加密命令(enc子命令)

命令如下

[root@centos7 ~]# openssl version  # 获取openssl 版本号
OpenSSL 1.0.1e-fips 11 Feb 2013
[root@centos7 ~]# openssl d
openssl:Error: 'd' 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            seed              seed-cbc          seed-cfb          
seed-ecb          seed-ofb          zlib

4.Openssl命令

1)对称加密:

工具: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表示加密和解密后输出的文件名。

eopenssl enc命令演示:

[root@centos7 ~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext #对文件fstab采用des3算法,加盐进行加密后生成fstab.ciphertext文件
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
[root@centos7 ~]# ls
anaconda-ks.cfg  Desktop  Documents  Downloads  fstab  fstab.ciphertext #加密后生层的文件  Music  Pictures  Public  Templates  Videos
[root@centos7 ~]# cat fstab.ciphertext  # 查看加密后生成的文件
U2FsdGVkX1/CcyhhtaQx0TdJn9947LJAiFvCVaAHm20+RRoNlq50ogUFd3cnYTqH
n7W3TQqYVcQm0CKRpKY12FQWZRCvd6uTGYRDFnbraZcH+9gtrpE8K8YPo9bc4aXu
tjxwMufZD6YHcgFrbeN6z/R2M5ogmq0yLCveCwEq86cm02FGSX34/hudbYYF8Bml
pqzsGzjShkG3u22X5l4d7YPYB73a37UDIu/D98qSmVE3ehcITc8oI8YxZUV1/7rJ
GLJaoSmZmSqMEsVgOCarGnI47hYv6WIrf0sI6zRi0S7gwC35XtP1Alfhe1kj2a4n
nf0pkPo2wwtrt4esthEeYK5CpRo4vqVAQOwZbdnTZWHmWdzgMkR0/mtW8ZRF+jVy
d5jecgeUP8tmNSJRuliewdsAs6HyzFJeOH3NiYcEqZrraJne8P1vQ2G3zyfJyz6A
JOiJuD5CYbed2BqJSoS51Tjh9RDdA+UIwtySBipPYi3PYD26jErgbaFtN0lx5V2g
2hkEAvr3U+m88Ry4wg3qRuCam2VfKXRUOaIdraBFa76K3Ak0JPHGHUGGtL03J8Rf
cRpmfJySV/NS+cCHwbcb2GSDpophxAryBYHO555uo8Z0e1q1wJ6+p9G13TNp7lII
5A2HNlQplAVqMutR7RuFZJRnEHYV2+oPL0WEIZFPD8bJ+DDgVbEnkp/6RijePekV
gcROXMHKCy6pHul6cyfMKdTLXDezqjfSyr7Eshbyw7NOLme+/wotMKPKbCcz13aU
nuxbM4QaaiVq3zQQ8SYXvNBddqq10OuJkM9Fqb7m/E1yOE1d2S9A8g==

[root@centos7 ~]# openssl enc -d -des3 -a -salt -out fstab.plaintext -in fstab.ciphertext #对生成的加密文件进行解密后生成fstab.plaintext文件
enter des-ede3-cbc decryption password:
[root@centos7 ~]# ls
anaconda-ks.cfg  Desktop  Documents  Downloads  fstab  fstab.ciphertext  fstab.plaintext  Music  Pictures  Public  Templates  Videos
[root@centos7 ~]# cat fstab.plaintext 

#
# /etc/fstab
# Created by anaconda on Tue Aug 30 09:45:37 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
#
UUID=90880561-dca2-447b-a935-4c47e1bd03d8 /                       xfs     defaults        0 0
UUID=219cc6c3-bd54-4bac-a47f-b498c491107f /boot                   xfs     defaults        0 0
UUID=409f2fa0-f642-4cc2-9ed7-b20bda111d8d /usr                    xfs     defaults        0 0
UUID=af279379-acbd-47f5-a814-870666bdd6d1 swap                    swap    defaults        0 0


2)单向加密:

工具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@centos7 ~]# md5sum fstab  # 用md5sum工具单向加密
a6f9b86b73d17ac4a69d33583c0c5e96  fstab
[root@centos7 ~]# openssl dgst -md5 fstab  # 用openssl dgst工具加密,指明算法
MD5(fstab)= a6f9b86b73d17ac4a69d33583c0c5e96
# 可以看到虽然两种加密的工具不一样,但算法相同,所以生成的特征码也相同

生成用户密码命令:

[root@centos7 ~]# openssl passwd -1 -salt 12345678  # 生成用户密码,salt最好用随机数
Password: 
$1$12345678$TanElnkSiEcxWGxCzRxlf.
[root@centos7 ~]# openssl passwd -1 -salt 12345679
Password: 
$1$12345679$BSsViINNl3LW6h3yHWRs2/

生成随机数命令演示:

[root@centos7 ~]# openssl rand -base64 10
RrycEFwYSRKuUg==
[root@centos7 ~]# openssl rand -base64 10
QITPCPNvb6jsBQ==
[root@centos7 ~]# openssl rand -hex 10
97150eca6a7b1a3ef88f
[root@centos7 ~]# openssl rand -hex 10
3a5a7f7d7081ae310f49

[root@centos7 ~]# openssl passwd -1 -salt `openssl rand -hex 4` # 命令替换生成随机数
Password: 
$1$77309f38$BguLqZnBl/MCtf.C7YwK7/
[root@centos7 ~]# openssl passwd -1 -salt $(openssl rand -hex 4) 
Password: 
$1$d66fe996$DmTPN4hBOhj9xNDoP9clw/
[root@centos7 ~]# openssl passwd -1 -salt b3d36557 # 只要随机数不变,则生成的密码就不变
Password: 
$1$b3d36557$9nBLUPbdx6p2l3.lnX1vg.


2)公钥加密:

加密解密

  • 算法:RSA, ELGamal

  • 工具:gpg, openssl rsautl(man rsautl)

数字签名

  • 算法:RSA, DSA, ELGamal

  • 工具同上

密钥交换

  • 算法:DH

  • DSA: Digital Signature Algorithm

  • DSS:Digital Signature Standard

  • RSA

=======================================================================================

生成密钥对(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@centos7 ~]# openssl genrsa 1024
Generating RSA private key, 1024 bit long modulus
............++++++
.++++++
e is 65537 (0x10001)
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCb+FjWoo6+ajJVMBoroIMV0MufsQnjRQ5eTAFXjoDRTNsVjJ2h
aDVkhEQFFVJgOEx7xuZhvBeaB0dcFeDLm/bTTfGWHSg/i+oF+vJy9WKFt529pwrU
nMXgHJDzmgWD/rHlznfZEFSo2l3T7dnn3Mc++QMnVPFaK5To30O6x2JV6wIDAQAB
AoGAfW+u6veTe3pm/nIQKhQOOKZSjRzRyfEIzDeuQJ9/5FQ+QkdzopLvleZ12ey6
8l10zXs6X1HpXVwLPPjvcHD/gNGo4mDI4x1pqfvAXzmQYCdjmlBggT71JHrUE/QE
MMxYW099IPeDtNZBMqgXvKqF7l0/G7ZD5/3u/tq2ovJPtzkCQQDPMN0EF4hRAwZ3
pNZdGzyT8pokys3Q1wqR1N1++dM6kryGWjp8vFJWZdBzYQAtsvkIxsjnKOVtBXTH
WaYwA+69AkEAwLZ+cibegyqcbCNifEtMile4cfXhfMkcvI90wRtu3Pl1LbXwWLb6
s/w+l48mxBBFg9bGPI3OV8zPA4Wq6rtVxwJBAKcqyJg9mGmspDIyWBalHBpOmlnn
G2pNpqSE9/U0Al52+A76i8gKdfBpk2cUM32rskyHfp8rmvh8d31Ecta4xY0CQHbh
3Z0z5z6JUdfP+Fhu5zfMp4b9xO2C70xPPxpFfx2ociYRv8QqlPvlVwOOFr8Kvqd3
HfGLFUjKmsY0dly51k8CQFSjxS4jneZpEyHfRNKkz0IIQ6Hh5ulPtvv2QXNz/Cp7
eieQtiC17qSHLuiMMjtR0vK105L7MoaFo3iuVOn9jQ4=
-----END RSA PRIVATE KEY-----

[root@centos7 ~]# openssl genrsa 1024 > /tmp/mykey.private # 可以使用重定向到指定文件当中
Generating RSA private key, 1024 bit long modulus
........................++++++
..........................++++++
e is 65537 (0x10001)
[root@centos7 ~]# openssl genrsa -out /tmp/mykey1.private 1024 # -out指定输出的文件,和重定向作用相同
Generating RSA private key, 1024 bit long modulus
...........................++++++
..........++++++
e is 65537 (0x10001)

# 但是生成的私钥放在文件当中是不安全的,因此要设置权限尽自己可以看
[root@centos7 ~]# (umask 077;openssl genrsa -out /tmp/mykey2.private 2048) # 设置文件权限
Generating RSA private key, 2048 bit long modulus
...........................................................+++
.....................................................................................................................................................+++
e is 65537 (0x10001)
[root@centos7 ~]# ls -l /tmp
total 12
-rw-r--r-- 1 root root  887 Sep 28 17:12 mykey1.private # 属组和其他用户也有读权限,不安全
-rw------- 1 root root 1675 Sep 28 17:14 mykey2.private # 属主有读写权限
-rw-r--r-- 1 root root  887 Sep 28 17:11 mykey.private  # 属组和其他用户也有读权限,不安全
drwx------ 3 root root   16 Sep 28 08:41 systemd-private-c7c1f3e358e34fc2add5b3729e413ed8-cups.service-KSESlC
drwx------ 3 root root   16 Sep 22 15:12 systemd-private-d276c273baee4a299b8d240ba604a5f2-cups.service-etgI6i

从私钥中提取公钥命令:

[root@centos7 ~]# openssl rsa -in /tmp/mykey2.private -pubout # 从私钥中提取公钥
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwh/Zuj32Ibnc8X9wd4bU
FgtMiIjPDu/STqlo311vspPHQ830Yytm5PjzVqAD4mUJ3/pHPGKHPWyP2KP1cZ4B
ZVLW4nsV37GUsD4X6d19AQ/cg94CP0HZgW26iFY1jjZy59/R/MyH23Bw9dK1TDkK
9pQrVqK+KSTE04MikGtTL0GaqPklMm0PgJ9ULnQWxpuYrlWR9jasfmQVEgUkKXr/
dMqb+lSDYjWNPeRc274KHVMbrafmqc24rPCLU/QSZ3qloTY9fI3MeSO2Lh2dhOel
q/dsVO27xkUnLTN+eC/BhjMrDwAw5Sj/xq0sb7+LVDKFpgyrZkltOTpZWbqNz7wx
2QIDAQAB
-----END PUBLIC KEY-----

4.创建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

1.创建私有CA步骤演示:

  1)生成私钥文件/etc/pki/CA/private/cakey.pem

[root@centos7 ~]# ls /etc/pki/CA/private/  # 查看私钥文件为空
[root@centos7 ~]# (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@centos7 ~]# ls /etc/pki/CA/private/
cakey.pem
[root@centos7 ~]# ll /etc/pki/CA/private/  # 查看文件,并确定其权限仅为属主自己
total 4
-rw------- 1 root root 3247 Sep 28 19:03 cakey.pem

   2)生成自签证书

# 生成自签证书指明私钥文件,证书保存路径,有效期限等
[root@centos7 ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650 
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]:Magedu # 组织(公司)名称
Organizational Unit Name (eg, section) []:Ops # 所在岗位
Common Name (eg, your name or your server's hostname) []:ca.magedu.com # 证书持有者姓名或请求证书服务器的主机名
Email Address []:caadmin@magdeu.com # 邮件地址
[root@centos7 ~]# ls /etc/pki/CA
cacert.pem # 生成的自签证书  certs  crl  newcerts  private

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

[root@centos7 ~]# touch /etc/pki/CA/index.txt  # 创建数据库文件
[root@centos7 ~]# echo 01 > /etc/pki/CA/serial # 创建序列号文件并给明第一个证书的序列号码
[root@centos7 ~]# ls /etc/pki/CA/
cacert.pem  certs  crl  index.txt  newcerts  private  serial


2.给节点颁发证书步骤演示

(假设CentOS 6为一个web服务器,要向客户端提供http服务就需要证书文件,并把请求发送给CA进行签署)

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

[root@CentOS6 ~]# rpm -q httpd  # 这里以http服务为例
httpd-2.2.15-53.el6.centos.x86_64
[root@CentOS6 ~]# cd /etc/httpd/
[root@CentOS6 httpd]# ls
conf  conf.d  logs  modules  run
[root@CentOS6 httpd]# mkdir ssl  # 在文件中创建ssl目录
[root@CentOS6 httpd]# cd ssl   # 在此目录中生成私钥
[root@CentOS6 ssl]# (umask 077;openssl genrsa -out httpd.key 2048) # 注意这里不是在 /etc/pki/CA下创建,只有作为CA时才在其下进行创建
Generating RSA private key, 2048 bit long modulus
.............+++
.........................................................................................+++
e is 65537 (0x10001)
[root@CentOS6 ssl]# ll
total 4
-rw------- 1 root root 1675 Sep 28 16:55 httpd.key # 生成的私钥文件

 2)生成证书签署请求:

[root@CentOS6 ssl]# openssl req -new -key httpd.key -out 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]:Magedu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:CentOS.magedu.com
Email Address []:webmaster@magedu.com

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

   3)把请求发送给CA

[root@CentOS6 ssl]# scp httpd.csr root@10.1.249.203:/tmp/  # 这里使用scp命令
The authenticity of host '10.1.249.203 (10.1.249.203)' can't be established.
RSA key fingerprint is cf:7d:49:75:55:54:45:88:a3:dd:ff:f3:87:be:3f:06.
Are you sure you want to continue connecting (yes/no)? y
Please type 'yes' or 'no': yes
Warning: Permanently added '10.1.249.203' (RSA) to the list of known hosts.
root@10.1.249.203's password: 
httpd.csr                                100% 1062     1.0KB/s   00:00   

[root@centos7 ~]# ls /tmp/ # 查看文件
httpd.csr # 申请主机发送过来的文件
systemd-private-c7c1f3e358e34fc2add5b3729e413ed8-cups.service-KSESlC
systemd-private-d276c273baee4a299b8d240ba604a5f2-cups.service-etgI6i

 4)CA签发证书

[root@centos7 ~]# openssl ca -in /tmp/httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 365  
# 签发证书,-in指明要签的证书文件位置,-out指明签好后输出的文件位置,必须放在certs下,指明期限
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: Sep 28 13:21:38 2016 GMT
            Not After : Sep 28 13:21:38 2017 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Beijing
            organizationName          = Magedu
            organizationalUnitName    = Ops
            commonName                = CentOS.magedu.com
            emailAddress              = webmaster@magedu.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                04:FD:4F:25:36:40:D1:CA:9A:2B:4C:AD:7D:C9:CD:18:34:E7:D0:33
            X509v3 Authority Key Identifier: 
                keyid:44:82:7B:4C:D4:19:C4:28:F9:72:41:1D:01:5D:B9:CB:84:9E:43:61

Certificate is to be certified until Sep 28 13:21:38 2017 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

[root@centos7 ~]# cd /etc/pki/CA
[root@centos7 CA]# ls
cacert.pem  crl        index.txt.attr  newcerts  serial
certs       index.txt  index.txt.old   private   serial.old
[root@centos7 CA]# cat index.txt  # 可以看到第一个签署的证书编号为01
V	170928132138Z		01	unknown	/C=CN/ST=Beijing/O=Magedu/OU=Ops/CN=CentOS.magedu.com/emailAddress=webmaster@magedu.com

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

[root@centos7 CA]# scp certs/httpd.crt root@10.1.252.153:/etc/httpd/ssl
The authenticity of host '10.1.252.153 (10.1.252.153)' can't be established.
RSA key fingerprint is f7:91:35:d1:33:ab:e8:af:4c:cc:39:45:e7:12:2f:b3.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.1.252.153' (RSA) to the list of known hosts.
root@10.1.252.153's password: 
httpd.crt                                                                                                                            100% 5886     5.8KB/s   00:00

 请求者查看证书

# 请求者收到后查看
[root@CentOS6 ssl]# ls
httpd.crt(# 签署的证书)  httpd.csr  httpd.key
[root@CentOS6 ssl]# rm -f httpd.csr # 没用的文件就可以删除了

[root@CentOS6 ssl]# openssl x509 -in httpd.crt -noout -serial -subject # 查看序列号和主题
serial=01
subject= /C=CN/ST=Beijing/O=Magedu/OU=Ops/CN=CentOS.magedu.com/emailAddress=webmaster@magedu.com

原创文章,作者:zhumengxiaotao,如若转载,请注明出处:http://www.178linux.com/49655

评论列表(1条)

  • stanley
    stanley 2016-11-11 15:45

    不是一般般厉害哟