Apache添加SSL模块

一、相关知识介绍:

有时候在使用一个WEB应用的时候,为了让HTTP的传输更加的安全,那就要用到SSL(Security Socket Layer  安全套接层)协议,也就是用HTTPS来访问。

在介绍之前来简单的说说对称加密和非对称加密:

对称加密:在对称加密算法中,加密的双方都持有一个相同的密钥,用这个密钥来加密和解密。由于在加密和解密的过程中使用同一种密钥,所以称其为对称加密算法。

非对称加密:在非对称加密算法中,引进了公钥和私钥这两个概念。公钥:就是大家都知道的,可以加密,也可以解密。私钥:只有私钥持有人才知道的,不能公布于从的一个密钥。公钥和私钥是成对出现的,单独的一个是没有任何意义的,而且不能由一个摧算出另一个。用公钥加密的数据可以用私钥来解密,这就实现了数据的加密;同样用私钥加密的数据,也只有用公钥才能解密,这实现了身份验证。

HTTPS的原理大致是这样的:客户端在通过https访问网站的时候,WEB服务器会给客户机自己的公钥(也就是下面要说的server.crt,然后客户机就会随机的产生一个对称的密钥,之后,再用刚才这个公钥来给对称密钥来加密,最后,再把这个加了密的对称密钥发给服务器,服务器在接收到这个加密了的对称密钥后,用自己的私钥来解密,这样服务器也得到了这个对称密钥。当客户机有请求要发给服务器的时候,或是服务器在给客户机发数据的时候,都用这个对称密钥来加密所传输的数据。这样安全性就大提高了。如下图所示:

 

由上可以看出,HTTPS中先是使用非对称加密算法,把对称的密钥给传到服务器端,然后再用这个对称的密钥来对要传输的数据进行加密的!

二、安装Apache并让其支持SSL,在安装之前还是要把aprapr-util这两个给安装上:

         1、安装apr:

                   # ./configure –prefix=/usr/local/apr

                   # make && make install

         2、安装apr-util:

                   # ./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr/

                   # make && make install

         3、安装apache:

         #       ./configure –prefix=/usr/local/apache –enable-modules=most –enable-mods-shared=all –with-apr=/usr/local/apr/ --with-apr-util=/usr/local/apr-util/

         # make && make install

注:这里的—enable-modules=most 是将大部分的模块静态的编译到httpd二进制文件中,

--enable-mods-shared=all 是让apache动态的加载所有的模块,如果去掉shared的话,那就是静态加载所有的模块。

当然你不用这两个参数也可以,用—enable-ssl,但是这样做的话,如果以后要添加新的模块的话,有点麻烦。

         4、安装oenssl

                   openssl众多的密码算法、公钥基础设施标准以及SSL协议。更多的信息请百度,这写不下了。

# ./config            //注意看清楚哦,这里是config不是configure

# make && make install

三、为服务器生成私钥(server.key)和公钥(server.crt:

1、用openssl命令为服务器生成server.key私钥:

                  [root@ns openssl-1.0.0e]# cd /usr/local/ssl/bin/

                  [root@ns bin]# ./openssl  genrsa  -des3  -out  server.key

                  Generating RSA private key, 512 bit long modulus

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

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

                  e is 65537 (0x10001)

                  Enter pass phrase for server.key:

                  Verifying - Enter pass phrase for server.key:

                  [root@ns bin]#

                  注:这里的默认长度是512位的密码,自己还可以在后面加上个长度如1024,并且最后还会让你输入一个私钥的保护密码。防止私钥被盗后,被人乱用。

 

2、用刚才的私钥给服务器生成一个证书申请文件server.csr

                  [root@ns bin]# ./openssl  req  -new  -key  server.key  -out  server.csr

                  Enter pass phrase for server.key:

                  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) [AU]:CN   //输入国家代码中国CN

                  State or Province Name (full name) [Some-State]:SHANGHAI         //省份名称

                  Locality Name (eg, city) []:SHANGHAI              //城市名称

                  Organization Name (eg, company) [Internet Widgits Pty Ltd]:.      //组织名称,也可填公司名,我这没有填。

                  Organizational Unit Name (eg, section) []:xfzhou.com            //单位名称,

                  Common Name (eg, YOUR name) []:xfzhou.com    //这个填的要与ServerName一样

                  Email Address []:admin@xfzhou.com     //联系的邮件地址

                  Please enter the following 'extra' attributes

                  to be sent with your certificate request

                  A challenge password []:123456     //这个密码有人说不填,但是,我这填了也没有用到。

                  An optional company name []:xfzhou.com      //还是公司名称。

                  [root@ns bin]#

        

3、用前面两步生成的私钥(server.key)文件和证书申请文件(server.csr)来给服务器申请证书:

                  [root@ns bin]# ./openssl x509 -req -days 3650 -in server.csr -signkey server.key -out             server.crt

                  Signature ok

subject=/C=CN/ST=SHANGHAI/L=SHANGHAI/OU=xfzhou.com/CN=xfzhou.com/emailAddress=admin@xfzhou.com

                  Getting Private key

                  Enter pass phrase for server.key:             //输入私钥的保护密码

                  [root@ns bin]# ls

                  c_rehash  openssl  server.crt  server.csr  server.key

                  [root@ns bin]#

4、再把上面生成的私钥文件和证书(公钥)文件CP/usr/local/apache/conf/目录下面:

                  [root@ns bin]# cp ./server.key /usr/local/apache/conf/

                  [root@ns bin]# cp ./server.crt /usr/local/apache/conf/

 

四、修改/usr/local/apache/conf/httpd.conf,启用SSL模块,并启动HTTPD服务:

         # vi /usr/local/apache/conf/httpd.conf

         LoadModule socache_shmcb_module modules/mod_socache_shmcb.so //这个模块也要加载,否则启动不了。

         LoadModule ssl_module modules/mod_ssl.so

         Include conf/extra/httpd-ssl.conf  //找到这三行然后把注释给去掉。

         [root@ns bin]# /usr/local/apache/bin/apachectl start

         Apache/2.4.3 mod_ssl (Pass Phrase Dialog)

         Some of your private key files are encrypted for security reasons.

         In order to read them you have to provide the pass phrases.

         Server www.example.com:443 (RSA)

         Enter pass phrase:  //这里输入的是那个第一次创建的那server.key的密码。

         OK: Pass Phrase Dialog successful.

         [root@ns bin]# netstat -anpt| grep httpd

         tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      14242/httpd        

         tcp        0      0 0.0.0.0:443                 0.0.0.0:*                   LISTEN      14242/httpd        

         [root@ns bin]#

若你的某个web服务器上运行了多个网站,某个网站比如说后台管理的网站可能需要htts加密传输,但是前台的不需要,如果遇到这样的问题,你就可以把你的网站的后台管理的页面用HTTPS来访问,具体做法是把网站的后台管理的根目录放到httpd-ssl.conf文件中的虚拟主机中。

五、验证:

1、在浏览器中直接输入发现是可以访问的如下图:

 

2、用访问的时候如下,会出现证书错误的警告:

 

 

点击继续浏览,就可以看到网站的内容了,如下:

再点击下“证书错误”——“查看证书”就可以看到证书了。如下:

发现一个问题,就是在启动apache的时候每次都会让你输入密码,这样会很麻烦的,要是你的服务器重启了,那么你就必须要手工输入密码你的网站才会起来。。

 

下面给出了一个解决办法:

/usr/local/apache/conf/目录下创建一个sendsslpwd的文件。内容如下:

[root@ns conf]# cat sendsslpwd

#!/bin/bash

sslpwd='xfzhou'                 //这个就是私钥的保护密码

echo $sslpwd

[root@ns conf]#

 

再来修改下httpd-ssl.conf这个文件:

找到 SSLPassPhraseDialog builtin 这一行,将其注释掉

加入 SSLPassPhraseDialog exec:/usr/local/apache2/conf/sendsslpwd

这样,每次启动将不会提示输入SSL密码了如下:

[root@ns conf]#

[root@ns conf]# /usr/local/apache/bin/apachectl stop

[root@ns conf]# /usr/local/apache/bin/apachectl start

[root@ns conf]#

 还有一种解决办法就是执行下面的这个命令:

# openssl  rsa -in server.key -out server.key

然后再输入一次密码,接下来你再重启服务的时候就不会让你手工输入密码了!