免费申请并设置阿里云SSL证书,让网站访问支持https

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 &amp;&amp; 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部门办事也是很糟糕的,就当做是修炼吧。

这种通过不断的努力,解决的问题,看到成果的时候,还是非常知足和幸福的。

 

关于作者

杰夫(jerfo0)

杰夫(jerfo0)

一个活的真实,耿直的boy。
坚定相信爱情,向往自由,对世界充满好奇心。热爱美剧、海贼王、一切户外运动、旅行...
职业:互联网运营。
生命不息,折腾不止,燥起来!!

查看全部帖子

发表评论

电子邮件地址不会被公开。 必填项已用*标注