Linux里HTTP实现为HTTPS
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux里HTTP实现为HTTPS相关的知识,希望对你有一定的参考价值。
HTTP即超文本传输协议(Hypertext Transfer Protocol)。
这是一个文件的传输协议,我们上网的时候,所有的文件都是通过HTTP这个协议,从服务器上传输到客户端的电脑里面的。同时HTTP协议工作在应用层,所以想要运行这个协议必须有相应的应用程序支撑。
这里我们就先了解下什么是客户端,什么是服务端
客户端:通常是指我们的浏览器,比如谷歌浏览器、火狐浏览器、IE等,浏览器安装在客户使用的电脑上,所以,在描述http时,客户端通常也代指那些安装了浏览器的电脑。
服务端:通常是指那些安装了web服务软件的计算机,如httpd apache,nginx,lighttpd,这些服务端的计算机被称为服务器。
当我们从客户端到服务端拉取文件时,这些服务器就会根据你的请求命令给你返回你所需要的资源。而这些资源在传输过程中都会以静态的html格式文件传输,同时它的传输方式是明文的。这样的传输方式就会使你的一些重要信息被一些有心人截取下来,所以基于http的传输方式并不是安全的。
这就使HTTPS得以出现
HTTPS(全称:httpover ssl,Hyper Text Transfer Protocol over Secure Socket Layer),它是以安全为目标的HTTP通道,简单讲就是HTTP的安全版。即在HTTP下加入了SSL子层,HTTPS的安全基础是SSL。SSL会使用各种对称加密算法、非对称加密算法来加密传送数据,HTTPS和SSL支持使用X.509数字认证,它提供了通信双方的身份验证,保证客户端到服务器端的通信都在被保护起来。所以有了这些就使得数据的传输得到了安全保障。
通过SSL建立会话的过程需要以下几步:
1、客户端与服务端交换协议版本号
2、选择双方都支持的加密方式,并向服务器请求证书
3、服务器端发送证书以及选定的加密方式给客户端
4、客户端取得证书并进行证书验证
客户端接收到证书后,执行以下五步:
(a) 验证证书来源的合法性;用CA的公钥解密证书上数字签名
(b) 验证证书的内容的合法性:完整性验证
(c) 检查证书的有效期限
(d) 检查证书是否被吊销
(e) 证书中拥有者的名字,与访问的目标主机要一致
4、客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密,将此数据发送给服务端,完成秘钥交换
5、服务端用此密钥加密用户请求的资源,响应给客户端
HTTPS的实现
1、http想实现为https 就需要为配置ssl,及其使用的证书。这些在http里有专门的mod_ssl模块来支持。
yum -y install mod_ssl #安装mod_ssl模块
安装该模块后,它会自动修改配置文件,增加LoadModule ssl_module modules/mod_ssl.so在httpd的子配置文件/etc/httpd/conf.d/ssl.conf里,同时也打开了443端口,同时指定了证书的存放路径。
原因是安装的时候,安装包里会有脚本去生成私钥文件/etc/pki/tls/private/localhost.key,同时也生成证书文件/etc/pki/tls/certs/localhost.crt,而这个证书文件是自签名的,此时https网站已经可以访问,但是由于这个https服务器的证书有问题,颁发给的机构不对,不是对应的站点名称。所以需要要重新向CA申请,在获取CA颁发的证书后才能正确使用https站点。
2、申请CA证书
要生成证书就需要为服务端生成私钥,并用它来为其提供证书文件;
mkdir /etc/httpd/ssl && cd /etc/httpd/ssl #建立目录存放私钥文件
(umask 077; openssl genrsa -out httpd.key 1024) #生成1024位的私钥
openssl req -new -key httpd.key -out httpd.csr #用此私钥生成签署证书文件,并把生成的文件提交给CA机构进行证书的签署
注意:证书里的国家、省份等名称要与根CA的名称保持一致,而主机服务名一定要写将来对外提供Web服务的服务名称
3、CA签证
CA签发完成后,根CA会把服务器的证书再传给服务器,同时把根的证书cacert.pem也一起发给服务器服务器。
签署后的证书为:/etc/httpd/ssl/httpd.crt
CA的根证书为:/etc/httpd/ssl/cacert.pem
4、修改配置文件:/etc/httpd/conf.d/ssl.conf 需要修改的就是下面这几项
DocumentRoot /var/www/html #指明共享文件的根目录,这个目录会覆盖/etc/httpd/conf/http.conf里的设置
ServerName www.Webname.com #指明这个Web网站服务器的名字
SSLCertificateFile /etc/httpd/ssl/httpd.crt #指明证书存放的位置
SSLCertificateKey /etc/httpd/ssl/httpd.key #指明私钥文件的存放位置
SSLCACertificateFile /etc/httpd/ssl/cacert.pem #指明根证书的存放位置
5、重新加载配置
service httpd reload #重载配置文件
6、测试是否配置成功
测试命令:
openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
例:openssl s_client -connect HostIP:443 #如果出现证书文件内容,则说明https已经搭建成功
这里的HostIP也可以写成你的服务器域名,前提是你的域名已经在DNS服务器上做过域名解析了。
7、http重定向到https
重定向就是将http 请求转发至https 的URL。一般用户在向Web服务器请求文件时不会专门记这个网站是否为加密网站。所以就需要在服务端自动的将用户的http请求转换为https请求。
这里建议将http和https的主站点设置为同一个站点。因为跳转会将设置目录下的所有http请求进行跳转,如果https没有http站点的目录,比如http默认主站点是/var/www/html/,但是https下的主站点是/var/www/https,而且没有/var/www/https/web这个站点,当有请求去请求这个/var/www/https/web页面时,则跳转会显示网页不存在而导致网页打不开。
重定向:
(1)基于redirect进行跳转
基于redirect的跳转需要服务器内配置跳转文件,并指明跳转的路径。
redirect的语法格式:
redirect [status] URL-path URL
status 的两个状态:
Permanent:Returns a permanent redirect status(301) indicating that the resource has moved permanently(永久跳转)
Temp:Returns a temporary redirect status (302).This is the default(临时跳转)
例:vim /etc/httpd/conf.d/redirect.conf
redirect Permanent /var/www/html https://www.Webname.com #添加一条跳转路径,指明跳转后的根目录
(2)基于HSTS跳转
目前主流都是采用HSTS(HTTP StrictTransport Security)技术进行跳转。服务器端配置支持HSTS后,会在给浏览器返回的HTTP首部中携带HSTS字段。浏览器获取到该信息后,会将所有HTTP访问请求在内部做重写307 跳转到HTTPS。而无需任何网络过程。当客户端第一次发http请求过来,服务器端响应https的结果给客户端,客户端会把这个响应缓存下来,下次客户端浏览器再次访问的时候,在浏览器端自动会将http转换为https,然后以https发请求给服务器。HSTS可以很大程度上解决SSL剥离攻击,因为只要浏览器曾经与服务器创建过一次安全连接,之后浏览器会强制使用HTTPS,即使链接被换成了HTTP。
HSTS preload list
HSTS preload list是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换为HTTPS。Firefox、Safari、Edge浏览器也会采用这个列表。这个是在浏览器内配置的,所以是要网站向各浏览器服务商申请,浏览器才会支持的。
配置HSTS转发:
vim /etc/httpd/conf/httpd.conf
Header always set Strict-Transport-Security "max-age=63072000" #告诉浏览器下次需要用https进行访问,这个信息的失效时间为两年
RewriteEngine on #打开重写引擎
RewriteRule ^(/.*)$ https://%{HTTP_HOST}$1 [redirect=301] #定义重写规则
最后,修改完成后不要忘了重新加载配置。
以上是关于Linux里HTTP实现为HTTPS的主要内容,如果未能解决你的问题,请参考以下文章