https加密访问Web站点的实现

    首先来介绍一下https的原理:

http 这个通讯协议是明码传送数据,而那个 https 才是加密传输的!那加密的方法是透过 SSL 啊,这个 SSL 就是以 openssl 软件来提供的一个加密函式库

加密的网页数据 (SSL) 及第三方公正单位 

    关于 HTTP 这个传输协议当中,你必需要知道的是:『这个传输协议传输数据是以 

明码传送的』, 所以你的任何数据封包只要被监听窃取的话,那么该数据就等于是别 

人的啦!那想一想, 你有过上线刷卡的经验吗?上线刷卡只要输入你信用卡的卡号与 

相关的截止日期后,就能够进行交易了。 如果你的数据在 Internet 上面跑时是明码 

的情况下,真要命!那你的信用卡不就随时可能会被盗用? 

    虽然大多数 Internet 上面的 WWW 网站所提供的资料是可以随意浏览的,不过如 

同上面提到的, 一些物流交易网站的数据以及关于你个人的重要机密数据当然就不能 

这样随意传送啦! 这个时候就有需要用到 https://hostname 这种联机的方式啦!这 

种方式是透过 SSL 加密的机制喔

 Secure Socket Layer (SSL) 

    还记得我们在第十一章的 SSH 服务器当中介绍过他联机的机制吧? 就是利用非 

对称的 key pair (Public + Private kye) 来组成密钥,然后透过公钥加密后传输, 传 

输到目标主机后再以私钥来解密,如此一来数据在 Internet 上面跑就以加密的方式, 

想当然尔,这些数据自然就比较安全啦!SSL 就是利用在 WWW 传输上面的加密方式之 

一啦! 

    当浏览器端与 WWW 服务器端同时支持 SSL 的传输协议时,在联机阶段浏览器与服 

务器就会产生那把重要的密钥! 产生密钥后就能够利用浏览器来传送与接收加密过的 

重要数据啦!要达成这样的机制, 你的 WWW 服务器必需要启动 https 这个重要的传 

输协议,而浏览器则必需要在网址列输入 https:// 开头的网址,那两者才能够进行沟通与联机。要注意的是,在某些很旧的浏览器上面是不支持 SSL 的,所以在那些旧的 浏览器上就无法达成 https 的联机啦!

HTTPS引用

   CA证书:该技术通常向用户传送公钥,使用的分发机制称为证书。通常证书颁发机构(CA)对证书进行签名,以便确认公钥来自声称发送公钥的主体。

原理如图所示:

122515407.png

 

那么CA要经过一个怎样的过程来实现验证类?

(1)甲将一个签名的证书请求(包含他的名字、公钥、可能还有其他一些信息)发送到CA。

(2)CA使用甲的请求创建一个消息,CA使用其私钥对消息进行签名,将消息和签名返回给甲,消息和签名共同构成了甲的证书。

(3)甲将证书发送给乙,以便授权乙访问甲的公钥。

(4)乙使用CA的公钥对证书签名进行验证,如果证明签名是有效的,乙就承认证书中的公钥是甲的公钥。

 

 

案例:如果要实现站点安全,使用https这个安全协议在客户端和web服务器端实现站点的安全,我们怎么做呐?

先来redhat linux 5.4 搭建web 服务器,并且实现安全验证机制 openssl windows 证书服务。

拓扑图:(规划方案)

 

122718770.png

案例实现环境: redhat 5.4 httpd-2.2.3 mod-ssl

 

      /etc/httpd/conf.d/ssl.conf mode_ssl 提供的 Apache 配置文件;     

      /etc/pki/tls/private/localhost.key :系统私钥文件,可以用来制作凭证的! 

      /etc/pki/tls/certs/localhost.crt :就是加密过的凭证档!(signed certificate) 

 

接下来我们来到linux机器上,查看是否安装了openssl 这个服务。

[root@Blue ~]# rpm -qa |grep openssl

openssl-devel-0.9.8e-12.el5

openssl-0.9.8e-12.el5

[root@Blue ~]# rpm -ql openssl |less

122722983.png

