一、加密方式

1、对称加密

  使用“加密算法 + 口令”将明文转化为密文,算法可能是公开的,加密不依赖于算法,依赖于口令

  加密、解密使用同一个口令(密钥),效率高

  将原文分割成固定大小的数据块,对这些块进行加密


常用加密算法:

   DES:Data Encryption Standard (56bits) 数据加密标准

   3DES

   AES:Advanced Encryption Standard (128bits,192bits,256bits,384bits)  高级加密标准

   Blowfish,IDEA,RC6


密钥交换(IKE):

  常用算法:

      DH算法:密钥交换时,没有发送任何密钥,这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥。然后可以用这个密钥进行加密和解密

私密性:保证

用户(身份)认证:无法验证   #数据来源  

数据完整性:无法验证


缺点:

  密钥过多

  密钥分发困难

  数据来源和完整性无法确认

     

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

   使用密钥对儿,公钥产生于私钥之中,用对方的公钥加密,私钥解密,反之亦然,公钥是公开的,私钥(secret key),通过工具创建,使用者自己留存必须保证其私密性;

常用加密算法:

   RSA(加密,数字签名),EIGamal,DSA(DSA 只用于数字签名和认证)

  

密钥交换:

   与被通信方之前,首先获取到对方的公钥,用对方的公钥加密自己的私钥,并发送给对方,完成密钥交换(安全性不高);

私密性:保证

用户(身份)认证:

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

   但是用私钥加密,只要有公钥就可以解密,私密性就无法保证

完整性:无法验证


缺点:

   密钥长,加密解密效率低下比对称加密要慢3个数量级),适合加密较小数据


实现加密过程:

   发送者使用接收者的公钥加密,接受者使用私钥解密


实现数字签名:

   发送者使用自己的私钥加密,接受者使用发送者的公钥解密

 

3、单向加密

    单项加密也称哈希(Hash)是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的、可逆的密文。

   只能从明文产生密文,反之不成,严格意义上来讲,它实现的是提取数据特征码

    同一个数据,使用同一个算法,多次计算得到的结果一定相同,所以常用于验证数据完整性

   定长输出,无论原数据大小是什么,加密后结果输入长度相同

输出格式:$加密算法$8位随机字符$加密后的密码

算法:

   MD5:(centos5),SHA1 ,SHA512:(centos6,7采用)


4、如何实现加密通信?   

  了解了常用的三种加密方式后,我们到底使用哪种方式才可以安全地通信呢?

安全地通信需要保证私密性,完整性,身份认证,可用性

一次加密通信过程:

发送者:

 1)使用单向加密算法提取生成数据的特征码;    #保证完整性

 2)使用自己的私钥加密特征码附加在数据后面;   #身份验证,保证来源合法性

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

 4)用此临时密钥加密数据和已经使用私钥加密后的特征码

                                 #保证私密性,同时保证了可用性(效率)

 5)使用接收方的公钥加密此临时密钥,附加在对称加密后的数据后方; #保证私密性

接收方:

 1)使用自己的私钥解密加密的临时密钥;从而获得对称密钥;

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

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

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

wKiom1huUtuQlALoAAAZ2yTX4-c080.png

上面的方法看似能完美解决问题,但有没有漏洞呢?

  漏洞在发送者和接受者需要获取彼此的公钥,如果有人在中间用自己的公钥冒充,我们怎样认证?从第三方机构获取对方的证书(公钥+)


二、加密解密技术常用的算法及工具

1、对称加密

算法:

   DES,3DES,AES,Blowfish,Twofish,RC6,CAST5

工具:

   gpg,opensll enc

[root@Note3 ~]# 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            seed              seed-cbc          seed-cfb          
seed-ecb          seed-ofb          zlib

openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e]

       [-d] [-a/-base64] [-A] [-k password] [-kfile filename] [-K key] [-iv IV]

       [-S salt] [-salt] [-nosalt] [-z] [-md] [-p] [-P] [-bufsize number]

       [-nopad] [-debug] [-none] [-engine id]


-K key:指定使用的口令,不指定的话,命令执行后会询问  #(使用对称加密时)

-e:加密,默认

