HTTPS 在传输时的安全性比 HTTP 安全得多,博主打算对某些二级域名使用 HTTPS 来保证安全性。

HTTPS
HTTPS

接下来博主介绍如何在编译安装的 Apache 上开启 HTTPS 支持并绑定 CA 证书

 

STEP 1

购买一张自己域名的 CA 证书

可以购买一张自己域名的泛域名 CA 证书,这样一个证书域名下的二级域名可以通用。

购买后你会从购买商那里获得 1 – 2 段公钥,加上自己保存的 1 段私钥,通过修改文件扩展名的方法保存为这样的 2 – 3 个文件:

  1. 一个是私钥文件,格式为 *.key*.pem,一般为 *.key。本文为 server.key
  2. 一个是证书文件,格式为 *.crt。本文为 cert.crt
  3. 一个是链证书文件,格式为 *.crt(如果你的证书是由根证书直接颁发的,就没有这段公钥,反之就有)。本文为 chaincer.crt

本文不涉及 CA 证书的购买方法。当然对于一些只有自己访问的网站,可以使用自签发的证书,只不过在用浏览器访问时会出现证书不受信任的警告,当然本文也不涉及生成一张自签名证书的方法。

 

STEP 2

把私钥及证书文件上传至安全的服务器

私钥只允许你自己拥有,请确保服务器的安全,不然私钥被盗就呵呵了Σ(゚д゚;)

使用各种方法上传这些文件,FTP 也好,直接 VIM 编辑也好,这里提供直接 vim 保存的方法:

mkdir /usr/local/apache/conf/cert
#在一个安全的地方创建一个存放证书的文件夹
cd /usr/local/apache/conf/cert
#进入存放证书的文件夹

vim server.key
#创建私钥文件
#请把私钥黏贴到文件中,之后按Esc键并输入":wq"(不包含引号)保存

vim cert.crt
#创建证书文件
#请把证书公钥黏贴到文件中,之后按Esc键并输入":wq"(不包含引号)保存

#如果有链证书公钥的话
vim chaincer.crt
#创建链证书文件
#请把链证书公钥黏贴到文件中,之后按Esc键并输入":wq"(不包含引号)保存

 

STEP 3

修改 Apache 的 httpd-ssl.conf 文件和 httpd.conf 文件,已更新 HTTP/2 相关配置。

先绑定证书,之后再启用 Apache 的 SSL 支持。说白了就相当于修改 httpd-vhost.conf 中的内容,格式都是一样的。

注:这里文件的默认路径就采用博主之前的博文《编译安装LAMP:Apache篇》中使用的路径,请执行以下 shell 前先修改相应内容。

sed -i 's@^<VirtualHost _default_:443>@<VirtualHost *:443>@' /usr/local/apache/conf/extra/httpd-ssl.conf
sed -i '/^Listen 443/a\
Protocols h2 http/1.1' /usr/local/apache/conf/extra/httpd-ssl.conf
sed -i 's@^DocumentRoot "/usr/local/apache/htdocs"@DocumentRoot "/data/www/default"@' /usr/local/apache/conf/extra/httpd-ssl.conf
sed -i 's@^ServerName www.example.com:443@ServerName blog.ttionya.com:443@' /usr/local/apache/conf/extra/httpd-ssl.conf
sed -i 's#^ServerAdmin you@example.com#ServerAdmin administrator@ttionya.com#' /usr/local/apache/conf/extra/httpd-ssl.conf
sed -i 's@^ErrorLog\(.*\)@#ErrorLog\1@' /usr/local/apache/conf/extra/httpd-ssl.conf
sed -i 's@^TransferLog\(.*\)@#TransferLog\1@' /usr/local/apache/conf/extra/httpd-ssl.conf
sed -i 's@^CustomLog\(.*\)@CustomLog "| /usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log_ssl_%Y%m%d.log 86400" combined@' /usr/local/apache/conf/extra/httpd-ssl.conf
sed -i 's@\(.*\)"%t %h %{SSL_PROTOCOL}x\(.*\)@#\1"%t %h %{SSL_PROTOCOL}x\2@' /usr/local/apache/conf/extra/httpd-ssl.conf

sed -i 's@^SSLCertificateKeyFile.*@SSLCertificateKeyFile "/usr/local/apache/conf/cert/server.key"@' /usr/local/apache/conf/extra/httpd-ssl.conf
#这里绑定私钥文件
sed -i 's@^SSLCertificateFile.*@SSLCertificateFile "/usr/local/apache/conf/cert/cert.crt"@' /usr/local/apache/conf/extra/httpd-ssl.conf
#这里绑定证书文件
sed -i 's@^#SSLCertificateChainFile.*@SSLCertificateChainFile "/usr/local/apache/conf/cert/chaincer.crt"@' /usr/local/apache/conf/extra/httpd-ssl.conf
#这里绑定链证书文件(如果有)