SSL可以实现对称加密、 非对称加密。

    可以实现对文件产生MD5sha 摘要 ,还可以实现数字证书。

那么先来认识针对文件做的摘要。

[root@Blue ~]# mkdir abc#为实验新建一文件夹,方便查找#

[root@Blue ~]# cd abc

[root@Blue abc]# cp /etc/inittab ./#拷贝一文件到该目录#

[root@Blue abc]# openssl md5 inittab #对文件做摘要#

MD5(inittab)= 9d49303d50eb59151fc24eb0e3802232

修改一下该文件,这时摘要就会完全不一样。

[root@Blue abc]# openssl md5 inittab 

MD5(inittab)= fb55c35bcf843413fcebee681ff15611

这是实现摘要,下面是实现信息的摘要:

[root@Blue abc]# echo "182380" |openssl sha

0e05262c352448874aec02e004aa151fb3dea192

[root@Blue abc]# echo "182380" |openssl md5

1408821cc2b9a1a42dd0188ffddbd7b6

 

那么我们怎么来实现加密类:

[root@Blue abc]# useradd Blue1#为实现对加密的解释我们先来建#

#两个新用户

[root@Blue abc]# useradd Blue2

[root@Blue abc]# echo "123" |passwd  --stdin Blue1#给用户指定密码#

Changing password for user Blue1.

passwd: all authentication tokens updated successfully.

[root@Blue abc]# echo "123" |passwd  --stdin Blue2

Changing password for user Blue2.

passwd: all authentication tokens updated successfully.

我们看一下这两个用户的密码一样,那么加密过后的密文也应该一样。

[root@Blue abc]# grep Blue /etc/shadow

Blue1:$1$co3RLWNr$BJ5SbikuBO7RB3ILeLgDl/:15941:0:99999:7:::

Blue2:$1$z8fY/31C$uwZitsqO.v6II.zMt5IDc.:15941:0:99999:7:::

这里可以看出前部分不一样,这是因为salt值得不一样。

[root@Blue abc]# openssl passwd -1 -salt 123456

Password:                                       #密码是一样的但salt值不一样#

$1$123456$wWKtx7yY/RnLiPN.KaX.z.

具体用法我们还可以使用man手册帮助:

[root@Blue abc]# man enc

[root@Blue abc]# openssl des3 -in inittab -out f1            #des3加密该文件并输

                                                     出密钥到f1文件#

enter des-ede3-cbc encryption password:

Verifying - enter des-ede3-cbc encryption password:

[root@Blue abc]# vi f1                                 #看到是一堆乱码#

[root@Blue abc]# openssl des3 -a -in inittab -out f2           #这里加了一个-a参数#

enter des-ede3-cbc encryption password:

Verifying - enter des-ede3-cbc encryption password:

[root@Blue abc]# vim f2                            #可以查看到加密的文件内容#

接下来解密:

[root@Blue abc]# openssl des3 -a -d -in f2 -out blue1      #解密到blue1文件中#

enter des-ede3-cbc decryption password:                 #输入对应密钥#

[root@Blue abc]# vim blue1                           #可以看到解密后的是inittab文件的内容#

下面查看rsa 非对称加密算法用法:

[root@Blue abc]# openssl rsa --help

这里我们可以看到必须产生密钥对。

[root@Blue abc]# openssl genrsa 1024                 #产生1024 位的私钥#

Generating RSA private key, 1024 bit long modulus

........++++++

..................................++++++

e is 65537 (0x10001)

-----BEGIN RSA PRIVATE KEY-----

MIICXAIBAAKBgQCr8C2UP9P8BQPQVphUX7i4n67kQokCtH8aLHl6d3CdC9whVlF/

U35FuztnOxM/wx4vl9SsHxI8+pDqpT3AU3kuRb6nwjv5CVgT7qPUZXPiEGNRM/HG

QQVXXBmGJeR78FrwyIIS/WYnVY8VxKVoFvTrv1ZmO1XVU3/5kGV9gXgPOwIDAQAB

AoGAH8dflUQK2UzP/KTUuNuMV8tj1tqZWj+kMmE//quuy8gSYrMCkycKcrb9bsIT

