为Apache添加SSL模块
一、相关知识介绍:
有时候在使用一个WEB应用的时候,为了让HTTP的传输更加的安全,那就要用到SSL(Security Socket Layer 安全套接层)协议,也就是用HTTPS来访问。
在介绍之前来简单的说说对称加密和非对称加密:
对称加密:在对称加密算法中,加密的双方都持有一个相同的密钥,用这个密钥来加密和解密。由于在加密和解密的过程中使用同一种密钥,所以称其为对称加密算法。
非对称加密:在非对称加密算法中,引进了公钥和私钥这两个概念。公钥:就是大家都知道的,可以加密,也可以解密。私钥:只有私钥持有人才知道的,不能公布于从的一个密钥。公钥和私钥是成对出现的,单独的一个是没有任何意义的,而且不能由一个摧算出另一个。用公钥加密的数据可以用私钥来解密,这就实现了数据的加密;同样用私钥加密的数据,也只有用公钥才能解密,这实现了身份验证。
HTTPS的原理大致是这样的:客户端在通过https访问网站的时候,WEB服务器会给客户机自己的公钥(也就是下面要说的server.crt),然后客户机就会随机的产生一个对称的密钥,之后,再用刚才这个公钥来给对称密钥来加密,最后,再把这个加了密的对称密钥发给服务器,服务器在接收到这个加密了的对称密钥后,用自己的私钥来解密,这样服务器也得到了这个对称密钥。当客户机有请求要发给服务器的时候,或是服务器在给客户机发数据的时候,都用这个对称密钥来加密所传输的数据。这样安全性就大提高了。如下图所示:
由上可以看出,HTTPS中先是使用非对称加密算法,把对称的密钥给传到服务器端,然后再用这个对称的密钥来对要传输的数据进行加密的!
二、安装Apache并让其支持SSL,在安装之前还是要把apr和apr-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
然后再输入一次密码,接下来你再重启服务的时候就不会让你手工输入密码了!