标签 https 下的文章

同一台服务器Nginx防止未配置SSL证书的站点通过https访问跳转到配置了SSL(https)证书的站点

服务器:CentOS
环境:Nginx+MySQL+PHP

之前在这台服务器上配置了多个vhost站点,其中有一个还配好了SSL证书(https访问),其他站点都没配置。今天有个同事发现,当通过https访问其中一个未配置ssl证书的网站时,浏览器(谷歌、火狐都会)会提示证书风险,选择继续访问后,内容却是配置了ssl证书的那个站点。

后来查询得知,通过https协议访问未配置ssl证书的站点时,默认会跳转到一个(如果配置了的话)https站点,要禁止这种跳转,需要配置一个默认ssl(无效的也可以)server,具体如下:

server {
 listen 443 default_server;
 server_name _ ;
 ssl on;
 ssl_certificate crt/1_xxxx.com_bundle.crt; # 这里可以是无效的证书
 ssl_certificate_key crt/2_xxxx.com.key; # 这里可以是无效的证书
 return 301 http://$host$request_uri; # 跳转到http协议访问
}

最后一句(return)强制把未配置ssl证书的https访问都跳转到http协议上,问题解决。
这是目前得到的解决方案,如果还有更好的,欢迎大家指出!

在哪些情况下 HTTP_REFERER 会为空

有时候我们需要获取当前页面的前一个页面信息,在PHP里面,通过$_SERVER['HTTP_REFERER']即可获取相关信息,配合使用parse_url()函数,可以切割网址单独获取各部分信息。但referer并非总是有效的,有几次这个问题困恼了我很久。

第一次碰到这个问题是因为浏览器原因导致,详情可参考我去年写的一篇文章:IE浏览器下HTTP_REFERER失效
第二次是因为给网站设置了https访问,但跳转的链接还是http。

通过查阅相关资料,总结了下面这些情形,HTTP_REFERER 有可能为空(失效):

  • 直接在浏览器地址栏输入网址访问
  • 通过浏览器书签点击访问网站
  • 在一个外部应用程序中点击链接访问
  • 从 https 链接跳转到 http 链接
  • 从 https 链接跳转到 另一个不同的 https 链接
  • 服务器安装了诸如firewall、antivirus等安全软件,将referer过滤掉了
  • 使用了过滤 referer 的代理服务器
  • 通过诸如curl等程序访问网站,但未设置referer头
但需要注意的是,完全信任 HTTP_REFERER 是不推荐的,不仅因为该变量容易失效或为空,更在于该变量很容易被伪造。

Apache 配置多个https站点

工作中经常会遇到在同一台服务器上部署多个https站点的情况,本文简单介绍实现方法。

假设apache已经安装了ssl模块。检测方法:cd /etc/httpd/modules;ll|grep ssl,如结果为 mod_ssl.so ,表示已经安装,如结果为空,则未安装。安装方法请自行搜索。

如服务器开启了iptables防火墙,请放开443端口

申请ssl证书,下载,部署到服务器相关目录

本人在腾讯云申请的免费 TrustAsia TLS RSA CA 证书
cd /etc/httpd/conf.d
mkdir crt
# 上传三个证书文件到 crt 目录
# 文件分别是:1_root_bundle.crt,2_www.domain.com_cert.crt 和私钥文件 3_www.domain.com.key
# 以上www.domain.com 请替换成自己的域名

修改apache配置

LoadModule ssl_module modules/mod_ssl.so
Listen 443
NameVirtualHost *:443 # 这一句很关键,否则只有第一个虚拟主机生效
# 第一个虚拟主机
<VirtualHost *:443>
DocumentRoot "/var/www/html"
ServerName domaintest.cn
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/default/2_domaintest.cn.crt
SSLCertificateKeyFile /etc/httpd/ssl/default/3_domaintest.cn.key
SSLCertificateChainFile /etc/httpd/ssl/default/1_root_bundle.crt
</VirtualHost>
#第二个虚拟主机
<VirtualHost *:443>
DocumentRoot "/var/www/html"
ServerName web.domaintest.cn
SSLEngine on
SSLCertificateFile /etc/httpd/ssl/web/2_web.domaintest.cn.crt
SSLCertificateKeyFile /etc/httpd/ssl/web/3_web.domaintest.cn.key
SSLCertificateChainFile /etc/httpd/ssl/web/1_root_bundle.crt
</VirtualHost>

测试配置文件,无误后重启apache服务

httpd -t # 检测配置文件
httpd -k restart # 重启服务

Chrome浏览器检查元素,如看到绿色的 This page is secure(valid HTTPS). 字样,表示安装成功。

微信图片_20181205114633.png
至此,多站点https服务部署完成。