https会话建立的过程
http与https都是基于TCP协议的,所以得先三次握手,确保对方的主机在线。三次握手成功之后,客户端和服务器端就可以建立SSL会话了。而建立SSL会话首先应该协商单向加密算法、对称算法、公钥加密算法,并选择双方都支持的算法,选择完成之后,Server发送自己的证书给客户端。客户端对证书验证完成之后如果发现没有问题,客户端会生成一个对称密钥(可能是随机的)并将其使用Server的公钥加密发送给服务器端,而Server将Client发送的对称密钥使用自己的私钥解密,接下来就可以使用对称密钥加密Client请求的内容并传送给客户端了,所以SSL会话就建立了。
在三次握手建立完成之后进行协商SSL,这个SSL的建立与主机名无关,因为两台主机之间的通信靠的是IP和端口,因此两台主机通信没办法基于主机名作区分。这就意味着,若服务器只有一个IP地址,即若当前主机实现了基于域名的虚拟主机,那么它只能为一个虚拟主机提供SSL功能,即SSL会话仅能基于IP地址进行。
https的实现
- 安装SSL模块
要想让Web服务器能够支持SSL的功能,第一步得安装SSL模块
查看模块:
可发现没有SSL模块,因此需要安装:
生成的/etc/httpd/conf.d/ssl.conf会作为主配置文件的一部分,因此需要重启才能生效。
一般来讲,SSL新增了端口,而只要涉及到新端口(套接字)的话,必须得重启或重新装载才能生效。
/var/cache/mod_ssl:SSL会话的缓存数据
- 提供CA
首先CA自签证书,然后服务器生成一段密钥,把公钥发送给CA服务器,让CA实现签名。
生成自签证书:
生成私钥:
修改默认配置:
certs:生成的证书放置的目录;
crl:证书吊销列表放置的目录
new_certs_dir:新签的证书;
index.txt:记录签署的证书及证书名称等索引信息;
serial:序列号;
之所以在/etc/pki/CA目录下,是因为生成的证书默认在此目录下,为了不修改目录,而且名称就叫cacert.pem,因此使用此目录。
cacert.pem
cakey.pem:私钥,在private目录下;
生成自签证书
创建文件:
- Web Server服务器端,生成一对密钥,将公钥保证成证书签署请求发送给CA服务器
注意:信息需要与CA保持一致,但hostname为需要使用证书的那一个虚拟主机的主机名。
- CA服务器签署证书
- 将Web Server服务器的证书复制至Web服务器
删除CA服务器的server服务器的证书颁发请求,避免被窃取:
- 配置Web服务器使用此证书
备份配置文件:
配置文件内容:
<VirtualHost _default_:443>:监听在443端口的虚拟主机;若有多个IP地址,这个虚拟主机应该监听在某一特定地址上;
修改如下:
DocumentRoot:需要与对应的虚拟主机的DocumentRoot保持一致;
SSLEngine:是否启用SSL功能,需要为on;
SSLProtocol:支持的SSL协议,all -SSLv2表示不使用SSLv2,那就只有SSLv3或TLSv1了。
SSLCipherSuite:加密机制,加密套件,ALL所有的但不包括ADH,不使用SSLv2
SSLCertificateFile:证书文件的位置;
SSLCertificateKeyFile:私钥文件的位置;
- Windows客户端测试
出现上述提示是因为对于颁发这个证书的机构,我们客户端未表示信任
因此需要将证书发送给Windows客户端(使用ftp传输工具即可),并命名为*.crt,双击安装即可。
在浏览器中查看证书:
需要再次强调的是,请求的URL名称(即主机名称)一定要与证书服务器的名称保持一致。此外,一个地址上只能建立一个虚拟主机。