-d:解密


加密:

 openssl enc -ciphername -e -a -salt -in /path/to/input_file -out /path/to/cipher_file

-des3     指定加密算法

-a       指定使用base64编码,默认输出是二进制的编码成文本格式

-in /path/to/input_file    指定加密哪个文件

-out /path/to/cipher_file   指定加密后保存在哪个文件

-salt     加盐


解密:

  openssl enc -d -des3 -a salt -in /path/to/cipher_file -ouut /path/to/clear_file

[root@Node4 ~]# openssl enc -des3 -a -salt -in /etc/fstab -out /tmp/fstab.cipher -k 123456
[root@Node4 ~]# cat  /tmp/fstab.cipher 
U2FsdGVkX1+MXasD/pdUrxnuhwGfQhLJdDXYejkVp6fZn8KiT9Q/lhWJiAr+Pc2O
MDbIhJshEoTfTvhvB1J0dHTyO1C4C9RleZX0EQoxggRb1tqh2Y37dYwIOGXf/WWe
itNRsa54ay0SRoBnNsM/wyYopbKYYdEJTj8LEXBmAnsA6CVRh2LRFB9WsRFTcDc/
N8qVJGR2Ov/ioyS1PV/ZiHNjkPR4wyGyz8Mu+RZB1/i4hdyWtVQf4BhcglCNNkh6
8AyU0CGMqk7t1ZPFY1Q3J0jE3JJ1uSI4f+Tkgzuq24VOwPUOvwlwP4MVTInElLjO
CrL39CZVoTvU47bzVbQ70HXQb3yLzujBD+Kzz74W7AKY4Mn/V7uUroIT/aosUNhs
vQtKkLAJyTbzMlwfkpQ6Xs4xbuK4ZPQ5hg8Edtpo3vZ84G04fe6BS4D9ATAvhiuu
9DbLrEiB6rlfZA6noaafWNG+7JtO9LicoNeC8y74kb1Gzxh4ff3RV16sskosm6IW
hj8cEb7fruzuwKO8azGUeKjZMhRSpng/O+hBXSUGpNWruylW7SSI81VOWmCm8/ns
V5uFDWa+WmMNIEhXLmp5Y4+bZILEgl7MvSwMyfvfjBBusGfwHDPJXuZUUb9WBTn2
xi4vA4shNdxrr44YPoWiSZ0eOe8U/6UwFuIQwIH39/LbZ3e75idYgGDuVnlEhbXz
b1M0/W8DkyDQ4ybBOAm5J18KkrCgaA3xlbygRsIM7DqpnH1HIYHHs5+jKvmhItQ8
RoB9wsbeVX9zrvCWvzJ9J+ga9s1z2jA7mn6yZJVdLs77UknFunw8r1i3qtQJvs5M
G7A+tvlYnxjjI6FpJEvPx0mK62ymW4x6NctOFdW7kvlzMnbI2qkxUT04jTCj9h4q
O3++H8hgyCojWftVNTz77VFNLhpgacQ3GVzGBAO47XT5fxiqFWinOfj8zhqrI4pE
UBSKPq8HsFnjuX5W1xoJ1M8FiRcdLmTQCWHttxnXSgSCqQhsaw11bH8L8NO34WS9
9PHKxS+yWl2sBagmH/ajDKIcInritY4CTPNRLFPZp5frVYafTV0De3sdiMs4zSzB
ABM5cNNO69c=
[root@Node4 ~]# openssl enc -d -des3 -a -salt -in /tmp/fstab.cipher -out /tmp/fstab.cleart -k 123456
[root@Node4 ~]# cat /tmp/fstab.cleart 

#
# /etc/fstab
# Created by anaconda on Fri Aug  5 17:32:21 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=e0c0bc25-62e5-4896-8749-fce761bc3af7 /                       ext4    defaults        1 1
UUID=970e070d-b49f-439b-8bbb-11ef49ee95ce /boot                   ext4    defaults        1 2
UUID=7e6bc97d-be6d-4ac9-bc26-8be3d80e715d swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0

2、单向加密 One-Way

算法:

  md5:定长输出,128bits

  sha1:160bits

 sha512:512bits