d7iHjsJgU4PWqiChwkzSUgbboa0CvhcsUEImswW+V/CNbd6g/98SYqmegv7ylBJm

s/Sr6JEzw4VRO7mVQXJBimunrfoW+xVKkzHxYOFvbHuteykCQQDjSXPTCViy4tfi

rByp0eBIrXYS2NBWq14OQcf+JKRJY15wDZmzVi1+cJu+Kk0u7RCdZmWe0/krpv2z

IRt41Ip9AkEAwai56BaNAtn6alMb9D5vK405qV28vzvYLUikVF5ibvFfz5/Y5jU8

HxTxyF4NYFM6jxN2TXjeHDYrNYnqpNJ2FwJASwHmk3K2LvLlxAyAuRpmJhX4rWeX

+cI8HABhe+GjxgRhGiGi46hBA0UuYKedKStbHFa6mpvh0yIc/4yhgFLEEQJBAKCb

nhKtISVMQjIL2xMk9G3aIggkhXTT3OUxaZfO7zOzWxKGLww8+i+M3zidR9qrK9Wc

/nAh3ZLoGc29I6yuHuECQC5VsRVP+jME3eQC57LAkYzpvkRJdJNDm8AvWmIJe3k9

9474iioa5KkK2hwAMNFrAx2XIj+FLPleT+f3igahGTs=

-----END RSA PRIVATE KEY-----

那么公钥在哪里类?

如果让私钥输出到比较安全的文件里,怎莫办?

[root@Blue abc]# openssl genrsa 1024 > key.pem   #这就输出到当前目录下key.pem#

-rw-r--r-- 1 root root  887 Aug 24 16:20 key.pem   #这是私钥应该别人无法读写#

[root@Blue abc]# chmod 600 key.pem

-rw------- 1 root root  887 Aug 24 16:20 key.pem

公钥可以在私钥里提取

[root@Blue abc]# openssl rsa --help

-pubout         output a public key          #有这莫一参数提取公钥#

[root@Blue abc]# openssl rsa -in key.pem -pubout  -out pubkey.pem

writing RSA key

有了公钥、私钥对了,我们来实现CA证书:语法:

#openssl ca -in  请求文件  -out  证书

CA证书 server ip192.168.1.120  web server ip192.168.1.120

实现证书我们得修改文件来实现:

[root@Blue CA]# cd /etc/pki

[root@Blue pki]# vim tls/openssl.cnf

122732417.png

我们先来建立目录和文件:

[root@Blue CA]# mkdir certs newcerts crl

[root@Blue CA]# touch index.txt serial

serial 文件一个初始值:

[root@Blue CA]# echo "1"> serial

我们必须先产生私钥后才能有证书:

[root@Blue CA]# openssl genrsa 1024 > private/cakey.pem  #输出到配置文件要求目录#

[root@Blue CA]# chmod 600 private/cakey.pem           #修改权限,别人不能读取#

发出请求(实体是需要请求的、而一个个体、根CA就不需要了)

如果想要申请证书:我们得来修改下配置文件:

[root@Blue ~]# vim /etc/pki/tls/openssl.cnf 

122736394.png

这样颁发证书不只是在这个单元里.

下面是为证书设置颁布机构信息:

122744132.png

现在用命令给自己颁发证书:

[root@Blue CA]# openssl req -new -key private/cakey.pem -x509 证书格式-out cacert.pem

122748108.png

我们的证书已经建好了,接下来我们去web server 服务器上添加mod_ssl 模块。

先查看是否安装:

[root@Blue Server]# ll mod_ssl-2.2.3-31.el5.i386.rpm 

-r--r--r-- 86 root root 90402 Jul 28  2009 mod_ssl-2.2.3-31.el5.i386.rpm

[root@Blue Server]# rpm -qa |grep mod_ssl

还没有安装:来安装这个模块:

[root@Blue Server]# rpm -ivh mod_ssl-2.2.3-31.el5.i386.rpm    #看到存在依赖关系#

warning: mod_ssl-2.2.3-31.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186

