互联网上为了数据传输的安全,双方在通信的过程中一般使用加密或身份验证的机制来保证数据的机密性和完整性。

保证机密性:
就是发送方在传输数据明文的过程中经过一定的转换规则让其成为加密的数据,这个过程就是加密的过程
    明文--->转换算法--->密文
 
接收方接收数据时,通过转换规则再将该加密后的数据转换成明文,这一过程称为解密
    密文--->转换算法--->明文
   
    通过转换算法生成的能够将明文转换成密文的我们称之为密钥。
 
机密性:
机密性保证的最早实现的算法我们称之为对称加密
对称加密:
提供加密算法本身,让用户提供一个密钥以后将明文转换成密文,称之为对称密钥是因为数据在加密和解密的过程中使用的是同一个密钥。
作用:加密解密的速度比较快,但是安全性不是很好,而且在一定程度上没办法有效的管理。
 
完整性:
这里引入另外一种算法:单向加密算法:通过提取数据的特征码(指纹)来保证
发送方在传输数据的时候可以将该数据内容的一段特征码提取出来,附加在该数据之后,接收方需要使用同样的算法重复计算这段数据的特征码去和发送方的的特征码进行比较。
单向加密的特性:
   输入相同:输出必须相同
    雪崩效应:输入的微小改变,将会引起结果的巨大改变
    定长输出:无论原始数据多少,结果大小都是相同的
    不可逆的:无法根据特征码还原原来的数据
为了保证数据在传输过程中被第三方篡改,还可以将特征码进行加密。
 
如果双方之前从未通信,如何进行密码商定??
 
这里用到的机制叫做密钥交换:(Internet Key Exchange,IKE) 需要特殊的互联网协议支撑
基本密钥协议:Diffie-Hellman协议:互联网交换算法
假如A和B将两个数据p,g在互联网上传输,p ,g 指的是大素数和生成数
A:在本机内选择一个随机数x
B:在本机内选择一个随机数y
 
传输:
A: g^x%p-->B
B:g^y%p-->A
 
接收:
A:(g^y%p)^x=g^xy%p
B: (g^x%p)^y=g^xy%p
这个过程就是密钥交换
 
身份验证:
引入了公钥加密算法:也称为非对称加密算法
特征:密钥是成对的 公钥:p 私钥:s
公钥是在私钥中提取出来的,而且是公开的
用公钥加密的只能用与之相对应的私钥解密,反之亦然。
发送方用自己的私钥加密数据,所以可以实现身份验证。
发送方用对方的公钥加密数据,可以保证数据机密性。
但是公钥加密算法很少用来加密数据:速度太慢。 通常用来身份验证。
 
加密算法汇总:
常见对称加密算法:
    DES:数据加密标准  Data Encrption Standard ,56bit
    3DES: DES的改进
    AES:高级加密标准 Advanced 
AES192,AES256,AES512(默认128)
单向加密算法:定长输出
    MD4
    MD5
    SHA1
    SHA192,SHA256,SHA384(输出长度)
    CRC-32 循环冗余校验码  不提供安全性
 
非对称加密:也称公钥加密 (核心功能:加密和签名)
    功能:身份认证(数字签名),数据加密,密钥交换
 
    RSA:既可以加密,也可以签名
    DSA:只能实现签名,公开使用
    ElGamal: 商业算法
 
 
如果既想要保证数据的机密性又能保证对方的身份:
通常将单向加密算法和非对称加密算法。
 
双方通信的具体过程:
发送方:
1、计算数据的特征码(单向加密)
2、用自己的私钥加密特征码,并附加在数据后面
3、生成一个临时对称密钥
4、用此密钥结合某算法加密数据及加密数据后的特征码
5、用接收方的公钥加密此对称密钥,并附加在加密后的数据后面
6、发送至接收方
 
 
接收方:
1、用自己的私钥解密加密的对称密钥
2、用临时对称密钥解密数据
3、用对方的公钥解密加密的特征码
4、用同样的算法计算数据的特征码,并与解密而来的特征码进行比较;
 
 
事实上,双方的公钥传递是要向对方获取的,这个过程中也不能保证对方就是其本人,这就引入第三方认证机构:CA(Certificate Authority)
发送方将自己的公钥提交给第三方,由第三方对其公钥做公证,将其信息做成一个证书,添加上自己的签名,只要接收方认可发送方的证书的可靠性,两者就可以通过证书来通信了。
 
证书颁发机构的总体叫做PKI就(Public Key Infrastrucure)公钥基础设施
PKI 的核心就是CA和他们彼此间的信任关系。
 
