原理:   

    SSL是SecureSocketLayer(安全套接层协议)的缩写,可以在Internet上提供秘密性传输。Netscape(网警)公司在推出第一个Web浏览器的同时,提出了SSL协议标准,目前已有3.0版本。SSL采用公开密钥技术。其目标是保证两个应用间通信的保密性和可靠性,可在服务器端和用户端同时实现支持。目前,利用公开密钥技术的SSL协议,已成为Internet上保密通讯的工业标准。安全套接层协议能使用户/服务器应用之间的通信不被攻击者窃听,并且始终对服务器进行认证,还可选择对用户进行认证。SSL协议要求建立在可靠的传输层协议(TCP)之上。SSL协议的优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP,FTP,TELNET等)能透明地建立于SSL协议之上。SSL协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作。在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。

AB通信身份认证过程   

   发送方步骤一:

       用单向加密的方法,生成特征码

   步骤二:

       发送方用自己的私钥加密特征码

   步骤三:

      生成一个临时的对称密钥,加密这整段数据

   步骤四:

       密钥交换: 自己生成一个密码用对方的公钥加密这个密码,从而使得只有对方可以解密

   接收方步骤一:

      接收方用自己的私钥解密,然后得到临时对称密钥的密码

   步骤二:

       用发送方的公钥解密得出数据特征码

   步骤三:

       然后用同样的单向加密算法计算出数据特征码进行比对,同时也可以验证数据的完整性

 

单向加密:

     功能:保证数据完整性,只能加密不能解密,提取数据指纹

      特性:定长输出、雪崩效应

算法:          md5 :128bitssha1:160bitssha224、sha256、sha384、sha512
 
 

用法:

提取/etc/inittab的特征码:

   ~]# openssl dgst -md5 /etc/inittab
    MD5(/etc/inittab)= 66a88d6c4d693170753ea3382f8bc150

 

查看/etc/inittab的特征码

   ~]# md5sum /etc/inittab     66a88d6c4d693170753ea3382f8bc150  /etc/inittab

公钥加密: 

        功能:

                数字签名:主要在于让接收方确认发送方的身份

          密钥交换:发送方用对方公钥加密一个对称密钥,发送给对方

          数据加密:

算法:    RSA, DSA, ELGamal    DSS: Digital Signature Standard    DSA:Digital Signature Algorithm
 

用法:

生成私钥:

     ~]# (umask 077;  openssl  genrsa  -out  /etc/pki/CA/private/cakey.pem 1024)

提出公钥:

    ~]#  openssl  rsa  -in  /etc/pki/CA/private/cakey.pem  -pubout

对称加密:

    加密和解密使用同一个密钥

    特性:加密解密使用同一个秘钥,将原始数据分割成固定大小的块,逐个进行加密

     缺陷:

        1、密钥过多

        2、密钥分发困难

算法 DES:数据加密标准,已经寿终正寝 56位密钥 3DES:依然被广泛使用 AES:高级加密标准  128 192 256 384位密钥   Blowfish Twofish IDEA RC6 CAST5
用法加密实例:    将inittab这个文件用des3的加密算法加点盐,保存到当前目录叫inittab.des3     openssl enc -des3 -salt -a -in inittab -out inittab.des3 会让你输入密码解密实例:     openssl enc -des3 -d -salt -a -in  inittab.des3 -out inittab
密钥交换

    公钥加密:公钥传送给对方,密码在网上传输,通过暴力方式可以破解出来,但是用DH不会

    DH :Diffie-Hellman算法 原理看IKE

 IKE:密钥交换简写    离散对数原理剖析:  (单向加密)        A:生成 x     B:生成 y        A:g^x%p --> B    A把g的x次方对p取模 传给B        B: g^y%p --> A    B把g的y次方对p取模 传给A    我们在互联网上传递了4个数字:     四个数字分别是   g 、p、 g^x%p、g^y%p    拿到数字后         A:(g^y%p)^x=g^yx%p       B:(g^x%p)^y=g^xy%p 分别取自己手中数字的平方,结果相同 这就是著名的Diffie-Hellman算法
生成用户密码:
 

 openssl passwd -1 -salt SALT  (-1 是md5加密格式)

 

/]# openssl passwd -1 -salt 123   Password:   $1$123$7mft0jKnzzvAdU4t0unTG1 /]# openssl passwd -1 -salt 123   Password:   $1$123$7mft0jKnzzvAdU4t0unTG1 由此可见sort一样密码一样,生成的密码串一定一样

生成随机数:      
~]#openssl rand -base64 10~]#openssl rand -hex 10   相当于sort可以命令调用
随机数生成器:

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

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

       熵池中随机数的来源;

            硬盘IO中断时间间隔;

            键盘IO中断时间间隔;  如果随机数用尽可以通过复制大文件来生成随机数


创建私有CA:

openssl命令:

配置文件:/etc/pki/tls/openssl.cnf

       构建私有CA:

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

   步骤: 

     (1) 生成私钥;

 ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)注释:使用rsa算法生成密钥并保存至/etc/pki/CA/private/叫做cakey.pem 密码长度为4096

