https刚刚出来的时候就准备安装ssl证书,但直到现在才来弄。有这个证书可能会有安全上的好处,但最直观的是:用浏览器访问不再会出现不安全的提示,如下图浏览器网址窗口(有ssl证书的网址会有把小黑锁的图标)。
下面就来说说怎么申请并配置的吧!因为我不是技术人员,所以入了很多坑,折腾了一个周末的时间才把所有问题解决,而且还不知道以后会不会有问题。
一、申请免费的阿里云SSL证书
阿里云的证书购买地址为:https://common-buy.aliyun.com/?spm=5176.2020520163.cas.1.zTLyhO&commodityCode=cas#/buy
进去一看吓一跳,购买一年非常贵,都抵上一个服务器了,能卖这么贵,证明SSL证书是有它的价值的,如何找到免费的版本呢,如下操作:
选择Symantec 品牌—选择增强型OV SSl 证书类型(这个时候类型处才会出现“免费型DV SSL”)—选择免费型DV SSL—正常走购买程序 如图:
需要填写很多信息,绑定域名(一个域名只能绑定一个证书),提交审核,审核很快几分钟就下来了,然后下载自己对应环境的证书就可以了!我的是nginx的。
下载后,解压,nginx版本的是有两个文件,将这两个文件传到服务器nginx的安装目录下新建的cert目录中。
然后修改nginx的配置文件nginx.conf,因为我的配置是写在/nginx/conf/vhosts目录下的,因此在此目录下修改对应的配置文件:
server { listen 443 ssl; server_name www.it520.org it520.org; ssl on; index index.html index.htm index.php; root /alidata/www/blog; ssl_certificate cert/it520.pem; //<span style="color: #ff0000;">证书文件,注意路径</span> ssl_certificate_key cert/it520.key; //<span style="color: #ff0000;">证书文件,注意路径</span> 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; <span style="color: #ff0000;">//以上就是https SLL证书的设置</span> location / { if ($host != 'www.it520.org' ) { rewrite ^/(.*)$ https://www.it520.org/$1 permanent; } if (-f $request_filename/index.html){ rewrite (.*) $1/index.html break; } if (-f $request_filename/index.php){ rewrite (.*) $1/index.php; } if (!-f $request_filename){ rewrite (.*) /index.php; } } location ~ .*\.(php|php5)?$ { #fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 1h; } #伪静态规则 } log_format blog '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /alidata/log/nginx/access/default.log blog; <span style="color: #ff0000;">// 新版本nginx要求log_format放在server 外面</span> server { listen 80; server_name www.it520.org it520.org; #rewrite ^(.*) https://$server_name$1 permanent; rewrite ^(.*)$ https://$host$1 permanent; } <span style="color: #ff0000;">//将http 301重定向到https上 也就是80端口重定向到443端口</span> |
以上要注意的几点是:
(1)证书的路径,我这边的情况是写nginx目录下的路径就可以了
(2)log_gormat要写在server 外,后面重新编译升级nginx到新版本的时候是不支持写在里面的
(3)可以将80端口重定向到443端口,方便用户访问和SEO
(4)一个域名一个证书,所以如果有多个域名,记得配置的时候证书名字改成对应的。
二、将ssl模块编译进nginx
以上做完配置后,重启nginx测试一下 service nginx restart。如果没有出问题那就恭喜了啦!如果出现问题,错误提示中含有unknown directive “ssl” (配置文件没设置对也会出错,根据提示修改)那就是因为没有加载SSL模块。需要在configure的时候加上“–with-http_ssl_module”即可。
这里有一个问题是,nginx目录是没有configure文件的,所以执行命令的时候会出错,因此需要下载一个最新版本的nginx,解压进行编译。
这个时候就比较复杂一些了,步骤如下:
1、检查一下是否有编译SSL模块, 命令 /usr/local/nginx/sbin/nginx -V (目录改成自己的路径)
2、下载最新版本nginx(不是最新的也可以):
wget http://nginx.org/download/nginx-1.10.2.tar.gz |
3、解压(建议解压到目前安装的nginx同级目录中,我是这样的)
tar xzvf nginx-1.10.2.tar.gz |
4、进入解压后的目录中 命令 cd nginx-1.10.2/
5、开始编译nginx(注意:命令中的地址为nginx的安装地址)
[root@localhost nginx-1.4.4]# ./configure --prefix=<span style="color: #ff0000;">/usr/local/nginx</span> --user=www --group=www --with-http_stub_status_module --with-http_ssl_module |
6、重复第一个步骤,看结果有没有SSL字样的。如果有的话重启一下nginx,浏览网页看看是否成功。
三、再重新编译nginx开启 Nginx TLS SNI,支持同一 IP 下多 SSL 证书
安照以上操作好后,如果有两个域名在一个服务器(IP)上,同样都上传证书后,会发现总有一个网站的证书使用的是另一个网站,因为导致浏览器拦截访问的情况。
这个时候怎么办呢,其实是需要开启TLS SNI support ,nginx默认是不开启的,如果判断是否开启TLS呢?
$ /usr/local/nginx/sbin/nginx -V ginx version: nginx/1.6.2 built by gcc 4.1.2 20080704 (Red Hat 4.1.2-55) TLS SNI support disabled configure arguments: --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module |
如上,如果出现TLS SNI support disabled表示没有开启TLS,需要重新编译nginx 开启tls
1、重新编译 Nginx 需要 OpenSSL,下载或者升级,首先查看OpenSSL的版本信息。
[root@localhost ~]# openssl version -a OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008 built on: Tue May 31 06:58:30 CDT 2016 platform: linux-x86_64 options: bn(64,64) md2(int) rc4(ptr,int) des(idx,cisc,16,int) blowfish(ptr2) compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -I/usr/kerberos/include -DL_ENDIAN -DTERMIO -Wall -DMD32_REG_T=int -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wa,--noexecstack -DOPENSSL_USE_NEW_FUNCTIONS -fno-strict-aliasing -DOPENSSL_BN_ASM_MONT -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM OPENSSLDIR: "/etc/pki/tls" engines: dynamic |
2、开始升级openssl,命令依次如下:
wget ftp://ftp.openssl.org/source/openssl-1.0.2h.tar.gz tar xzvf openssl-1.0.2h.tar.gz cd openssl-1.0.2h ./config --prefix=/usr/local/openssl/ enable-shared enable-tlsext make && make install |
3、再次查看OpenSSL的版本信息,看是否已经更新。
4、编译nginx
$ wget http://nginx.org/download/nginx-1.10.2.tar.gz $ tar xzvf nginx-1.10.2.tar.gz $ cd nginx-1.10.2/ $ ./configure --user=www --group=www \ --prefix=/usr/local/nginx \ <span style="color: #ff0000;">#为nginx安装目录</span> --with-http_stub_status_module \ --with-http_ssl_module \ --with-http_v2_module \ --with-openssl=path/to/openssl-1.0.2a <span style="color: #ff0000;">#为下载解压的目录,非openssl安装目录</span> $ make $ mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old <span style="color: #ff0000;">#备份旧的nginx</span> $ cp objs/nginx /usr/local/nginx/sbin/nginx <span style="color: #ff0000;">#替换编译好的nginx</span> |
make 编译完成后不要执行 make install ,直接将 objs 目录下编译好的新 nginx 执行文件 copy 到原来的路径下替换即可。我make的时候频发出错,大部分是因为几个路径没有搞明白,最后把解压的放在nginx同级目录下就解决了。
5、然后再次检查一下nginx配置文件是否出错,命令 /usr/local/nginx/sbin/nginx -t 我就是在这一步发现新版本nginx中log_gormat必须放在server外面的。
6、平滑重启nginx /usr/local/nginx/sbin/nginx -s reload
查看ngixn版本极其编译参数(注意V的大小写,小写的只能看到版本信息) /usr/local/nginx/sbin/nginx -V 如果出现TLS SNI support enabled 说明TLS开启了,然后再去看打开两个网站的情况,就都是属于自己的证书了,不会再被拦截了。
四、discuz论坛使用https访问后出现样式问题
我的网站www.9aimai.com 用的是discuz论坛,安装SSL证书后,展示样式出现了错误,原因是:css样式默认加载了http模式下的缓存样式。
解决办法如下:
1、https模式下进入discuz后台,更新网站缓存。
2、在nginx配置文件中将http请求强制301跳转到https,避免后面样式缓存冲突。
3、后台,全局,站点URL 改成https的
4、后台,站长,ucenter设置改成https的
5、如果模板中有写死的http 改成https (一般很少会在模板写死引用地址的)
最后总结一下:现在梳理一下发现很多都是小问题,但是系统代码就是这样,你稍微写错一点就会出错,排查起来要不断的测试找问题。总之非常折腾人,可见码农是多么的苦逼的职业,各种BUG,各种修改需求是需要花大量的时间去纠正的。
而且作为一个菜鸟,什么都是边学边做,入的坑十分的多,不过这些经历也让我学会了生活就是用来折腾的,不用太生气这种事情。换个角度想发现去ZF部门办事也是很糟糕的,就当做是修炼吧。
这种通过不断的努力,解决的问题,看到成果的时候,还是非常知足和幸福的。