工具:sha1summd5sum,cksum,openssl dgst

  openssl dgst [-md5|-md4|-md2|-sha1|-sha|-mdc2|-ripemd160|-dss1] [-out filename] /path/to/filename

[root@BAIYU_110 ~]# sha1sum /etc/fstab
4c0f1460d21e1141fcd3f93182cb87128702091f  /etc/fstab
[root@BAIYU_110 ~]# openssl dgst -sha1 /etc/fstab 
SHA1(/etc/fstab)= 4c0f1460d21e1141fcd3f93182cb87128702091f

单项加密的延伸应用:

MAC:消息摘要码

   用于实现在网络通信中保证所传输的数据完整性

机制:

  CBC-MAC:

    HMAC:使用MD5和SHA1算法实现

用户认证:

      工具:passwd,openssl passwd

  openssl passwd [-crypt] [-1] [-apr1] [-salt string] [-in file] [-stdin] [-noverify] [-quiet] [-table] {password}

[root@BAIYU_110 ~]# openssl passwd -1   # -1(数字1)表示使用MD5加密(提前特征码)
Password: 
Verifying - Password: 
$1$xOAnQ50H$Fzkdh.P7I20vOD94LJl6B/
[root@BAIYU_110 ~]# openssl passwd -1  #会自动随机加盐,相同的密码2次的结果不同
Password: 
Verifying - Password: 
$1$DbZWmzRR$RBP9WNYeTya9Zc9IcShvg/
[root@BAIYU_110 ~]# openssl passwd -1 -salt 123abc      
Password: 
$1$123abc$rlOkS30UBZu06DOR0wEQd/
[root@BAIYU_110 ~]# openssl passwd -1 -salt 123abc  "123456"      
$1$123abc$rlOkS30UBZu06DOR0wEQd/


3、公钥加密

   加密速度慢,主要用于:身份认证,秘钥交换

   公钥:pkey

   私钥:skey

算法:

   RSA,EIGmal

工具:

   gpg,openssl rsautl    #用的很少,速度太慢


数字签名:私钥加密,公钥解密

算法:

   RSA,EIGmal

   DSA:Digital Signature Algorthm  只能用于签名

   DSS:Digital Signature Standard


三、PKI

1、PKI简介

PKI:Public Key Infrastucture 公钥基础设施(架构)

PKI包括:

   端实体(申请者)

   注册机构:RC

   签证机构:CA(Certificate Authority)  

   证书吊销列表(CRL)发布机构

   证书存取库:

PKI的开源实现:opensslgpg


2、openssl

   openssl是一个套件,开源程序

   上面我们说到了很多的算法,那真正将这些算法予以实现那就需要一些软件来负责这些相关操作,而真正能够完成这些操作的常用软件分别是gpg,openssl;

什么是OpenSSL呢?

   OpenSSL是一个强大的安全套接字层密码库,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不应该只将其作为一个库来使用,它还是一个多用途的、跨平台的密码工具。作为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。


openSSL整个软件包由三个部分组成:

  libcrypto:通用功能的加密库

  libssl:用于实现TLS/SSL功能的库

  openssl:多功能命令行工具

         能生成密钥,创建数字证书,手动加密解密数据

常用的openssl标准命令:

openssl speed:加密解密速度测试

openssl version:openssl版本查看

openssl rand:生成伪随机数

[root@Node4 ~]# openssl rand 
Usage: rand [options] num
where options are
-out file             - write to file
-engine e             - use engine e, possibly a hardware device.
-rand file:file:... - seed PRNG from files
-base64               - base64 encode output
-hex                  - hex encode output
[root@Node4 ~]# openssl rand -hex 6
83ab37421d51
[root@Node4 ~]# openssl rand -hex 128
f4f604e8378a67e692dec25abcf279641734a522cba234ddcafe467d3f8bf4d3bf8e867bc57e1cd2b81f5097b6f2dc180433afa62fc4358dbe651537b3487542b1ce1e395935b33e8388dfb496528f53fc60c645dbfcf5b780ad9887cf3c1b9e9e9e38edf569f0588653f9ddba74f545ec321d3661aaefe226193b05a26f9f9b
[root@Node4 ~]# openssl rand -base64 32
HQ3If85wa4fNV5am7j5PZNKu6X4gjaGCJOYbl4nLeAQ=
[root@Node4 ~]# openssl rand -base64 8
jCP005GFg7w=

