在centos7上为nginx添加ssl

上午boss说要为公司的web服务器加上SSL,我说这个简单,三两下能搞定,关键是发证机构的收费问题。boss说你先去找个免费的证书来,先把服务器调试好,运行没问题,我们再换高大上的证书。于是乎,就这样开始了我的折腾之旅。
在google找到几个免费的crt发证机构,普遍推荐startssl,还有两篇step by step的申请、安装教程,一并粘贴过来:StartSSL免费SSL证书成功申请-HTTPS让访问网站更安全Nginx,Cpanel,DirectAdmin安装StartSSL免费SSL证书。申请流程不一一细表,这两篇文章写得很详细,对着做下来就是。

把startssl生也的.crt文件和.key文件scp到服务器上,这里要注意的是:一定别放到/root目录或者/home/USERNAME目录下,nginx进程去访问别人的家目录,发生”Permission denied”是必然的事。放在nginx的conf目录/etc/nginx/YOURDIR是个比较好的选择。
然后去改相应网站的conf文件,例如:

vim /usr/local/nginx/conf/nginx.conf

在server段中添加如下代码:

 listen       443;
 ssl on;
 ssl_certificate /etc/nginx/YOURDIR/YOURFILE.crt;
 ssl_certificate_key /etc/nginx/YOURDIR/YOURFILE.key;
 ssl_session_timeout 5m;

然后:

systemctl restart nginx.service
Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.

什么鬼东西?
看了下log:

[emerg] 22981#0: SSL_CTX_use_PrivateKey_file("/etc/nginx/DIR/FILE.key") failed (SSL: error:0906406D:PEM routines:PEM_def_callback:problems getting password error:0906A068:PEM routines:PEM_do_header:bad password read error:140B0009:SSL routines:SSL_CTX_use_PrivateKey_file:PEM lib)

原因是在startssl申请的key是要输入密码的,最少10位最多32位,这里提示的就是nginx读取不了我们在startssl上给key设置的密码,最简单的解决办法当然是把这个key的密码去掉。
在stackoverflow上边找到个相似的案例,并给出了解决方法,可以参考下: What does “SSL_CTX_use_PrivateKey_file” “problems getting password error” indicate in Nginx error log?。不同的证书机构发出来的证书扩展名不尽相同,证书机构的F.A.Q给出的解决办法才是标准答案,startssl的链接在这里:How can I decrypt the private key?

openssl rsa -in ssl.key -out ssl.key
systemctl restart nginx.service

nginx最终可以正常运行了,但这还不是最终结局!当我尝试不用https开头去访问网站的时候,网站提示:

400 Bad Request 
The plain HTTP request was sent to HTTPS port

我去,什么鬼。https访问正常了,但http死活不正常。没办法,爬墙继续google。
最后在“阿里云CentOS 6.5系统LNMP环境安装SSL证书”这里找到答案,其它的改fastcgi_param或者upstream的都可以不用管…………

###### 新增一个“server”,保留原80端口,并强制将http协议转换到https协议
server {
    listen 80;
    server_name www.typecodes.com;
    rewrite ^(.*) https://$server_name$1 permanent;
}
###### 在原“server”中,启用支持https协议的443端口,并配置相关信息
server {
    listen 443;
    server_name  www.typecodes.com;

    ssl on;
    # 最后新生成.crt文件
    ssl_certificate /etc/nginx/ssl/typecodes_last.crt;
    # 最开始生成.key文件
    ssl_certificate_key /etc/nginx/ssl/typecodes.key;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_ciphers ALL:!aNULL:!ADH:!eNULL:!LOW:!EXP:RC4+RSA:+HIGH:+MEDIUM; #Disables all weak ciphers
    ssl_protocols SSLv3 TLSv1; #enables SSLv3/TLSv1, but not SSLv2 which is weak and should no longer be used.
    ssl_prefer_server_ciphers on;
    ***************省略其它不变的部分****************
}

重启nginx服务,一切正常。