使用rsa算法生成私钥保存为cakey.pem这个名

       (2) 生成自签证书;

 ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655		 -new:生成新证书签署请求;		 -x509:生成自签格式证书,专用于创建私有CA时;		 -key:生成请求时用到的私有文件路径;		 -out:生成的请求文件路径;如果自签操作将直接生成签署过的证书;		 -days:证书的有效时长,单位是day;注释:req生成自签署证书,指明密钥文件是cakey.pem并将证书保存为cacert.pem,指定有效期为一年 CN;Hebei;Zhengzhou;Renfang;Yunwei;ca.mageedu.com;caadmin@mageedu.com

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

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

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

客户机请求CA授权:

     步骤:(以httpd为例)

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

		  ~]# mkdir  /etc/httpd/ssl 		  ~]# cd  /etc/httpd/ssl		  ~]# (umask  077; openssl  genrsa -out  /etc/httpd/ssl/httpd.key  2048)

      (2) 生成证书签署请求

		  ~]# openssl  req  -new  -key  /etc/httpd/ssl/httpd.key  -out /etc/httpd/ssl/httpd.csr  -days  365

      (3) 将请求通过可靠方式发送给CA主机;即将httpd.csr文件发送到CA服务器上

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

	
吊销证书:	 步骤:	   (1) 客户端获取要吊销的证书的serial(在使用证书的主机执行):		 ~]# openssl  x509  -in /etc/pki/CA/certs/httpd.crt  -noout  -serial  -subject	   (2) CA主机吊销证书		 先根据客户提交的serial和subject信息,对比其与本机数据库index.txt中存储的是否一致;						          吊销:		 # openssl  ca  -revoke  /etc/pki/CA/newcerts/SERIAL.pem									 其中的SERIAL要换成证书真正的序列号;									    (3) 生成吊销证书的吊销编号(第一次吊销证书时执行)		 # echo  01  > /etc/pki/CA/crlnumber						    (4) 更新证书吊销列表		 # openssl  ca  -gencrl  -out  thisca.crl 							      查看crl文件:		 # openssl  crl  -in  /PATH/FROM/CRL_FILE.crl  -noout  -text

      

openssl 配置文件:

           /etc/pki/tls/openssl.cnf

     [root@localhost tmp]# cat  /etc/pki/tls/openssl.cnf

该配置文件中以 "[配置段]",的形式配置相关信息

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

==================================== openssl.cnf部分内容摘要=====================================

# OpenSSL example configuration file.

# This is mostly being used for generation of certificate requests.

######################################################################################

[ ca ]         #CA相关配置段

default_ca        = CA_default                # The default ca section                 # 默认CA[ CA_default ]配置

######################################################################################

[ CA_default ]        #  默认当做CA的工作环境

dir                = /etc/pki/CA                # Where everything is kept默认工作目录,变量形式

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.颁发过的证书索引文件

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 keyCA自己的私钥

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

 

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默认的生成算法

preserve        = no                        # keep passed DN ordering

####################################################################

[ req ]        # CA证书签署发起注册请求相关属性

default_bits                = 2048

default_md                = 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

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

 

 

 

     



       

 

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

 

   提取公钥

   openssl rsa -in server.key -putout  将server.key里的公钥提取出来,一般不需要手动

 

步骤二、

    req生成自签署证书( 指定密钥文件是cakey.pem 保存在cacert.pem 指定有效期限为一年)

站在CA目录上执行

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

     CN;Hebei;Zhengzhou;Renfang;Yunwei;ca.mageedu.com;caadmin@mageedu.com

     自签署证书做好了  可以用这句话查看openssl x509 -text -in server.crt

   现在CA准备好了

 四:vim /etc/pki/tls/openssl.cnf  编辑CA的配置文件

    修改:dir    =/etc/pki/CA

           CA中还必须包含下面的几行命名的目录

           在下面 还可以设置默认的个人信息,以后就不用重复填写了    

五:私钥应该保存在/etc/pki/CA/private目录下叫做cakey.pem

六:在CA下创建 mkdir certs newcerts crl 

七、还要准备两个文件:touch index.txt  touch serial ;echo 01 > serial

八、在另外一台服务器上mkdir /etc/httpd

                      cd /etc/httpd;  mkdir ssl/  ;  cd ssl/

九、这台服务器需要申请生成私钥 (umask 077; openssl genrsa -out httpd.key 1024 )

十、还在ssl目录下 进行证书签署请求

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

        下面填写的城市  公司 部门  一定要和CA一致

十一、因为在一台服务器,签署证书就不用远程发送;下面是ca签发的过程

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

十二:当前目录下就会有一个httpd.crt的证书

十三:回到CA  cd /etc/pki/CA;   cat index.txt 会有一个01号 因为前面咱们echo进去了一个01

 

.crt是证书 .csr是请求 .key是生成密钥

 

这个过程需要背过;而且要能把当前主机做成CA的过程用脚本实现,包括修改配置文件

 

附加知识点 生成测试用户:cd /etc/pki/tls/certs/

           make httpd.pem 他会自动帮你生成私钥 让你填写各种信息

          在certs目录下就会生成一个httpd.pem (私钥也在里面,但是正式环境不能这么玩)  根据后缀的不同自动确定是什么文件 Makefile文件中有定义