openssl s_client:SSL_TSL客户端测试工具

   基于文本的协议(如http),可以使用telnet作访问测试,openssl s_client(https)


3、数字证书

  让第三方机构,能够使用一种可靠的手段,将申请者的公钥安全的分发出去

证书格式:x509标准,pkcs标准

x509.3证书格式:

  证书格式的版本号

  证书序列号

  证书签名算法

  证书颁发者

  有效期

  持有者的名称

  持有者的公钥

  CA的ID(可选的)

  持有者的ID(可选的)

  其它扩展信息

    基本约束

    证书策略

    密钥的使用限制

  CA签名         

公钥和有效期限

      持有者的个人合法身份信息:主机名

      证书的使用方式

      CA的信息: 

      CA的数字签名:(CA使用自己的私钥加密前面4项信息的特征码)

谁给CA发证:自签署证书


4、申请数字证书的步骤

申请者:

 1)生成一对儿密钥

 2)把所需信息和公钥按固定格式制作成证书申请(签署请求)

CA:

 1)生成一对儿密钥

 2)自签证书

 3)收到签署请求后,签署申请者的证书


四、用openssl实现私有PKI

1、环境

OS:CentOS 6.5 x86_64

CA:192.168.10.3/24

申请者:192.168.10.4/24


2、使用openssl实现私有CA

CA的配置文件:/etc/pki/tls/openssl.conf   

   默认配置即可,定义了CA工作目录和相关文件名

