申请免费阿里SSL证书以及整合nginx
SSL( Secure SocketLayer ) / TLS(Transport Layer Security)
是保证服务器和客户端安全通信的一种协议。简单来说,就是对传输信息进行加解密保证安全的协议。HTTP报文通过SSL的加解密变成了安全的HTTPS。https 可以理解为“ HTTP over SSL/TLS ”,通过 http 协议传输的内容很容易被偷看和篡改,为了安全. 就为 http 协议再加上了一层 SSL/TLS 安全协议,所以就有了 https 。其中 SSL 是“ Secure Sockets Layer ” 的缩写,是“安全套接层”的意思。 TLS 是 “Transport Layer Security” 的缩写,是 ” 传输层安全协议 ” 的意思。 SSL 和 TLS 是同一个东西的不同阶段,理解为同一个东西也行
一.申请免费SSL证书
1.登录阿里账号, 左侧导航栏找到SSL证书, 如下图:
2.依次点击, ‘立即购买’->选择品牌 ’Symantec’ -> 证书类型’免费型DV SSL’ -> 保护类型’1个域名’ -> 域名个数’1个’ -> 购买数量‘1’ -> 购买时长’1年’ -> ‘立即购买’; 如下图:
注意:
这里有个坑, 可能是阿里的套路: 当你第一次点击选择品牌’Symantec’时, 证书类型选项中是没有’免费型DV SSL’这个选项的, 如下图:
此时你需要点击最后一个选项’增强型OV SSL’, 才会出现’免费型DV SSL’(如果不行, 那就把所有选项都点击一遍):
3.页面跳转, 依次点击’去支付’ -> ‘立即支付’. 支付成功后点击’证书控制台’; 如下图:
页面跳转到证书控制台, 点击’申请’, 填写相关信息:
注:
此处我选择文件验证的方式.
填写完毕后, 点击”下一步”:
下载”fileauth.txt”文件, 将此文件放到自己的服务器的nginx下,目录结构必须是.well-known/pki-validation, 步骤如下(我的nginx装在/usr/loca/nginx目录):
①.输入命令: cd /usr/local/nginx/html
mkdir .well-known
cd .well-known
mkdir pki-validation
②.将fileauth.txt上传至/usr/local/nginx/html/.well-known/pki-validation/目录下, 如下图:
③.修改配置文件nginx.conf:
输入命令: vi /usr/local/nginx/conf/nginx.conf
在nginx.conf中添加如下代码:
---------------------------------------------------------------
http {
.......nginx其它配置项;
location = /.well-known/pki-validation/fileauth.txt {
root html;
}
}
---------------------------------------------------------------
④.重启nginx:
输入命令: /usr/loca/nginx/sbin/nginx -s reload
⑤.打开浏览器, 地址栏输入:weixin.bibizao.com/.well-known/pki-validation/fileauth.txt 访问成功即可. (我的域名是”weixin.bibizao.com”)
配置完已上nginx, 回到页面点击”验证”提示成功即可.
4.下载证书:
申请通过后, 点击”下载”-> 选择”Nginx”类型 -> “下载”, 如下图:
下载完成后, 解压, 将解压出来的两个证书文件(.key和.pem)上传至/usr/local/nginx/cert/ 目录下, 注意, cert目录本身是不存在, 需要手动创建. 如图:
二.整合SSL证书, 配置nginx
为了方便管理, 我在nginx的conf目录下创建一个www文件夹, 里面存放以xxx.xxx.com.conf结尾命名的配置文件, 用于区分不同域名的配置, 如下图:
话不多说, 直接粘出来我的nginx配置:
1./usr/local/nginx/conf/nginx.conf文件:
#user nobody;
worker_processes 4;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/$server_name.access.log;
#tcp_nopush on;
sendfile on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
### 引入 www文件夹下以 .conf结尾的文件 ###
include www/*.conf;
}
2./usr/local/nginx/www/weixin.bibizao.com.conf配置如下:
server {
listen 80;
server_name weixin.bibizao.com;
### 重定向到 https 协议 ###
rewrite ^(.*) https://$server_name$1 permanent;
location = / {
rewrite ^(.*) https://$server_name/school/attend/dashboard/index permanent;
}
}
server {
listen 443;
server_name weixin.bibizao.com;
root html;
### SSL 设置 开始 ####
ssl on;
### 刚才上传的两个证书文件
ssl_certificate /usr/local/nginx/cert/1564640_weixin.bibizao.com.pem;
ssl_certificate_key /usr/local/nginx/cert/1564640_weixin.bibizao.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!kEDH!ADH:RC4+RSA:+HIGH:+EXP;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
### SSL 设置 结束 ####
charset utf-8;
location = /.well-known/pki-validation/fileauth.txt {
root html;
}
location = /school {
rewrite ^(.*) https://$server_name/school/attend/login permanent;
}
location ~ ^/school/ {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Schema $scheme;
proxy_set_header Cookie $http_cookie;
proxy_cookie_path / /school/;
proxy_pass http://127.0.0.1:8080;
}
location = / {
rewrite ^(.*) https://$server_name/school/attend/login permanent;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
注:
school是我的项目名, 部署在tomcat8080端口.
ssl_certificat和ssl_certificate_key分别是从阿里上下载解压出来的两张证书文件(上传至/usr/local/nginx/cert/
3.重启nginx:
输入命令: /usr/local/nginx/sbin/nginx -s reload
注意:
如果启动失败, 提示: nginx:[emerg]unknown directive “ssl” 错误. 因为我们配置这个SSL证书需要引用到nginx的中SSL这模块,然而我们一开始编译的Nginx的时候并没有把SSL模块一起编译进去,所以导致这个错误的出现。解决办法如下:
步骤1:
进入nginx的解压目录, 注意, 是解压目录!!!, 我的在/usr/local/soft/nginx-1.14.1/
步骤2:
按顺序执行以下命令:
①. 命令1: ./configure --with-http_ssl_module //重新添加这个ssl模块
注意如果没有出现错误,则直接看命令2即可; 若出现./configure:错误:SSL模块需要OpenSSL库, 原因是缺少了OpenSSL,那我们再来安装一个即可执行:yum -y install openssl openssl-devel
等待OpenSSL的安装完成后,再执行 ./configure ,最后在执行” 命令1" 即可
②. 命令2: 执行make命令, 但是不要执行make install,因为make是用来编译的,而make install是安装,不然你整个nginx会重新覆盖的。
③. 命令3: 在我们执行完做命令后,我们可以查看到在nginx解压目录下,objs文件夹中多了一个nginx的文件,这个就是新版本的程序了。首先我们把之前的nginx先备份一下,然后把新的程序复制过去覆盖之前的即可:
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
cp /usr/local/soft/nginx-1.14.1/objs/nginx /usr/local/nginx/sbin/nginx
④. 命令4: 最后我们来到Nginx安装目录下,来查看是否有安装ssl模块成功。执行./sbin/nginx -V即可看到如下图:
④. 命令4: 命令5: 重启nginx:
/usr/local/nginx/sbin/nginx -s reload