HTTPS 在传输时的安全性比 HTTP 安全得多,博主打算对某些二级域名使用 HTTPS 来保证安全性。
接下来博主介绍如何在编译安装的 Apache 上开启 HTTPS 支持并绑定 CA 证书
STEP 1
购买一张自己域名的 CA 证书
可以购买一张自己域名的泛域名 CA 证书,这样一个证书域名下的二级域名可以通用。
购买后你会从购买商那里获得 1 – 2 段公钥,加上自己保存的 1 段私钥,通过修改文件扩展名的方法保存为这样的 2 – 3 个文件:
- 一个是私钥文件,格式为
*.key
或*.pem
,一般为*.key
。本文为server.key
- 一个是证书文件,格式为
*.crt
。本文为cert.crt
- 一个是链证书文件,格式为
*.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.trustasia.com/tools-ssl-state/
原创文章,转载请以链接形式注明出处:https://blog.ttionya.com/article-825.html