[ 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.         #索引文件数据库
#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

# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt        = ca_default            # Subject Name options
cert_opt        = ca_default            # Certificate field options

查看CA工作目录:

[root@Note3 CA]# cd /etc/pki
[root@Note3 pki]# ls
CA  ca-trust  java  nssdb  rpm-gpg  rsyslog  tls
[root@Note3 pki]# cd CA
[root@Note3 CA]# ls
certs  crl  newcerts  private
[root@Note3 CA]# ls private/
[root@Note3 CA]# ls newcerts/
[root@Note3 CA]# ls crl
[root@Note3 CA]# ls certs/

生成私钥:

   openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [-engine id] [numbits]

 (umask 077; openssl genrsa -out private/cakey.pem 2048)  #()表示在子shell中运行


numbits:表示使用多长的密钥,默认1024

[root@Note3 CA]# openssl genrsa -out private/cacert.pem 2048
Generating RSA private key, 2048 bit long modulus
..+++
................................................+++
e is 65537 (0x10001)
[root@Note3 CA]# ls
certs  crl  newcerts  private
[root@Note3 CA]# ls private/
cacert.pem
[root@Note3 CA]# cat private/cacert.pem 
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAwEUo8Sm7VlDhE4CDGclh7Brozz4QlNKAuLBkydurA+fsyNOv
l6iznDKkGqnimX/FRK851N5jCIwe1ON7IPYNyy+IiejOUBxPYfeaUadEMXB2CdLT
X1EpgEbGsW7WzxFdvVNEGvuC1A/wG2O8SZDA4x3Ymuubr18MuCksPY03WgRNXPNm
QiCNA/tq5Qna0eNCOIGttHrYbJqRzLyBOWBEiCz1edVeG/7PrpfDz6MWswYijbK1
ONhqh17YiCPsPcXdD30Wey4D90qqjebiKO9EyHvtar45mMaxeE5snLWBvbnZH2Af
Eb10VdSnVkexsHmt23nwemiSmFhu/I+dUSGYBQIDAQABAoIBAF7+zKe6srCG7W2x
RRTshtEcyoH6bD7bcnXN0T5apjgb0sW2sT8BPxyheKsj3K1yj4jL+orOBagncuRE
MIWsjEwjhBZ/S9AQ7Le+miRVvD+hDPD1lTG27AZQ8cKgvMk6D1KHXVLniVA1P7CI
qnK+bk7IZEjGt/kBwUsMLKuMphh2xCHeNyafko5srFgZt0HYI5PZsWhBFuRxmmA9
7dbuFI18TSJpU14vGoKQk6fOFfQGGyyy6amThx6Nz2KXFlQBrDdCii3E2QqDWkc/
T8T6KbNkRcTzMFYexLAanmTSad16Z9pW/naDQkLrzfaoYKS1jC4V8eEZCFf9X5RU
SfI7EoECgYEA6m9oKCDDmIwxhiS7srJl8OSgNuAVj1Ztm/YKd3NaReHsCQvEkWMP
Zb9tBXmXDIatwzK0rBlMvcZZUV2y+J4xxKc+uJtNv98PcoCcSyUdZ2OICgiwr3aN
d2WbR4PesYITzGYTnZiJlyp2ezllVuSc/Q+kY/PH7r90m7ROdliJpSkCgYEA0fTU
opAfPw3iaYlDMCi6iAm+MWYJxWPnleg2hziRXiiibsO3goDwvI5G3yjHVmcypp1j
HtBRIef5v5Sl8m3FHIrp8xufUZp1LioezDySBoaFsw0aHa7dVelXKUaf/KqNsDdl
CjzBMAIc/MBlUSyFTiF87/4M0N9T5+NPbbHvu30CgYAxMkngSefiBmGKLgE5odhk
sgWxHltH5jJATWSq5okmKx/2UgLhI7Gif4ZoZLi/BzBFy0lA6FpDZPFvcsNRCxmU
lChEY0rwneXG+JhT6Kj//lIZEPPLDoznZmosms7L32k6Np2dL9qH34BXoZbTokwT
iwnLc+gcAQ9+cVsZ2MCh6QKBgQDLz9J2eFeMuyq17kRlxLPGiUay523GywOttvzv
6Q7ci6+avK0wp4CKWcccrJZNHuLBcPkemXSY6Hq96kvpeXumCIewsnjHG5xzEvpQ
ot/SK9YwCSD3/Z7o3hn5fJCkEuB2Vl/kPzP+KZ8AELiJwyEoxkNlKYZBYPovma6q
OtgQdQKBgBr3RauBRhUjIms1vMgTnKh9TPboVAPyAhXN4d2DJf9rgB3wPggn2BP7
MFgr48+8Cs1/xUxB1FFYVy2uY6shYT03P2z0ggR5n7e3j0nlMJIb4NUDxWWNoEfx
b9H6pRpd7mOb3sfgZr6VscE4Svi5OS9zL8Eyo6lAkHYA5M+ks4IN
-----END RSA PRIVATE KEY-----
[root@Note3 CA]#

从私钥中提取公钥:非必要步骤,openssl会自动从私钥中提前公钥来签署证书

    openssl rsa -in private/cakey.pem -pubout [-text] 

[-out /pathto /filename]  #不用text,text会显示提前信息

[root@Note3 CA]# openssl rsa -in private/cacert.pem -pubout
writing RSA key
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwEUo8Sm7VlDhE4CDGclh
7Brozz4QlNKAuLBkydurA+fsyNOvl6iznDKkGqnimX/FRK851N5jCIwe1ON7IPYN
yy+IiejOUBxPYfeaUadEMXB2CdLTX1EpgEbGsW7WzxFdvVNEGvuC1A/wG2O8SZDA
4x3Ymuubr18MuCksPY03WgRNXPNmQiCNA/tq5Qna0eNCOIGttHrYbJqRzLyBOWBE
iCz1edVeG/7PrpfDz6MWswYijbK1ONhqh17YiCPsPcXdD30Wey4D90qqjebiKO9E
yHvtar45mMaxeE5snLWBvbnZH2AfEb10VdSnVkexsHmt23nwemiSmFhu/I+dUSGY
BQIDAQAB
-----END PUBLIC KEY-----

生成自签证书:

  openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650


-key:指定私钥文件,会自动抽取公钥来自签

-x509:表示是自签证书,默认365天,可以在配置文件中修改默认设置

-days:表示有效期限

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

[root@Note3 CA]# openssl req -new -x509 -key private/cakey.pem -out 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            #国家的2位代码
State or Province Name (full name) []:fujian    #省份或州
Locality Name (eg, city) [Default City]:xiamen  #城市
Organization Name (eg, company) [Default Company Ltd]:Anyfish    #公司名        
Organizational Unit Name (eg, section) []:Linux Operation        #部门
Common Name (eg, your name or your server's hostname) []:Node3  #CA的主机名
Email Address []:anyfish@anyfish.com
[root@Note3 CA]# ls
cacert.pem  certs  crl  newcerts  private

创建签署证书时所需的文件:否则签署时会报错

[root@Note3 CA]#touch index.txt serial crlnumber
[root@Note3 CA]# echo 01 > serial    #签署证书序号从01开始计数

CA已经创建完毕,就等客户上门了。


3、使用openssl实现证书申请

   私有CA默认要求国家,省份,城市,公司名,域名相同才能签署成功,不同时要签署成功需要修改CA的配置文件

在主机上生成密钥,保存至应用此证书的服务的配置文件目录下:

[root@Node4 tmp]# (umask 077;openssl genrsa -out httpd.key 1024)
Generating RSA private key, 1024 bit long modulus
.....................................++++++
....................++++++
e is 65537 (0x10001)
[root@Node4 tmp]#

生成证书签署请求:

  openssl req -new -key httpd.key -out httpd.csr

[root@Node4 tmp]# openssl req -new -key httpd.key -out httpd.csr
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]:xiamen
Organization Name (eg, company) [Default Company Ltd]:Anyfish
Organizational Unit Name (eg, section) []:linux Operation
Common Name (eg, your name or your server's hostname) []:Node4    #主机名,这里一定要是使用的主机名
Email Address []:xie_xie@anyfish.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:                     #申请签署证书加密存放,默认为空,不加密
An optional company name []:

将证书签署请求发给CA:


4、CA签署证书

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

[root@Note3 CA]# openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 365
               # -out 指定输出一份,在CA的工作目录下也会生成一份,使用序号.pem为文件名
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: Jan  6 09:12:59 2017 GMT
            Not After : Jan  6 09:12:59 2018 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = fujian
            organizationName          = Anyfish
            organizationalUnitName    = linux Operation
            commonName                = Node4
            emailAddress              = xie_xie@anyfish.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                22:13:8A:B6:0D:FD:B9:D9:89:60:3F:E1:D8:1D:F4:90:0D:AD:37:2D
            X509v3 Authority Key Identifier: 
                keyid:66:80:23:FE:07:5C:62:DA:C6:A3:F5:48:6A:B7:B0:3F:5F:D7:6A:B2

Certificate is to be certified until Jan  6 09:12:59 2018 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@Note3 CA]# ls
cacert.pem  crl        index.txt       index.txt.attr.old  newcerts  serial
certs       crlnumber  index.txt.attr  index.txt.old       private   serial.old
[root@Note3 CA]# cat serial
03
[root@Note3 CA]# ls certs/
[root@Note3 CA]# ls newcerts/
01.pem  02.pem
[root@Note3 CA]# ls crl
[root@Note3 CA]# ls
cacert.pem  crl        index.txt       index.txt.attr.old  newcerts  serial
certs       crlnumber  index.txt.attr  index.txt.old       private   serial.old
[root@Note3 CA]# cat crlnumber

将证书传回请求者:

[root@Note3 CA]# scp /tmp/httpd.crt 192.168.10.4:/tmp
The authenticity of host '192.168.10.4 (192.168.10.4)' can't be established.
RSA key fingerprint is c2:00:8e:68:4c:f1:65:a6:00:14:c0:7a:49:1b:fc:2b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.4' (RSA) to the list of known hosts.
root@192.168.10.4's password: 
httpd.crt                                             100% 3880     3.8KB/s   00:00


5、吊销证书

     openssl ca -revoke /path/to/somefile.crt

[root@Note3 CA]# openssl ca -revoke /tmp/httpd3.crt
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 04.
Data Base Updated
[root@Note3 CA]# cat index.txt
R	180106091259Z	170106094907Z	01	unknown	/C=CN/ST=fujian/O=Anyfish/OU=linux Operation/CN=Node4/emailAddress=xie_xie@anyfish.com
R	180106092316Z	170106094745Z	02	unknown	/C=CN/ST=fujian/O=Anyfish/OU=network/CN=node4/emailAddress=123
R	180106095446Z	170106095753Z	03	unknown	/C=CN/ST=jiangxi/L=fuzhou/O=anyfish/OU=network/CN=node4/emailAddress=112
R	180106095917Z	170106100230Z	04	unknown	/C=CN/ST=fujian/L=xiamen/O=abc/OU=network/CN=node4/emailAddress=11


五、ssl

1、ssl简介

  SSL:Secure Socket Layer 安全套接字层位于可靠的面向连接的传输层协议和应用层协议之间的一种协议层应用层数据不再直接传递给传输层,而是传递给SSL层,SSL层对从应用层收到的数据进行加密,并增加自己的SSL头SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。

该协议由两层组成:SSL记录协议SSL握手协议

  TLS:Transport Layer Security 传输层安全协议 国际标准化组织借鉴SSL开发的协议

 SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。 

  ssl通常是库,其它程序可以调用ssl库,实现安全通信

http --> https

ldap --> ldaps

ftp --> ftps

smtp --> smtps

pop3 --> pop3s

互联网的通信安全,建立在SSL/TLS协议之上


3、作用

  不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险:

 窃听风险(eavesdropping):第三方可以获知通信内容。 

 篡改风险(tampering):第三方可以修改通信内容。

 冒充风险(pretending):第三方可以冒充他人身份参与通信。

SSL/TLS协议是为了解决这三大风险而设计的,希望达到:

 所有信息都是加密传播,第三方无法窃听。

 具有校验机制,一旦被篡改,通信双方会立刻发现。

 配备证书,防止身份被冒充。


3、历史

  互联网加密通信协议的历史,几乎与互联网一样长。

1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。

1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。

1996年,SSL 3.0版问世,得到大规模应用。

1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。

2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变动是2011年TLS 1.2的修订版。

   目前,应用最广泛的是TLS 1.0,接下来是SSL 3.0。但是,主流浏览器都已经实现了TLS 1.2的支持。TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。

 

4、SSL/TLS基本的运行过程

  SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。

  SSL具有保密性、真实性、完整性和不可否认性,广泛使用在重要高度安全场景。

这些特性具体怎么体现呢?

SSL协议的客户端服务器连接握手过程大致如下:


4.1 客户端发出请求(ClientHello)

  首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。

在这一步,客户端主要向服务器提供以下信息:

 1)支持的协议版本,比如TLS 1.0版。

 2)一个客户端生成的随机数,稍后用于生成"临时对话密钥"。

 3)支持的加密方法,比如RSA公钥加密。

 4)支持的压缩方法。

  这里需要注意的是,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站的url,否则会分不清应该向客户端提供哪一个网站的数字证书。这就是为什么通常一台服务器只能有一张数字证书的原因。

  对于虚拟主机的用户来说,这当然很不方便。2006年,TLS协议加入了一个Server Name Indication扩展,允许客户端向服务器提供它所请求的域名

 

4.2 服务器回应(SeverHello)

  服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。

服务器的回应包含以下内容:

 1)确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。

 2)一个服务器生成的随机数,稍后用于生成"临时对话密钥"。

 3)确认使用的加密方法,比如RSA公钥加密。

 4)服务器证书。

   除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供"客户端证书"。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。

 

4.3 客户端回应

  客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。如果证书没有问题,客户端就会从证书中取出服务器的公钥。

然后,向服务器发送下面三项信息:

 1)生成一个随机数。该随机数用服务器公钥加密,防止被窃听。

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

 3)客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。

  上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"临时会话密钥"。

至于为什么一定要用三个随机数,来生成"会话密钥"?

   "不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。

   对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。

   pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。"

此外,如果前一步,服务器要求客户端证书,客户端会在这一步发送证书及相关信息

 

4.4 服务器的最后回应

   服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息:

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

 2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

   至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。