-
一、本文主要讲述以下几个问题(如无以下问题,可忽略本文)
1、微信小程序正式发布需要用https域名才可以访问。https+nginx域名配置。
2、android手机测试无问题、电脑请求无问题。真机调试时提示fail ssl hand shake error错误。
3、赛门铁克证书文件pfx转.key(私钥)和.crt证书。
4、crt 证书生成中间证书和根证书、并测试。
- 二、前言
一时心血来潮,买了一个阿里云轻量应用服务器。然后想着做点什么,本身自己会Android、Java后端,但是,自己一个人写这么多功能,好累,而且我还缺了PC管理后台和IOS。EMM,我好像还不会写IOS。移动端大潮流已经过去了,还是不学IOS了。那做个小程序吧,小程序前端写一套,后端PC管理后台到时候再说。废话到此为止。开始心酸的小程序之路。
- 三、正文
1、小程序要求https:意味着什么?
必须按这个顺序一步步来:购买域名(几块钱一年)——》备案(需要一个月)——》申请https证书(赛门铁克免费证书)(大概半天到一天)。
到此一个月过去了,我拥有了自己的域名、证书、服务器。
技术选型,是通过tomcat做https还是ngnix做https。基于平时tomcat服务器都是写8080端口(或者其他)。我一个https请求,还加端口号,且不说我需要在阿里云对8080端口放开安全,但是这么看起来,实在低端。我这个人,功能可以不好看,但是技术一定要用到位,那我选nginx先将所有访问80的请求都转到8080端口吧。然后在nginx上做https。
1.1、nginx服务器转发直接上nginx.conf配置(安装略)
进入配置文件目录cd /etc/nginx/,找到nginx.conf配置文件。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name 你的域名;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
proxy_pass http://你的域名:8080;
client_max_body_size 20M;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
1.2、将nginx服务重启,用以下命令测试:
nginx -s stop 停止nginx
nginx 启动nginx
nginx -s reload 重新加载nginx
nginx -t 测试是否成功
这样就将所有域名到转发到tomcat服务器的8080端口了。但这还不行,我们要求https请求访问nginx 80 -->tomcat 8080服务。但是nginx配置文件需要配置一个证书(.crt)、一个私钥(.key)的路径。首先,我看看赛门铁克提供的证书,什么?居然是pfx。
1.3、将pfx证书转换为想要的证书(.key私钥,.crt服务器证书)
pfx是什么?看下三种证书的介绍。(概念可忽略1.3.1、1.3.2、1.3.3,操作直接看1.3.4)
1.3.1、带有私钥的证书:由Public Key Cryptography Standards #12(公钥加密技术12号标准),PKCS#12标准定义,包含了公钥和私钥的二进制形式的证书,以pfx作为证书文件的后缀名。
1.3.2、二进制编码的证书:证书中没有私钥,DER编码二进制格式的证书文件,以cer作为证书文件后缀名。
1.3.3、Base64编码的证书:证书中没有私钥,BASE64编码格式的证书文件,也是以cer作为证书文件后缀名。
1.3.4、再讲解一下.pfx证书格式转.key和.crt文件的方法:(以下以Linux系统为例)
将.pfx格式的证书转换为.pem文件格式:(有密码的话会提示密码输入)
openssl pkcs12 -in xxx.pfx -nodes -out server.pem
从.pem文件中导出私钥server.key:
openssl rsa -in server.pem -out server.key
从.pem文件中导出证书server.crt
openssl x509 -in server.pem -out server.crt
1.3.4、现在我已经有了server.key和server.crt了,我可以去愉快的配置nginx配置文件nginx.conf了。直接上nginx.conf。
server{
listen 443;
server_name 你的域名;
ssl on;
ssl_certificate /etc/nginx/https/server.crt;
ssl_certificate_key /etc/nginx/https/server.key;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;
location / {
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Ssl on;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://你的域名:8080;
client_max_body_size 20M;
}
}
现在再次访问https://你的域名 ------> http://你的域名:8080了,是不是很开心,以为https搞定了。还是太天真。
测试好好的、电脑上运行的也很正常。但是!android手机真机调试,一调试就提示fail ssl hand shake error!
1.4、fail ssl hand shake error问题处理:
首先需要定位问题在哪。是TLSv1.2支持问题,还是因为证书问题。我两个都遇到了。相当幸运。送上检测工具两件。
两个检测工具:
https://www.myssl.cn/tools/check-server-cert.html
https://www.ssllabs.com/ssltest/analyze.html
1.4.1、查看nginx是否支持1.2版本(支持)、然后看配置nginx.conf配置这一行(ssl_protocols TLSv1 TLSv1.1 TLSv1.2)是否开启了tlsv1.2。这一行不这么写就说明没开。照抄上面的配置文件nginx.conf试试。
1.4.2、证书问题,我就一个0证书(服务器证书)没有中间证书。怎么处理?
去这通过现有server.crt生成中间证书、根证书。并按照服务器证书、中间证书、根证书的顺序整合到server.crt。重启nginx。