httpd-ssl.conf 文件可以简化为以下内容:

Listen 443
Protocols h2 http/1.1
SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4
SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4
SSLHonorCipherOrder on
SSLProtocol all -SSLv3
SSLProxyProtocol all -SSLv3
SSLPassPhraseDialog  builtin
SSLSessionCache "shmcb:/usr/local/apache/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300

<VirtualHost *:443>
DocumentRoot "/data/www/default"
ServerName blog.ttionya.com:443
ServerAdmin administrator@ttionya.com

SSLEngine on
SSLCertificateFile "/usr/local/apache/conf/cert/cert.crt"
SSLCertificateKeyFile "/usr/local/apache/conf/cert/server.key"
SSLCertificateChainFile "/usr/local/apache/conf/cert/chaincer.crt"

<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/usr/local/apache/cgi-bin">
    SSLOptions +StdEnvVars
</Directory>

BrowserMatch "MSIE [2-5]" \
    nokeepalive ssl-unclean-shutdown \
    downgrade-1.0 force-response-1.0
CustomLog "| /usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log_ssl_%Y%m%d.log 86400" combined
</VirtualHost>

之后再修改 httpd.conf 文件使之加载 httpd-ssl.conf 文件,可以直接执行以下 shell。

sed -i 's@^#LoadModule\(.*\)mod_socache_shmcb.so@LoadModule\1mod_socache_shmcb.so@' /usr/local/apache/conf/httpd.conf
sed -i 's@^#LoadModule\(.*\)mod_http2.so@LoadModule\1mod_http2.so@' /usr/local/apache/conf/httpd.conf
sed -i 's@^#Include conf/extra/httpd-ssl.conf@Include conf/extra/httpd-ssl.conf@' /usr/local/apache/conf/httpd.conf

如果有许多域名要用到 HTTPS 的话,只要把 <VirtualHost *:443></VirtualHost> 及里面的内容复制一份并适当修改就能正常使用了。

 

STEP 4

SSL 的安全性设置

2014 年,SSL 曝出了好几个漏洞,例如 “Heartbleed(心脏流血)” 和 “POODLE(贵宾犬)”。这里要把不安全因素处理掉,关于 mod_ssl官方文档

1、修复“Heartbleed(心脏流血)”漏洞(重要)

只需要更新系统的 openssl 就能修复该漏洞:

Debian/Ubuntu:
sudo apt-get update
sudo apt-get upgrade openssl

CentOS/Redhat/Fedora:
yum update openssl

手动编译:
重新编译一遍新版本

检测漏洞是否被修复:

openssl version -b
#执行以上命令,若openssl版本为1.0.1并且编译时间晚于2014年4月7日则漏洞已被修复

2、修复“POODLE(贵宾犬)”漏洞(建议)

只有使用 SSLv3 时才产生该漏洞,而且该漏洞无法修复,只能禁用 SSLv3 的支持。

现在 Apache 已经默认禁用了 SSLv3,故无需重复添加。

sed -i '/^Listen 443/a\
SSLProtocol all -SSLv3' /usr/local/apache/conf/extra/httpd-ssl.conf

3、禁用RC4加密方式(建议)

RC4 的加密方式比较脆弱,建议禁用。

新版 Apache 已经默认采用禁用了 RC4 加密方式的配置,故无需再次添加。

sed -i 's@^SSLCipherSuite.*@SSLCipherSuite HIGH:MEDIUM:!MD5:!RC4@' /usr/local/apache/conf/extra/httpd-ssl.conf
sed -i 's@^SSLProxyCipherSuite.*@SSLProxyCipherSuite HIGH:MEDIUM:!MD5:!RC4@' /usr/local/apache/conf/extra/httpd-ssl.conf

 

STEP 5

若想在打开 HTTP 时自动跳转为 HTTPS,可以在 httpd-vhost.conf 中设置以下内容:

#在<Directory></Directory>中加上以下内容
RewriteEngine on
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^(.*)?$ https://%{SERVER_NAME}/$1 [L,R]

 

STEP 6

重新启动 Apache 服务

/etc/init.d/httpd restart

重启完成后,HTTPS 就能正常使用了。

 

PS:

下面提供一些检测 HTTPS 安全性的网站:

https://www.ssllabs.com/

https://www.trustasia.com/tools-ssl-state/


原创文章,转载请以链接形式注明出处:http://blog.ttionya.com/article-825.html