证书是否有效,可以查看证书吊销列表:CRL  可以吊销过期的证书或丢失的证书,保证证书安全性
 
目前通用证书的格式:
x509证书:包含的内容
公钥及其有效期限
证书的合法拥有者
证书该如何被使用
CA的信息
CA签名的校验码
互联网上著名的安全机制:TLS和SSL 用的就是x509的证书。
 
 
TLS和SSL 是如何实现密钥交换等功能的??
 
SSL:Secure Socket Layer 安全的套接字层
版本有:SSLv2  SSLv3
https:是加密的http协议,使用的是443端口,它就是通过在tcp层和应用层加上了半个层即ssl,SSL只是一个库,让应用层在传输的过程中调用该库就可以实现安全传输了,众多的协议经过调用这个库也就实现了加密的功能。
如图:
 

互联网通信以及用openssl创建私有CA_加密

 
TLS 更为开源的一个加密机制,全称:Transport Layer Security 传输层安全,版本TLSv1相当于SSLv3
 
ssl会话的建立:
以http协议为例:
http:双方在通信过程中,经过三次握手。
https:客户端发起请求,服务器端和客户端协商建立ssl会话(选择加密协议的版本),服务器端将自己的证书发给客户端,客户端获取证书后要先验证(是否是信任的、完整的),客户端建立一个会话密钥,将用服务器端公钥加密后的密钥传给服务器端,服务器端用这个密码加密给客户端传送。

互联网通信以及用openssl创建私有CA_加密_02

 

在linux中,能够实现对称加密的工具:Openssl

Openssl:SSL的开源实现,主要包括三个部分:

libcrypto:通用加密库(提供了各种加密函数)

libssl:TLS/SSL的实现

            基于会话的、实现了身份认证、数据机密性和会话完整性的TLS/SSL库

openssl:多用途的命令行工具。 

            还可以实现私有证书颁发机构。

openssl包含很多子命令,可以实现诸多功能,自己去开发哦。^_^

 

这里我们举例让openssl实现私有CA:(Red Hat Enterprise Linux Server release 5.8 )

第一步、生成一对密钥,用公钥做成证书

第二步、生成自签署证书

 

先去网上下载openssl的软件,我们这里用yum源进行安装(前面文章中有安装软件的介绍,可以参考)

安装好openssl的工具就可以创建自签署证书了。

生成一对密钥:我们一般使用RSA的,RSA既可以加密也可以签名,生成rsa密钥的命令:genrsa

 

1,openssl genrsa 生成私钥 重定向保存文件 

后跟NUMBER(数字) 是指生成多长的私钥  相当于 [openssl genrsa -out filename NUMBER]:生成密钥并保存至文件保存改权限为600

2,(umask 077;openssl genrsa -out filename NUMBER)

注:umask的设置是在假定文件拥有666权限上进行的,文件的权限就是目录的默认权限减去执行权限

对于目录来说,是在777权限上进行的,目录的权限就是777减去umask的掩码数值

3,openssl rsa -in filename -pubout 从该文件的私钥中提取出公钥

 

 

 

 

生成自签署证书:命令 req

openssl req -new -x509 -key [密钥文件] -out [自签署证书名.crt] -days [有效期限]

这里会有几项让你自己填写的具体信息

其中有一项主机名很重要,一定要和主机名称(DNS名)保持一致

 

自己CA完成,就可以给别人发证了。

查看证书里面的内容:openssl x509 -text -in [证书名称]

客户端申请证书:

客户端自己生成一个申请,把申请交给CA,让CA签署就可以了。

配置:
密钥和证书是不能随便放的,要保存在/etc/pki/CA/private下,
这些信息可以在配置文件/etc/pki/tls/openssl.cnf中查看及修改。
 
  1. dir             = ../../CA              # CA在什么地方,可以将其改为/etc/pki/CA 
  2. certs           = $dir/certs            # 客户端证书 
  3. crl_dir         = $dir/crl              # 证书吊销列表的位置 
  4. database        = $dir/index.txt        # 给哪些人发证的位置  
  5.      
  6. new_certs_dir   = $dir/newcerts    #刚新生成证书的位置 
  7. certificate     = $dir/cacert.pem       # CA自己证书的存放位置 
  8. serial          = $dir/serial           # 证书的序列号 
  9. crlnumber       = $dir/crlnumber        #证书吊销列表的号码 
  10.  
  11. crl             = $dir/crl.pem          # 当前证书吊销列表文件 
  12. private_key     = $dir/private/cakey.pem# CA私钥存放位置 
  13. RANDFILE        = $dir/private/.rand    #随机数文件(自己生成) 
  14.  
  15. #以上没有的文件需要自己创建的哦 
