本文仅个人笔记,大神博客参考:https://my.oschina.net/liting/blog/372488

1.ssl 与tls的区别:参考http://kb.cnblogs.com/page/197396/

    简而言之,ssl和tls都是介于tcp/ip(网络层)与http(应用层)的之间,也就是它们的中间层。ssl出现比较早,后来人们在它的基础上制定了tls协议。tls 1.0相当于ssl 3.0,但是又各有差异。各种应用层协议,如果想进行安全加密传输,需要把数据多经由ssl这个中间层加密,比如http经由ssl层则变成https协议,smtp经由ssl层变成smtps协议等。而且它们的会话建立过程也需要多几个步骤,拿https来说,当tcp三次握手完成以后,客户端和服务端还需要类似以下操作(简要写法,详细资料参考http://www.cnblogs.com/jifeng/archive/2010/11/30/1891779.html):

    1.客户端发起建立安全会话请求

    2.客户端和服务端协商使用的中间层协议(ssl或tls)、加密算法等信息

    3.服务端向客户端发送服务端证书

    4.客户端向信任CA验证证书,并提取公钥

    5.客户端与服务器端协商密钥,并开始正常通信

之所以要协商加密算法,是因为加密算法有很多类型,主要有如下几种:

对称加密:

    DES:Data Encrption Standard

    3DES:在DES的基础上再进行加密,重复3次

    AES:Adanced Encrption Standard (改进版对称加密标准,安全性较高,目前比较常用) 

    Blowfish

单向加密:

    MD4

    MD5

    SHA1

    CRC-32:循环冗余校验码,与普通单向加密不通的是,一般的单向加密不同的输入输出的结果都是不一样的,但是CRC-32可能会一样,一般用在数据传输过程中进行校验并纠错。

非对称加密:

    RSA:可以进行验证身份、加密和解密

    DSA:仅用于验证身份。之所以不能加密解密的原因在于它的加密过程中使用到了单向加密,而单向加密的特点之一是结果不可逆性,详见:http://zhiqiang.org/blog/it/das-and-ecdsa-rsa.html

2.ssl的开源实现:openssl

    openssl主要这个套件主要包含三个部分:(Centos下rpm -ql openssl查看) 

    libcrypto:这是个加密库,里面包含各种加密算法的实现源码

    libssl:这个是ssl/tls层协议的实现库,,基于会话的,实现了身份认证、、数据机密性和会话完整性的TLS/SSL库

    openssl:多用途命令行工具,可以进行CA证书的颁发


以下内容摘抄自大神博客:https://my.oschina.net/liting/blog/372488(大神写的比我好太多了j_0058.gif

openssl:

    speed #:测试评估系统对加密算法的性能 (openssl speed des)

    enc:加密算法

例子:

openssl enc -des3 -salt -a -in inittab -out inittab.des3 :加密数据

openssl enc -des3 -d -salt -a -in inittab.des3 -out inittab:解密数据

openssl dgst -sha1 inittab:计算数据的特征码(摘要)

openssl passwd –l 密码 :输入密码即可显示加密后的密码

openssl passwd -1 -salt 数据:加密的时候指定salt

openssl rand -base64 100:生成随机数

OpenSSL openssl实现私有CA具体步骤


第一步,创建CA机构     

   修改配置文件      

   自己生成一对密钥 (私钥加密http公钥)      

   生成自签证书


第二步,客户端     

   生成一对密钥      

   生成证书颁发请求---.csr      

   将请求发给CA


第三步,CA机构     

   签署此证书      

   传送给客户端


(5). CA配置文件:/etc/pki/tls/openssl.cnf (只讲解重要部分)


[ CA_default ]


dir = /etc/pki/CA #工作目录 ,此处需要指定,不然给客户到签证的时候必须在特定的目录下才能实现。


certs = $dir/certs #客户端证书目录


crl_dir = $dir/crl #证书吊销列表


database = $dir/index.txt #证书记录信息


new_certs_dir = $dir/newcerts #新生成证书的目录


certificate = $dir/cacert.pem #CA自己的证书位置


serial = $dir/serial #序列号


crlnumber = $dir/crlnumbe #证书吊销列表序列号


crl = $dir/crl.pem #证书吊销列表文件


private_key = $dir/private/cakey.pem #CA自己的私钥


RANDFILE = $dir/private/.rand #随机数文件


(6). CA机构 先生成一对密钥,然后生成自签证书


a. 生成密钥


命令格式:openssl genrsa -out /PATH/TO/KEYFILENAME NUMBITS #NUMBITS:密钥长度,默认是128位的


(umask 077;openssl genrsa -out server.key 1024) #生成后直接为700权限的key


命令格式:openssl rsa -in /PATH/TO/KEYFILENAME –pubout #读入密钥文件并输出公钥文件(提取公钥)


openssl rsa –in server.key –pubout


b. 生成证书


openssl req -new -x509 -key server.key -out server.crt -days 365 #(-days:证书的有效期限),然后输入相关的信息即可生成证书


注意:主机名称:至关重要,与主机名称保持一致,DNS主机名称,通信的唯一凭证


openssl x509 -text -in server.crt #查看新生成的CA证书


16. 建立私有CA 颁发机构


(1). 修改配置


vim /etc/pki/tls/openssl.cnf


[ CA_default ]



dir = /etc/pki/CA #工作目录 ,此处需要指定,不然给客户到签证的时候必须在特定的目录下才能实现。


certs = $dir/certs #客户端证书目录


crl_dir = $dir/crl #证书吊销列表


database = $dir/index.txt #证书记录信息



new_certs_dir = $dir/newcerts #新生成证书的目录


certificate = $dir/cacert.pem #CA自己的证书位置


serial = $dir/serial #序列号


crlnumber = $dir/crlnumbe #证书吊销列表序列号



crl = $dir/crl.pem #证书吊销列表文件


private_key = $dir/private/cakey.pem #CA自己的私钥


RANDFILE = $dir/private/.rand #随机数文件


x509_extensions = usr_cert


(2). 把自身服务器做成CA


cd /etc/pki/CA


(umask 077; openssl genrsa -out private/cakey.pem 2048) #生成证书


openssl req -new -x509 -key private/cakey.pem -out cacert.pem #生成自签证书


mkdir certs newcerts crl #建立相关的目录


touch index.txt


touch serial #建立序列号文件


echo 01 > serial #写入起始序列号


(3). 配置httpd使用证书


cd /etc/httpd #web服务器的配置目录


mkdir ssl


cd ssl #每一种服务要想使用证书,必须有私钥,每一种应用都需要自己的证书


(umask 077; openssl genrsa -out http.key 1024)#给自己生成密钥


openssl req -new -key httpd.key -out httpd.csr #证书签署请求文件,机构和其他名字必须和CA颁发机构上的一样

在签名时,如果报“The stateOrProvinceName field needed to be the same in the CA certificate”,是因为在openssl.cfg中的policy_match里面的前三个都选了match,修改成 
stateOrProvinceName = optional 
organizationName = optional 

openssl ca -in httpd.csr -out httpd.crt -days 365 #CA签名,签名以后才可以使用


个人写的创建CA脚本:

#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[ ! -f /etc/pki/CA/index.txt ] && touch /etc/pki/CA/index.txt
[ ! -f /etc/pki/CA/serial ] && echo "00" > /etc/pki/CA/serial
(umask  077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
echo "CN
fujian
xiamen
meihe
Tech
www.DamnSingle.com
[email protected]
"|openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem  -out /etc/pki/CA/cacert.pem