在虚拟机里实现数据加密和 openssl签证。
一、 数据加密是实现网络安全的关键技术之一,本文首先介绍加密的基本概念,然后着重讨论 类最常见的加密技术:  对称加密、非对称加密和单向加密,最后说明怎么样使用 openssl对数据进行加密。 数据加密技术是网络中最基本的安全技术,主要是通过对网络中传输的信息进行数据加密来保障其安全性,这是一种主动安全防御策略,用很小的代价即可为信息提供相当大的安全保护。
既然说到了解密,那为什么要用到加密呢?当然是因为会受到网络***,所以才需要通过加密来保证数据传输的安全性与完整性。那么首先介绍一下常见的网络***方式:
数据注入:也就是篡改,把别人传输的数据进行非法修改,使其面目全非,无法正常使用。
窃听:  在网络中,当信息进行传播的时候,可以利用工具,将网络接口设置在监听的模式,便可将网络中正在传播的信息截获或者捕获到,从而进行***。网络监听在网络中的任何一个位置模式下都可实施进行。而***一般都是利用网络监听来截取用户口令。 
会话劫持: Session hijacking),是一种网络***手段, 就相当于截断会话。 *** 可以通过破坏已建立的数据流而实现 劫持   会话劫持利用了TCP/IP工作原理来设计***  可以对基于TCP的任何应用发起***,如HTTPFTPTelnet
     二、 加密的基本概念
"加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)。将密文还原为原始明文的过程称为解密,它是加密的反向处理,但解密者必须利用相同类型的加密设备和密钥对密文进行解密。
数据的加密方式有三种:
1 )单向加密:  MD5SHAHMAC 这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。  
2)对称加密:加密和解密使用不同的密码,有代表性的有RSA、DSA、ElGamal和ECDSA。非对称加密/解密的安全性是基于复杂数学难题,特点是运算复杂、速度慢,主要应用于金融、军事等重大机密的系统。
(3)非对称加密:又叫公钥加密。 在公钥密码中,收信方和发信方使用的密钥互不相同,而且几乎不可能从加密密钥推导解密密钥。比较著名的公钥密码算法有:RSA、背包密码、McEliece密码、Diffe?HellmanRabinOng?Fiat?Shamir、零知识证明的算法、椭圆曲线、EIGamal算法等等。最有影响的公钥密码算法是RSA,它能抵抗到目前为止已知的所有密码***。 非对称加密/解密的安全性是基于复杂数学难题,特点是运算复杂、速度慢,主要应用于金融、军事等重大机密的系统。
  注意:  加密的强度本身依赖于密码的强度,因为更换密码比更换算法更易实现。
    三、下面介绍一下三种加密方式的工作机制:
(1) 单向加密:这种加密方式是不可逆的,并不单独使用。主要是用来获取数据的特征码,保证数据的完整性。特点是:定长输出、不可逆、 雪崩效应(输入数据的稍微改变,就会引起结果的巨大不同)。
 
(2) 对称加密: 加解密双方使用同一个密钥。如: Tom  要发送数据给Regina,则:
     Tom : data : algrithm (passwd) -->code
     Regina : code : algrithm (passwd) --> data
  这种技术可以实现数据的保密性。
     PS: 密钥交换对于对称机制是一个无法解决的难题,因为无法将密钥提供给对方。
(3) 公钥加密:    公钥:是从私钥中提取出来   缺陷:速度非常慢   例子: Tom R egina 发信息, Tom 拿自己的私钥,进行加密。 R egina  Tom 的公钥解密,只要能解密出来, R egina 就可以认为 Tom 就是 Tom ,而不是别人冒充的。   
Public Key:公钥
Secret Key : 私钥 (只有用户本人留存,其他任何人不可以查看。)
Tom  : data --> PK --> code
Regina : code --> SK -->  data
注: 公钥加密只能使用与之配对的私钥解密,反之亦然。
如何完成身份验证?
1Tom 用单项加密算法将要传送的数据加密,生成特征码;并用自己的私钥将特征码再加密,传送给Regina.
2Regina Tom的公钥能够解密数据包,就说明是Tom 发送的,可以用同样的算法解密。(可用来完成身份验证)
此时存在的问题是,Regina 如何知道Tom 的公钥就是Tom的,而不是别人伪造的呢?
三种加密方式的结合:
1Tom生成一段要发送给Regina的数据,用单向加密生成数据特征码(就相当于数据签名),放在数据的后面;用自己的私钥加密特征码附加在特征码的后面;再用于Regina商量好的对称算法加密整段数据(比如为x);再用Regina的公钥加密数据x,在发送给Regina
2Regina 收到数据后,先用自己的私钥将数据解密为x,在使用对称算法解密x;然后使用Tom的公钥解密;而后使用同样的单向加密算法解密,查看是否一致(确定数据是否被篡改);最后可以查看数据。
虽然如此,看起来已经很安全可靠了,但是最重要的问题仍然是密钥交换。
基于以上所存在的问题,就诞生了今天的CA
    四、CA 是可信任的第三方证书颁发机构。CA的证书一般包含的信息有:
用户提供的信息:证书持有者的相关信息和公钥。CA提供的信息:CA的相关信息、证书的使用方法(用户或服务器)和证书的有效期。
PKI: Public Key Infrastructure 公钥基础设施,是互联网上以CA提供的公钥安全架构,其核心就是CA
    五、OpensslLinux系统中常用的加密工具。
   SSL: Secure Socket Layer 安全套接字层。七层模型时工作在传输层与会话层之间的半个层;TCP/IP模型时工作在传输层与应用层之间的半个层。
   TLS: Transport Layer Security
openssl有三部分组成,两个库一个文件。
1libcrypto 支持加密解密的库文件
2libssl 库文件,支持TLS/SSL协议的库(可实现基于会话的安全)
3openssl 多用途的加密工具,功能非常强大,可提供单向加密、对称加密和公钥加密,还可以用于创建CA(自建CA的建议解决方案)。
如何加密?
openssl enc -des3 -a -in plaintext -out ciphertext.des3 
解说 enc: 使用加密技术的编码
      -des: 使用DES加密算法
      -a : 使用base64编码
      -in : 需要加密的文件
      -out: 加密后输出的文件名
如何解密?
openssl enc -d -des3 -salt -a -in ciphertext.des3 -out plaintext 
      -d : 解密
openssl rand [ -base64 ] num 随机生成数 使用openssl base64将数据编码
md5sum filename1 sha1sum filename2 和 openssl dgst -sha1 filename3 一样,可计算文件的校验码,提取文件的特征码。
生成密钥:
openssl genrsa 2048 > x.key  生成RSA的密钥对,输出的信息为私钥,公钥是从私钥的内容中提取出来的。
 提取公钥:
openssl rsa -in filename1(存放私钥的文件,如x.key) -pubout -out filename2(存放公钥的文件)
注意: 若是-pubout 后面没有 -out 和文件名,则输出至屏幕上。
这样生成的私钥是不能被别人看到的,但是可以被读到的,所以还得修改权限:chmod 600 filename2
也可以使用(umask 077; openssl genrsa 2048 > x.key),这样生成的文件直接就是加密存放的,比较安全。() 表示在子shell 中使用,不会对当前shell产生影响。
任何公钥和私钥都是用户自己生成的,CA只是对其进行签名,然后对其负责。
如何用openssl做成证书并颁发给服务器?
(1) 修改SSL的配置文件
     # cd /etc/pki/tls
     # vim openssl.cnf
     将 [ CA_default ] 下的 dir = ../../CA
     改为  dir = /etc/pki/CA
(2) # cd ../CA
     (umask 077; openssl genrsa 2048 > private/cakey.pem(红帽要求为此格式的文件后缀))
(3) 签证:
请求发证:  openssl req -x509CA的流行格式)-new -key private/cakey.pem -out cacert.pem 
 提供自己的信息,
国家:CN
省份:Henan
地区:ZZ
公司:magedu.com(也可以是个人)
部门: Tech(技术部)
服务器名: ca.magedu.com
邮箱: 选填
一系列填完之后就可以了,另外还要建几个目录和文件供后续使用。
# mkdir certs newcerts 
# touch index.txt
# echo 01 > serial
# echo 01 > crlnumber  ,此时CA服务器就建好了。
若是想给httpd服务发证,该怎么做?
# cd /etc/httpd/  httpd 服务的配置文件所在的目录)
# (umask 077; openssl genrsa 1024 > httpd.key)  生成私钥文件
# openssl req -new -key httpd.key -out httpd.csr   提取公钥
# openssl ca -in httpd.csr -out httpd.crt  请求CA颁发证书
此时,就又该填写信息了,同上稍微修改即可。把服务器改为: ling.magedu.com
复制刚才的cacert.pem Windows 桌面,由于Windows不识别此格式的后缀,所以还要将后缀名修改为 .crt格式。导入到对应浏览器,步骤为
(1) 单击浏览器的选项,-->高级--> 
 

(2) 管理证书-->导入--> 
 

(3) 选择--> 完成
 

 
此时,httpd服务的https协议就用openssl做好了。

可以在浏览器里输入网址https://172.16.7.1,查看是否有带锁的标志就好。