也可以在这里设置一些CA信息
 

 

  1. [ req_distinguished_name ] 
  2. countryName                     = Country Name (2 letter code) 
  3. countryName_default             = GB        #默认国家 
  4. countryName_min                 = 2 
  5. countryName_max                 = 2 
  6.  
  7. stateOrProvinceName             = State or Province Name (full name) 
  8. stateOrProvinceName_default     = Berkshire      #默认州 
  9.  
  10. localityName                    = Locality Name (eg, city) 
  11. localityName_default            = Newbury    #默认城市 
  12.  
  13. 0.organizationName              = Organization Name (eg, company) 
  14. 0.organizationName_default      =My Company Ltd      #公司名称 
  15.  
  16. organizationalUnitName          = Organizational Unit Name (eg, section) 
  17. #organizationalUnitName_default =               #组织名称,手动启用。 
  18.  
  19. commonName                      = Common Name (eg, your name or your server\'s hostname) #主机名要根据实际设置的 
  20. commonName_max                  = 64 
  21.  
  22. emailAddress                    = Email Address    #邮箱地址和CA的也是不一样的 
  23. emailAddress_max                = 64 

 

 

注:以上默认内容可以根据实际手动进行更改的,(一般后两项是不同的,不需要在这里填写)

这些在配置文件中设置好了,自己申请CA的时候就不用去手动填写了。

 

 

下面以实例来解析下创建私有CA的过程:

 

CA服务器上配置:

1、vim /etc/pki/tls/openssl.cn

 

  1. dir=/etc/pki/CA  

  1. countryName_default             = CN 
  2.  
  3. stateOrProvinceName_default     = HeNan 
  4.  
  5. localityName_default            = Zhengzhou 
  6.  
  7. 0.organizationName_default      = Magedu 
  8.  
  9. #1.organizationName_default     =  
  10.     
  11. organizationalUnitName_default  = Tech 
  12. 以上这些我在这里手动进行更改了。 

2、cd /etc/pki/CA

  1. # mkdir certs newcerts crl 
  2. # touch index.txt 
  3. # touch serial 
  4. # echo 01 > serial 

3、生成自签证书

 

(umask 077; openssl genrsa -out private/cakey.pem 2048)

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

 

 

  1. Country Name (2 letter code) [CN]: 
  2. State or Province Name (full name) [HeNan]: 
  3. Locality Name (eg, city) [Zhengzhou]: 
  4. Organization Name (eg, company) [Magedu]: 
  5. Organizational Unit Name (eg, section) [Tech]: 
  6. Common Name (eg, your name or your server's hostname) []:ca.123.com 
  7. Email Address []:ca@123.com 
  8. 配置文件中设置了,执行该命令的时候会出现以上在配置文件中输入的内容,不需要再手动输入了 
  9. (主机名和Email 还需要自己填写一下额) 

 

 

客户端证书申请方:

1、为某服务生成密钥

  1. 1、为某服务生成密钥: 
  2. # mkdir /etc/httpd    #路径根据自己需要设置 
  3. # cd /etc/httpd/ 
  4. # mkdir ssl 
  5. # cd ssl 
  6. # (umask 077; openssl genrsa -out httpd.key 1024) 
  7. # openssl req -new -key httpd.key -out httpd.csr 

 

  1. Country Name (2 letter code) [CN]: 
  2. State or Province Name (full name) [HeNan]: 
  3. Locality Name (eg, city) [Zhengzhou]: 
  4. Organization Name (eg, company) [Magedu]: 
  5. Organizational Unit Name (eg, section) [Tech]: 
  6. Common Name (eg, your name or your server's hostname) []:www.aa.com 
  7. Email Address []:aa@123.com 
  8.  
  9. Please enter the following 'extra' attributes 
  10. to be sent with your certificate request 
  11. A challenge password []: 
  12. An optional company name []:    #最后这两行是问你是否加密存放证书的,
  13. 不加密的话可以按回车 

 

 

2、将此请求通过某方式传递给CA服务器

(不是在一台主机上要向另一台主机发送请求,在这里我只使用了一台主机,

在自己机器上就可以签了,这步就省略了^_^)

 

3、CA签署证书(在CA服务器上操作)

# openssl ca -in vsftpd.csr -out vsftpd.crt -days N

 

cat /etc/pki/CA/index.txt 里面记录的就有签署的证书的信息了。

  1. V   221022094454Z       01  unknown 
  2. /C=CN/ST=HeNan/O=Magedu/OU=Tech/CN=www.aa.com/emailAddress=aa@123.com 

 

以上内容就是我制作的私有证书哦^_^