漫漫运维路——各种加密方式介绍及基于OpenSSL实现HTTPS

一、为什么要加密

在网络中通信有时通信双方会发送一些比较敏感的信息,如果直接明文在网上传输,就可能被居心叵测的人截获,从而达到其非法的目的。为保证通信双方信息传输不被第三方所知晓,使用加密技术把双方传输的数据进行加密,即使数据被第三方所截获,那么第三方也不会知晓其数据的真实含义。在此,通信双方所交换的信息中,未被加密的数据称为明文,而加密后的数据称为密文,加密采用的方式称作加密密钥。

二、常见加密方式以及其用途

对称加密

对称加密是指在加密通信过程中,把明文加密为密文的密钥和把密文解密为明文的密钥是同一个,加密时通常把明文切割为大小固定的数据块,逐个进行加密,此种加密方式比较简单,容易被暴力破解。常见的对称加密算法详见下表:

算法

特点

DES

64b定长输出

3DES

使用54b密钥对数据进行三次加密

Twofish

使用任何长度为256比特的单个密钥

AES

可快速加解密,且需要存储少

非对称加密往往需要使用多个密码进行通信,所以导致密钥分发消耗资源。

非对称加密

非对称加密又叫做公钥加密,顾名思义,就是通信双方加密和解密使用不同的密钥,通常使用非对称加密都有两个密钥,一个被称为公钥,一个被称为私钥,私钥顾名思义,就是由生产的个体自己保留,不外传,而公钥则会公开,用于提供给别人加密使用。另外公钥是从私钥中提取出来的,所以要有公钥得先生产私钥。非对称加密用途有如下三样:

身份认证:由于非对称加密的密钥通常会成对出现,如果一方使用其私钥加密一段数据,而另一方用其公钥能解密,则可确定其身份。

密钥交换:当通信双方需要交换密钥时,如AB发送密钥,则可把密钥用B的私钥进行加密,然后再发给A,只有A才能对其进行解密,所以这样就确保了其密钥不被其他用户获取。

数据加密:在通信时通信双方还可以直接使用非对称加密进行数据加密,但是加密效率不高。

常见算法

特点

RSA

密钥较长,被破解可能性小

DSA

分组较短、密钥也比较短

ELGamal

加密过程较为繁琐,但比较安全

单向加密

单向加密时加密方式中的另外一种,此类算法只负责加密,不负责解密,在Linux中也比较常见,那就是/etc/shadow中保存用户密码的密码串,那就是使用单向加密算法加密再存放的。单向加密还有一个特性,就是其具有雪崩效应,数据的微小变化会引起加密结果的巨大改变。

使用单向加密,最常见的是用于数据完整性的校验,数据提供方先生成数据,然后使用单向加密算法计算出特征码,然后通过可信的手段传递给数据的接收方,并告诉其使用的加密算法和密钥,然后接收方接收到后使用数据提供方给的加密算法和密钥对数据再次提取特征码,如果所提取的特征码和对方提供的一样,则认为数据完整。

常见的单向加密算法如下所示:

 

 

算法

特征

MD5

压缩性、容易计算、抗修改等

SHA1

512的数据块大小,分别处理每一数据块

SHA256

属于哈希类算法中的一种,其数据块大小为256

 

三、实现安全的WEB服务——HTTPS

HTTPS服务中如何确保数据传输过程中的安全性

首先考虑如下几个问题,如何确保通信双方身份可信?

WEB服务中要想验证通信双方的身份,则只有一个办法,就是由具有公信力的第三方机构为WEB服务器做公证,证明当前通信的WEB服务器就是我们期望的服务器,要想对WEB服务器进行身份验证,可使用认证的机制,由证书颁发机构向服务器颁发证书,然后通信时服务器先把证书发给客户端,客户端接收到后确认证书的真实有效性后再接收来自服务器端的数据。

接下来面临第二个问题,如何加密双方通信数据?

链接建立之后,虽然可以验证服务器的身份,但是数据要在网络上传输就要面临一个问题,就是要确保其不被别人监听,所以在此要对数据进行加密。而加密则要让客户端和服务器都能高效解密对方所发数据且第三方无法解密,所以在此就要使用公钥加密算法。首先在服务器向客户端发送证书的时候,服务器就会生成一对密钥,并且把公钥附加在证书上发给客户端,客户端接收到并确认服务器身份后,客户端自己使用对称加密算法生成密钥,使用接收到的公钥加密自己生成的密钥后发送给服务器端,服务器接收到后使用自己的私钥进行解密,从而获取到双方通信的密钥,从此双方就可以使用客户端生成的密钥进行加密了。而就算第三方截取到数据也密钥密钥,不能解密。

第三个问题,如何确认数据在传输过程中未被其他人所修改,在数据传输过程中,虽然有了前面的机制,可确保别人无法监听,但是一旦被截获,然后第三方虽然看不到其内容,在数据内添加额外数据后再发给客户端,客户也无从得知。所以此时就要用种机制能确保数据的完整性。在此可使用单向加密算法,首先数据的传输方先使用单向加密算法提取其特征码,然后把特征码附加到数据的首部,当接收方接收到数据后使用相同的算法再次对数据提取特征码,如果和受到的特征码一样,则未被修改,否则则数据可能已被更改。

