失眠好几天了,大半夜睡不着,但是头又晕呼呼的,翻点资料瞎折腾的,估计写得乱七八糟,就这样了,纯记录。


用的是StartSSL™ 提供的证书,免费一年,据说到期可以再生成一个继续用。

怎么申请 StartSSL™ 的证书的资料网上一搜一大堆,懒得写了。这里简单记录一下 nginx 下安装配置 ssl,以免下次我又要到处翻资料。

申请完得到两个文件ssl.crtssl.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.keyssl_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 浏览器下绿锁应该出现了,其它的浏览器没装,不清楚。

然而,除了装逼之外几乎没什么卵用。

几个问题:

  1. 网站打开速度好像慢了。
  2. 开启 SSL 之后就去掉 Gravata 头像缓存到多说,用自家 https 的,结果用手机上各种浏览器下看不见头像了。~~还是参照大发的WordPress 缓存 Gravatar 头像到本地开启头像缓存,心理作用快一点。
  3. 用的 hermit 插件插入网易云音乐地址肯定没 https,所以只要一点下面这首歌的播放按钮,绿锁肯定立马带三角。
  4. 这下真的困了,可以睡了。

参考资料:

  1. https://www.startssl.com/?app=42
  2. https://line.dreamq.org/1708spdy
  3. https://yusky.me/lnmp-enable-ssl-spdy.html
  4. https://cyhour.com/directadmin-install-startssl-free-ssl-certificates.html