在如今网络安全越来越被大众所重视,笔者虽然了解过 HTTPS 加密协议,但却还没有在自己服务器上部署过,趁着假期,在自己的机器上实践了一番

一、HTTPS 背景

1.什么是 HTTPS ?

HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版。即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL, 它是一个URI scheme(抽象标识符体系),句法类同 HTTP: 体系,用于安全的 HTTP 数据传输。

HTTPS:URL 表明它使用了 HTTP ,但 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP 与 TCP 之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器 Netscape Navigator 中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

2.HTTPS 和 HTTP 的区别

超文本传输协议 HTTP 协议被用于在 Web 浏览器和网站服务器之间传递信息。HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此 HTTP 协议不适合传输一些敏感信息,比如信用卡号、密码等。

为了解决 HTTP 协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议 HTTPS。为了数据传输的安全,HTTPS 在 HTTP 的基础上加入了 SSL 协议,SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。

HTTPS 和 HTTP 的区别主要为以下四点:

  • HTTPS 协议需要到 ca 申请证书,一般免费证书很少,需要交费。
  • HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。
  • HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
  • HTTP 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。

二、实践

今天实践的系统环境是 Centos6.6 X64 , Web 服务器为 Apache 2.2

如果您的服务器是 Nginx 或者其他服务器,原理都差不多,只是具体到配置时需要分别处理

1.获取 SSL 证书

想要部署 HTTPS 加密访问,首要要做的就是获取 SSL 证书。如果是学习的话,获取免费的就可以了,这里推荐国外的证书服务商:Namecheap

服务器端 SSL 证书请求文件(CSR)生成

首先检查服务器是否支持 SSL 模块:检查是否有 mod_ssl.so 文件,如无请重新编译 Apache 让其支持 SSL

  • 生成私钥 Generate the private key

请在服务器端使用以下命令来生成私钥

openssl genrsa -des3 -out www.mydomain.com.key 2048

此命令会要求输入证书密码,请输入一个能记住的密码;命令中 www.mydomain.com 为您的域名即可;2048 为私钥长度,请按照需要选择 1024 或 2048

  • 生成CSR文件 Generate the CSR

请在服务器端使用以下命令来生成 CSR

openssl req -new -key www.mydomain.com.key -out www.mydomain.com.csr

此处需要填写很多信息

Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shanghai
Locality Name (eg, city) [Default City]:shanghai
Organization Name (eg, company) [Default Company Ltd]:gitos
Organizational Unit Name (eg, section) []:bqteam-gitos
Common Name (eg, your name or your server's hostname) []:www.gitos.cn
Email Address []:a@gitos.cn

注意上面倒数第二行 Common Name ,此处一定要填写您开启 HTTPS 访问的域名,不能随便填写

您也可以直接使用一个命令同时生成私钥和 CSR 文件:

openssl req -new -nodes -keyout www.mydomain.com.key -out www.mydomain.com.csr

用 SSL 证书请求文件(CSR)获取证书

将 www.mydomain.com.csr 内的内容粘贴到证书发放的网站,获取到您的证书,下载后传到您的服务器,下面配置将用到它

2.配置 Apache 服务器

<VirtualHost *:443>
    DocumentRoot "/path"
    ServerName www.gitos.cn:443
    DirectoryIndex index.html index.htm
    SSLEngine on
    SSLCertificateFile /path/www.mydomain.com.crt
    SSLCertificateKeyFile /path/tls/www.mydomain.com.key
    SSLCACertificateFile /path/1_root_bundle.crt
    <Directory "/path">
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>

配置完成后,重启 Apache,访问 https://www.gitos.cn ,发现配置已经成功。

3.完善 Apache 服务器配置

到此,访问 https://www.gitos.cn 已经没有任何问题,但是如果用户通过 80 端口访问,也就是通过 HTTP 协议访问网站时,会出现一个大大地错误或者出现 Apache 默认页面,非常的不友好,毕竟浏览器默认访问端口为 80 端口

为了解决它,那么就要使用一些技巧啦。最常用的呢就是用端口重定向使所有 80 端口的访问转到 443 端口即可,有很多方法可以解决,比如 Nginx 自带重定向功能,但是这里用的 Apache,那么就提供一个 Apache 的解决方案吧

使用 Rewrite 模块进行重定向,将下列语句添加在配置文件中或者程序的 .htaccess 中,如果没有安装这个模块请重新编译安装

   RewriteEngine on    
   RewriteCond %{SERVER_PORT} !^443$  
   RewriteCond %{REQUEST_URI} !^/tz.php  
   RewriteRule (.*) https://%{SERVER_NAME}$1 [R]

至此结束啦,有问题欢迎指正