SSL介绍

SSL Security Socket Layer的缩写,是一个实现网络之间加密通信的协议,早期Netscape为了确保让TCP/IP协议传输信息的安全性,在TCP/IP四层协议的传输层之上应用层之下加了半层,从而把从应用层传下来的数据进行加密然后再发生出去,确保数据在传输时不被监听和截取,并且把该层命名为了Security Socket Layer,从此就被用作网络中安全通信的标准。

SSL当前版本为3.0,现在也主要用于加强WEB浏览器和服务器之间的身份认证和数据加密的传输。

OpenSSL介绍

OpenSSL是一个功能强大的安全套接字密码库,其中包含了最常见的加密算法、常用的证书和证书管理功能及SSL协议等,可使用OpenSSL管理密钥生成证书,且还可以使用其模仿实现CA的所有功能。

使用OpenSSL+apache可以构建出HTTPS站点,结合数据的通信方式实现过程大致需要几个步骤,首先建立CA、然后建立WEB服务器并生成证书、然后WEB服务器把证书发送给CA,由CA签名后回传给WEB服务器,最后在WEB服务器上安装模块,为HTTPS提供测试首页即可。

实现HTTPS

由于HTTPS的实现需要对客户端实现身份认证,所以整个HTTP的会话链接会在TCP三次握手后对服务器的证书进行验证,所以整个实验基本流程如下图所示:

技术分享


1.生成自签证书

A.生成私钥

[root@localhost CA]#  (umask 077; openssl genrsa -out private/cakey.pem 2048)


B.生成自签证书

[root@localhost CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3600
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) [CN]:
State or Province Name (full name) [SiChuan]:
Locality Name (eg, city) [ChengDu]:
Organization Name (eg, company) [wuxiaotao]:
Organizational Unit Name (eg, section) [EDU]:
Common Name (eg, your name or your server‘s hostname) []:ca.wuxiaotao.com
Email Address []:[email protected]


C.为CA提供相关配置文件,

[root@localhost CA]# mkdir certts crl netcerts#:若文件已创建则略过
[root@localhost CA]# echo 01 >serial


2.客户端生成证书

A.在WEB服务器上的/etc/httpd目录下新建ssl目录用于存放证书 

[root@localhost etc]# mkdir /etc/httpd/ssl


B.生成私钥

[root@bogon ssl]#  (umask 077; openssl genrsa -out httpd.key 2048)
生成证书
[root@localhost ssl]#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) [CN]:
State or Province Name (full name) [SiChuan]:
Locality Name (eg, city) [CHENGDU]:
Organization Name (eg, company) [njsy]:
Organizational Unit Name (eg, section) [EDU]:
Common Name (eg, your name or your server‘s hostname) []:www.wuxiaotao.com
Email Address []:[email protected]
 
Please enter the following ‘extra‘ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:


3.发往客户端让CA签名

 [root@localhost ssl]# openssl ca -in /etc/httpd/ssl/httpd.csr -out /tmp/httpd.crt -days 3600
[root@localhost ssl]# openssl ca -in /etc/httpd/ssl/httpd.csr -out /etc/httpd/ssl/httpd.crt -days 3600
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: Apr 24 03:03:51 2015 GMT
            Not After : Mar  2 03:03:51 2025 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = SiChuan
            organizationName          = wuxiaotao
            organizationalUnitName    = EDU
            commonName                = www.wuxiaotao.com
            emailAddress              = [email protected]
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                A7:CC:C0:D3:10:B3:FD:4F:8B:51:0C:38:91:B1:68:9D:2E:A4:70:FB
            X509v3 Authority Key Identifier: 
                keyid:6E:05:A1:C8:03:E9:77:2D:17:F1:74:FD:81:8D:9E:8D:DE:42:E2:26
 
Certificate is to be certified until Mar  2 03:03:51 2025 GMT (3600 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


修改/etc/httpd.conf.d/ssl.conf的监听端口为本地主机ip如下

<VirtualHost 192.168.2.108:443>

ServerName www.wuxiaotao.com:443#:修改虚拟主机名

DocumentRoot "/var/www/wuxiaotao.com"#:虚拟主机目录

SSLCertificateFile /etc/httpd/ssl/httpd.crt#:***存放位置

SSLCertificateKeyFile /etc/httpd/ssl/httpd.key#:修改私钥存放位置

新建虚拟主机目录:

[root@localhost conf.d]# mkdir /var/www/wuxiaotao.com

为主机提供主页

[root@localhost conf.d]# echo "hello" >/var/www/wuxiaotao.com/index.html 

windows下打开C:\Windows\System32\drivers\etc添加IP和域名的对应条目

技术分享

重启httpd服务并测试

 

技术分享


 

 


本文出自 “linux-冒泡” 博客,请务必保留此出处http://7703592.blog.51cto.com/7693592/1637885

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。