最近做点小程序,服务端api必须是https域名,配置方法如下:
创建ssh证书
自己生成CA证书:(自己生成的根证书浏览器不认,会提示不安全,但https可访问)
cd /home/openssl
openssl genrsa -des3 -passout pass:123456 -out test.pem 2048 #生成RSA私钥
openssl rsa -passin pass:123456 -in test.pem -out test.key #提取密钥中的公钥
openssl req -new -key test.key -out test.csr -subj /C=CN/ST=beijing/L=beijing/O=YAN/CN=www.yanjingang.com #生成证书请求文件
openssl x509 -req -days 365 -in test.csr -signkey test.key -out test.crt #生成自签名证书
openssl x509 -in test.crt -noout -text #查看证书文件
阿里云、百度云有免费的单域名DV证书(下载注意选择nginx版本证书)
nginx配置
vim conf/vhost/php.conf
server {
listen 8080; #监听http
server_name www.yanjingang.com yanjingang.com;
rewrite ^(.*) https://$server_name$1 permanent;
}
server {
listen 8443 ssl; #监听https
#开启ssl并设置证书
ssl on;
ssl_certificate /home/openssl/www.yanjingang.crt;
ssl_certificate_key /home/openssl/www.yanjingang.key;
...
}
重启nginx后使用https://www.yanjingang.com访问即可(注:私人生成的证书会提示不安全,忽略即可)。
https端口转发
#80->8080、443->8443 端口转发
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
service iptables save
iptables -L -t nat #查看当前nat规则
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
REDIRECT tcp -- anywhere anywhere tcp dpt:http redir ports 8080
REDIRECT tcp -- anywhere anywhere tcp dpt:https redir ports 8443
注:公网80、443、8080、8443等端口需要在aliyun安全组中入方向打开才可访问
使用https://www.yanjingang.com即可访问
看到这里满足需求的离开即可,遇到微信小程序TLS1.2问题的往后看。
在完成以上步骤后发现,https已经是安全的,百度小程序api调用也正常,但是微信小程序api调用提示“对应的服务器 TLS 为 TLS 1.0 ,小程序要求的 TLS 版本必须大于等于 1.2 。”
Nginx TLS 1.2配置
1.openSSL 版本需要 >= 1.0.2
openssl version -a
2.nginx 版本为 0.7.65,0.8.19 及更高版本
nginx -V
3.nginx是使用的openssl 1.0.2+编译的
nginx -V |grep openssl
4.nginx tls1.2配置
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;
实际情况是我们的server使用内部自研开发框架,nginx编译依赖很多内部插件,且使用openssl 1.0.1编译的,所以怎么设置TLS都是1.0,nginx -V如下:
解决方法:
1.长线方案
下载内部插件源码自己使用openssl1.0.2重新编译nginx
# 更新openssl版本
cd odp/nginx/download/nginx-release.git/libs/
wget http://ftp.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz
rm openssl-1.0.1s.tar.gz
# 重新编译nginx
sh build.sh module-for-odp3.conf
# 替换nginx
mv /home/work/odp/webserver/sbin/nginx /home/work/odp/webserver/sbin/nginx.openssl-1.0.1s
cp tmp/webserver/sbin/nginx /home/work/odp/webserver/sbin/
2.短线方案
使用外部openssl1.0.2编译的nginx做代理,将iptables端口删除,转发改为nginx代理转发
#设置nginx代理server
vim proxyserver/conf/proxy.conf
#80->8080端口转发
server {
listen 80;
server_name _;
access_log /home/proxyserver/log/proxyserver.log;
error_log /home/proxyserver/log/proxyserver.log.wf;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X_ORIG_URI $request_uri;
proxy_set_header CLIENTIP $remote_addr;
proxy_set_header X-Forwarded-For-Proto https;
proxy_set_header Https 1;
proxy_pass http://127.0.0.1:8080;
}
}
#443->8080端口转发
server {
listen 443 ssl;
server_name _;
access_log /home/proxyserver/log/proxyserver.log;
error_log /home/proxyserver/log/proxyserver.log.wf;
#开启https ssl
ssl on;
ssl_certificate /home/openssl/cert-1542784817162_www.yanjingang.com.crt;
ssl_certificate_key /home/openssl/cert-1542784817162_www.yanjingang.com.key;
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;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X_ORIG_URI $request_uri;
proxy_set_header CLIENTIP $remote_addr;
proxy_set_header X-Forwarded-For-Proto https;
proxy_set_header Https 1;
proxy_pass http://127.0.0.1:8080;
}
}
#启动代理nginx
/usr/sbin/nginx -c /home/proxyserver/conf/proxy.conf
#删除iptables端口转发
iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
iptables -t nat -D PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
service iptables save
iptables -L -t nat
#删除nginx webserver的8443端口监听和ssl配置并重启
#使用https://www.yanjingang.com验证TLS1.2和小程序调用
重启小程序开发工具后测试调用成功,收工~!
yan 18.11.21 22:00
资料:
openssl 非对称加密算法RSA命令详解:https://www.cnblogs.com/gordon0918/p/5363466.html
openssl 证书请求和自签名命令req详解:https://www.cnblogs.com/gordon0918/p/5409286.html
微信小程序要求的TLS版本大于等于1.2的问题:https://www.cnblogs.com/xjnotxj/p/7252043.html