Apache服务器配置SSL访问实战

jopen 4年前

 

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

HTTPS 背景

什么是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中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

HTTPS和HTTP的区别

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

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

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

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

实践

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

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

获取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 
</div>

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

生成CSR文件 Generate the CSR

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

openssl req -new -key www.mydomain.com.key -out www.mydomain.com.csr 
</div>

此处需要填写很多信息

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 
</div>

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

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

配置Apache服务器

<VirtualHost *:443>        DocumentRoot "/path"      //设置网页存放目录            ServerName www.gitos.cn:443                  //服务器的端口            DirectoryIndex index.html index.html.var  //首页名称            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,发现配置已经成功。

完善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]

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