早些年,我们要访问一个网站都是以 http:// 开头的网址。后来,由于互联网隐私泄漏,整个互联网逐渐把 http:// 更换为 https:// 访问。这样就避免了用户隐私泄漏。最常见的隐私泄漏就是流量劫持。在我们的网站被强制插入了第三方广告。
HTTPS 全称:Hyper Text Transfer Protocol over Secure Socket Layer
。中文译为:安全的超文本传输协议。它是建立在 HTTP 基础之上的协议。即在 HTTP 下加入了 SSL 层。
因为在通常我们 PHP 都是使用 Nginx 作为反向代理。所以,今天我们以在 Nginx 环境下配置 SSL,让网站支持 HTTPS。
Nginx 配置 SSL 很简单。
第一步:确认开启 OpenSSL
首先,你得确保你的 Nginx 支持 OpenSSL。可以通过如下命令查看:
$ nginx -V
这里是一个大写的 V 字母。会输出如下类似内容:
[root@iZwz91xnscr5ejzm3rfusnZ sbin]# nginx -V
nginx version: nginx/1.10.3
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC)
built with OpenSSL 1.0.2k 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www
--with-http_stub_status_module --with-http_v2_module --with-http_ssl_module
--with-http_gzip_static_module --with-http_realip_module --with-http_flv_module
--with-http_mp4_module --with-openssl=../openssl-1.0.2k --with-pcre=../pcre-8.39
--with-pcre-jit --with-ld-opt=-ljemalloc
大家可以看到,我的服务器已经开启了 OpenSSL 。
第二步:获取 SSL 证书
证书颁发机构很多。有免费的,也有收费的。个人推荐使用阿里云免费的一年期证书。证书到期之后,可以续期。
具体的证书获取操作大家可以通过 Google 了解。这个步骤相当的简单。
证书包含两个文件:
.key 扩展名结尾的文件为 SSL 证书私钥。
.pem/.crt 扩展名结尾的文件为 SSL 证书公钥。
第三步:配置 Nginx 支持 SSL
打开你的网站配置,增加如下 server 信息:
server {
listen 443;
server_name yourdomain.com;
index index.html index.htm index.php;
root /data/www/sites;
ssl_certificate cert/ssl.pem;
ssl_certificate_key cert/ssl.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location ~ [^/]\.php(/|$) {
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
}
其中,域名的位置请配置为自己的域名。https 对应的默认端口是 443。请保持不变。在 ssl_ 开头的区域,请根据自己的公私钥进行配置。
通常,我们是把公私钥放入 nginx 服务器的 conf 目录下。创建一个名为 cert 目录来专门存放。如果你有多个网站。可以在 cert 目录下创建多个目录,目录名以网站名来命令。
配置完成,重启 Nginx 即可。
此时,我们就可以通过 https:// 的方式来访问我们的网站了。
第四步:访问 HTTP 自动转 HTTPS
当我们把网站转成 HTTPS 之后。那么,曾经以 HTTP 访问的地址。我们必须把这些请求转到 HTTPS。
依然是在 nginx 配置文件中增加一个 server:
server {
listen 80;
server_name itfangtan.com www.phpjieshuo.com;
rewrite ^(.*)$ https://$host$1 permanent;
}
重启 nginx。
如果是在低版本的 Nginx 上配置可能会有所不同。我最近给旧服务器装 SSL,Nginx 版本是 1.4.4,上面的部分配置是不支持的。
如下为配置示例:
ssl on;
ssl_certificate cert/ldrcw.com/ssl.crt;
ssl_certificate_key cert/ldrcw.com/ssl.key;
比如在 1.14 版本就必须有 ssl on
指令才能让 ssl 配置生效。在更高的版本如 1.19
就不需要此指定。所以,大家在配置的时候如果发生不生效的情况可以增加或减少指令来尝试是否正确。