error: Failed dependencies:

libdistcache.so.1 is needed by mod_ssl-2.2.3-31.el5.i386

libnal.so.1 is needed by mod_ssl-2.2.3-31.el5.i386

[root@Blue Server]# ll |grep distcache                        #查找依赖文件#

-r--r--r-- 327 root root   122429 Jan 19  2007 distcache-1.4.5-14.1.i386.rpm

-r--r--r-- 327 root root    59183 Jan 19  2007 distcache-devel-1.4.5-14.1.i386.rpm

[root@Blue Server]# rpm -ivh distcache-1.4.5-14.1.i386.rpm 

warning: distcache-1.4.5-14.1.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186

Preparing...                ########################################### [100%]

   1:distcache              ########################################### [100%]

现在再次安装:

[root@Blue Server]# rpm -ivh mod_ssl-2.2.3-31.el5.i386.rpm 

warning: mod_ssl-2.2.3-31.el5.i386.rpm: Header V3 DSA signature: NOKEY, key ID 37017186

Preparing...                ########################################### [100%]

   1:mod_ssl                ########################################### [100%]

安装成功。

查看形成的目录:

[root@Blue Server]# rpm -ql mod_ssl |less 

122751357.png

现在建立自己的私钥:

[root@Blue certs]# openssl genrsa 1024 >httpd.key

[root@Blue certs]# chmod 600 httpd.key

再来建立请求文件:

[root@Blue certs]# openssl req -new -key httpd.key -out httpd.req

按提示和需要填写内容。

再来利用CA给我们请求文件签发证书。

[root@Blue certs]# openssl ca -in httpd.req -out httpd.cert

122813541.png

查看一下CA证书下的index.txt文件

[root@Blue CA]# cat index.txt

V140824104443Z01unknown/C=CN/ST=HENAN/O=Blue/OU=tec/CN=www.blue.com/emailAddress=tomorrowsilence@126.com

下面查看并修改一下ssl.cnf文件内容:

[root@Blue CA]# vim /etc/httpd/conf.d/ssl.conf

 

112 SSLCertificateFile /etc/httpd/certs/httpd.cert       #证书存放目录#

119 SSLCertificateKeyFile /etc/httpd/certs/httpd.key  #指明私钥名#

 

配置完成后重启服务器.

[root@Blue CA]# service httpd restart

能重启就说明我们配置应该是no problem !我们也可以深入查看下日志。

查看下关于httpd服务的端口情况:

[root@Blue CA]# netstart -tupln |grep httpd

-bash: netstart: command not found

[root@Blue CA]# netstat -tupln |grep httpd

tcp        0      0 :::80                       :::*                        LISTEN      5561/httpd          

tcp        0      0 :::443                     :::*                        LISTEN      5561/httpd

看到都起来了端口80443,我们来验证一下。

122825857.png

颁发机构不信任:那么我们怎样做才能得到windows信任呐?

在窗口搜索栏中键入“mmc”进入操作控制台选项,添加和删除程序 ,添加证书服务。

122845104.png

让后在证书选项可以看到可多选项:

122908196.png

可见只要我们把自己的证书添加到受信任的根证书颁发机构添加我们自己的机构,应该就行了。

那么我们得首先添加证书链:怎么添加?这个得修改那个ssl.conf文件:

[root@Blue CA]# vim /etc/httpd/conf.d/ssl.conf

128 SSLCertificateChainFile /etc/pki/CA/cacert.pem#证书链的路径#

重启服务。

 

现在再来访问一次:出现一个我们自己颁发机构的信息,询问我们是否安装此证书?

122913149.png

我们把这个证书安装上看看....

安装完成。

现在我们再来测试一下:

122916996.png

我们只需点y,就进入验证界面:输入账号后就可以浏览网页了。

那么我们想用我们的域名来访问网站应该怎么来做类?

可能我们会想到用DNS 作域名解析,这里我们就不用了 ,直接在hosts文件修改添加

192.168.1.120   www.blue.com    保存退出。

然后就可以访问了。

122927102.png

输入用户名密码,就可访问。

122934127.png