HTTPS的实现过程
HTTPS(Hypertext Transfer Protocol over Secure Socket Layer:是一种加密的http协议,但是他和http是两个不同的协议。它基于tcp协议,工作在443端口上。
https的工作原理,大概是这样子的:
在实现这个过程中,需要创建CA,然后apache服务器生成证书请求,CA在为我们的apache服务器签署证书请求并颁发证书,接着CA将自己的自签证书发送给客户端,这样客户端就可以使用这个自签证书来验证服务器端的证书的合法性了。
说明:CA颁发机构和apache服务器可以在同一台主机上面创建,这里我是将他们在两台主机上面创建的。CA所在的主机为192.168.0.104,apache所在的主机为192.168.0.103。
192.168.0.104主机上的配置(即CA主机)
1、创建私钥CA(这个是在单独的一台机器创建的,我将CA和apache服务器分开了)
(1)、生成一对密钥
生成私钥
#(umask 770;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
(2)、生成自签证书
# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
当然这样创建完成之后,还要创建一些目录和文件,certscrl,newcerts,index.txt,serial这些文件都位于/etc/pki/CA目录下的,因此为了防止出错,建议修改/etc/pki/tls/openssl.cnf中的参数,将CA的路径修改为如下配置
dir = /etc/pki/CA
#mkdir crl certs newcrts -pv
# touch index.txt serial
# echo 01 > serial
这样一个自签证书就创建完成了。
192.168.0.103主机上的配置(即apache主机)
2、创建完成之后,就可以为客户端颁发证书了(这里apache主机相当于CA的客户端)
(1)、在客户端上面生成一对密钥(创建私钥)
# (umask 077;openssl genrsa -out /etc/pki/CA/private/httpd.key 1024)
(2)、生成证书颁发请求
# openssl req -new -key /etc/pki/CA/private/httpd.key -out /etc/pki/CA/httpd.csr
注意:在这个创建过程中将会出现一个交互信息界面,这个界面的内容要和在创建自签证书的内容一致。并且在填写主机名时,一定要填写的是httpd服务器的主机名,否则会出错。
如:创建过程中会出现如下类型信息
Common Name (eg, your name or your server's hostname) []:www.xsl.com
这里www.xsl.com就是我们httpd服务器的主机名
(3)、将客户端生产的证书请求发给CA来签署
使用如下命令将证书请求发给CA主机(即192.168.0.104主机)
# scp /etc/pki/CA/httpd.csr 192.168.0.104:/tmp/
3、CA签署这个客户端证书请求,并颁发证书(CA主机上的配置)
# openssl ca -in /tmp/httpd.csr -out /tmp/httpd.crt -days 3650
将生成的证书在发给客户端(Apache服务器)
使用如下命令将生成的证书发给客户端:
# scp /tmp/httd.crt 192.168.0.103:/etc/httpd/ssl/
证书请求签署完成之后,CA主机上/etc/pki/CA目录下的index.txt和serial、newcerts文件都会发生改变。
4、在apache主机上安装mod_ssl软件
虽然在apache服务器上生成了一个证书,但是想要支持https功能,必须要安装一个模块为mod_ssl。安装完成之后,就会生成一个/etc/httpd/conf.d/ssl.conf的文件,这个文件将会是httpd的主配置文件的一部分。在这个文件我们需要修改几个参数:
<VirtualHost 192.168.0.103:443> #这个就是我们要访问的虚拟主机中的主机名所对应的ip地址
servername www.xsl.com #指定主机名
DocumentRoot '/www/xsl/com #指定站点根目录,这个要和apache上的DocumentRoot保持一致
SSLEngine on #这个表示开启ssl功能
SSLCertificateFile /etc/httpd/ssl/httpd.crt #指定证书路径
SSLCertificateKeyFile /etc/pki/CA/private/httpd.key #指定私钥文件路径
</VirtualHost>
在这里补充说一点,由于ssl会话是根据ip来进行的,而不是根据主机名来进行的,因此,对于有多个基于主机名的虚拟主机来说,他们其中只有一个基于主机名的虚拟主机才可以使用https功能。
5、将CA自签证书导入window浏览器中,验证服务器端证书的合法性
最后将CA生成的自签证书导入到window的浏览器中即可(需要将CA自签证书的后缀改为.crt格式再导入),这样就可以使用https来访问页面了。