失眠好几天了,大半夜睡不着,但是头又晕呼呼的,翻点资料瞎折腾的,估计写得乱七八糟,就这样了,纯记录。
用的是StartSSL™ 提供的证书,免费一年,据说到期可以再生成一个继续用。
怎么申请 StartSSL™ 的证书的资料网上一搜一大堆,懒得写了。这里简单记录一下 nginx 下安装配置 ssl,以免下次我又要到处翻资料。
申请完得到两个文件ssl.crt和ssl.key。
系统环境约定:CentOS6.4 64 位 + 军哥的一键包 LNMP1.1。
(写完这篇的时候发现军哥 LNMP1.2 发布了,默认启用 spdy 和增加 ssl 范例配置,本文还是以 LNMP1.1 为例)。
nginx 配置目录在/usr/local/server/nginx/conf/,把这两个文件上传到此目录,在此目录下:
通过 Openssl 安装,免去 nginx 启动每次输入公匙。
openssl rsa -in ssl.key -out /usr/local/server/nginx/conf/ssl_ca.key
提示输入公匙(申请的时候自己设的),完成后得到一个ssl_ca.key
获取合并 Startssl 的证书,解决 Firefox 不信任问题:
wget http://www.startssl.com/certs/ca.pem
wget http://www.startssl.com/certs/sub.class1.server.ca.pem
cat ssl.crt sub.class1.server.ca.pem ca.pem > /usr/local/server/nginx/conf/ssl_ca.crt
这个ssl_ca.crt还不能直接使用,需要修改下,真的用不惯 vi,所以:
nano /usr/local/server/nginx/conf/ssl_ca.crt
找到一处:
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
加个换行,改成
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
反正左右各 5 个横杠,保存!
这时候已经得到两个文件:ssl_ca.key和ssl_ca.crt
接下来配置 nginx,首先启用 spdy。
开启 spdy 需要较新版本 Openssl,先下载解压,我这里是在/tmp目录操作:
cd /tmp
wget http://www.openssl.org/source/openssl-1.0.1e.tar.gz
tar zxvpf openssl-1.0.1e.tar.gz
编辑 lnmp(或 lnmp1.1-full)目录下upgrade_nginx.sh。
找到这一行:
/configure --user=www --group=www --prefix=/usr/local/nginx
在这行的末尾加上:
--with-http_spdy_module --with-openssl=/tmp/openssl-1.0.1e
(注意:这行前有个空格,目录也要对应,我之前下载在 tmp 目录)
保存后,执行 upgrade_nginx.sh 升级 nginx,我原来是 1.6,直接升级到最新的 1.9.2。
完成后可以运行下面这行来查看有没有 spdy 模块:
/usr/local/nginx/sbin/nginx -V #查看 nginx 安装了什么模块
接着编辑/usr/local/nginx/conf/vhost下的yourdomain.conf文件。
主要部分,监听 443 端口,开启 SSL,启用 spdy,下面的 SSLv3 据说有漏洞,自行考虑。
listen 443 ssl spdy;
#listen [::]:80;
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl_ca.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl_ca.key;
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_prefer_server_ciphers on;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
上面这段已经弃用,// 2015.8.25 更新如下,解决 Chrome 显示“之间的连接采用了过时的加密技术”的问题:
listen 443 ssl spdy;
#listen [::]:80;
ssl on;
ssl_certificate /usr/local/nginx/conf/ssl_ca.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl_ca.key;
ssl_session_timeout 5m;
ssl_session_cache shared:SSL:10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
监听 80 端口,http 强制跳转 https:
server
{
listen 80;
server_name clearsky.me www.clearsky.me;
rewrite ^/(.*)$ /$1 permanent;
}
重启 Nginx 后。需要让页面内资源支持 https,我用的最简单粗暴的:
WordPress 设置-常规,把 WordPress 地址(URL)和 站点地址(URL)都设置成 https。
然后进数据库,文章内容和评论里面批量替换链接(注意备份),SQL 执行:
UPDATE wp_posts SET post_content = REPLACE (post_content, 'http://example.com', 'https://example.com');
UPDATE wp_posts SET post_content = REPLACE (post_content, 'http://example.com', 'https://example.com');
UPDATE wp_comments SET comment_content = REPLACE( comment_content, 'http://example.com', 'https://example.com' );
UPDATE wp_comments SET comment_content = REPLACE( comment_content, 'http://example.com', 'https://example.com' );
我没用上面的,直接用的 Search & Replace 插件替换的,挺方便的,反正用什么都注意备份。
排查页面引用的外部资源,改成 https 的,完成后 Chrome 浏览器下绿锁应该出现了,其它的浏览器没装,不清楚。
然而,除了装逼之外几乎没什么卵用。
几个问题:
- 网站打开速度好像慢了。
- 开启 SSL 之后就去掉 Gravata 头像缓存到多说,用自家 https 的,结果用手机上各种浏览器下看不见头像了。~~还是参照大发的WordPress 缓存 Gravatar 头像到本地开启头像缓存,心理作用快一点。
- 用的 hermit 插件插入网易云音乐地址肯定没 https,所以只要一点下面这首歌的播放按钮,绿锁肯定立马带三角。
- 这下真的困了,可以睡了。
参考资料: