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的主要内容,如果未能解决你的问题,请参考以下文章

HTTPS实现原理

IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS

nginx 1.11.0实现http和https正向代理

Apache 反向代理实现为http添加https的外衣

快速安装Tomcat 并实现HTTPS访问

RHEL 7配置HAProxy实现Web负载均衡