手机版

为苹果ATS和微信小程序打造Nginx HTTPS服务

时间:2021-12-17 来源:互联网 编辑:宝哥软件园 浏览:

作者:神蜗牛,昨天从原地址测试开发了微信小程序,才发现微信也要求和HTTPS加密数据,大概是因为之前苹果的ATS审核政策,因为微信想在苹果上打开小程序,必须只要求开发者使用HTTPS,所以我们在服务器上测试安装了Nginx HTTPS服务。

安装HTTPS最麻烦的问题应该是获取证书,证书的类型相当复杂。有几种,单域、泛域和多域。还有一种感觉就是标准乱七八糟,收费很高,每年都买。

现在所有的云服务提供商也都有免费的证书提供各种基础功能,但似乎很多都只是针对单个域的免费。这里的单域是指每个二级域名都是一个域名,每个二级域名都需要单独配置证书。

我使用免费的让我们加密证书,它支持苹果ATS标准。

https://letsencrypt.org/Let's的加密项目旨在使HTTPS加密的每个网站,该项目由Mozilla、思科、Akamai、IdenTrust和EFF支持,并由Linux基金会托管。

我用阿里巴巴云的服务器,操作系统版本:CentOS7.0。

提醒:在一切开始之前,我们需要注意服务器的剩余内存。一开始我用的是分配最低的测试服务器,剩余可用内存只有70MB左右。结果服务器直接挂了,回来之前最好释放一个300MB内存。

此外,服务器必须与域名绑定,并且可以由外部网络直接访问。如果不可能在内部网络或虚拟机上,因为安装证书时需要通过域名访问数据,否则无法生成证书。

SSL实验室最终配置的测试结果,

为苹果ATS和微信小程序搭建 Nginx  + HTTPS  服务(图1)

好了,下面是配置过程:

一、升级系统 OpenSSL 版本

我第一次安装OpenSSL的时候,还是系统默认的安装版本1.0.1e,安装后SSL实验室的安全性测试为F级,所以升级到1.1.0c,然后改为A级。但是看了很多文章,发现1.0.2j版本是大家推荐的,据说是因为1.1的官方支持是到2018年。至于实际使用哪一个,就看你的其他需求了。

为苹果ATS和微信小程序搭建 Nginx  + HTTPS  服务(图2)

wget https://www.openssl.org/source/openssl-1.1.0c.tar.gztar-zxvf openssl-1.1.0c.tar.gz CD open SSL-1 . 1 . 0 c/。/config-prefix=/Usrszlib make install

二、修改Nginx配置以支持 .well-known 目录的访问

证书在安装时会自动在网站根目录下生成一个.知名目录,并且这个目录下的文件必须是外网可访问的,否则认证会失败。

对于Nginx的版本,我在测试中使用的最低版本是nginx1.8.1,建议使用最新稳定版本的nginx1.10.2。

如果nginx.conf中以前存在类似以下的规则

位置~ /\。{全部拒绝;}需要添加以下配置:注意,证书需要自动续费后仍需要此配置,不能删除。

位置~ /。知名{允许所有;}

三、安装 certbot-auto

1,首先需要epelyum安装epel-release。

2.首先修改为使用国内pip源码` ` ` ` ` mkdir ~/。pipcat ~/。pip/pip . conf eof[全局]索引-URL。

=https://pypi.doubanio.com/simple/

[install]trusted-host=pypi.doubanio.comEOF

3, 安装 certbot 依赖包

mkdir /usr/local/certbotcd /usr/local/certbotwgethttps://dl.eff.org/certbot-auto--no-check-certificatechmod +x ./certbot-auto./certbot-auto -n

安装时错误:

Delta RPMs disabled because /usr/bin/applydeltarpm not installed

![为苹果ATS和微信小程序搭建 Nginx + HTTPS 服务](http://img.blog.csdn.net/20170122140144795?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXptZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)解决方法:

yum provides '*/applydeltarpm'yum install deltarpm

安装依赖的时候会下载大量包可能看着没动静,注意top看看是否有python的进程在跑我安装完后,出现下面信息,可以直接忽略的,没有问题的> Saving debug log to /var/log/letsencrypt/letsencrypt.logMissing command line flags. For non-interactive execution, you will need to specify a plugin on the command line.  Run with '--help plugins' to see a list of options, and see https://eff.org/letsencrypt-plugins for more detail on what the plugins do and how to use them.####四、生成证书> 生成证书,有多种方式,选择你需要的一种admin@mail.com 为管理员的邮箱,请先替换为您的邮箱地址1. 网站一个域名的证书

./certbot-auto certonly --emailadmin@mail.com--agree-tos --webroot -w /home/wwwroot/yourwebsite -d www.yourdomain.com

2. 一个网站多个域名只生成一个证书

./certbot-auto certonly --emailadmin@mail.com--agree-tos --webroot -w /home/wwwroot/yourwebsite -d www.yourdomain.com -d m.yourdomain.com

3. 多个网站多个域名生成多个证书

./certbot-auto certonly --emailadmin@mail.com--agree-tos --webroot -w /home/wwwroot/yourwebsite -d www.yourdomain.com -d m.yourdomain.com -w /home/wwwroot/myanotherwebsite -d www.aotherdomain.com -d www.aotherdomain.com

出现下面信息就安装好了> IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at   /etc/letsencrypt/live/www.youqumob.com/fullchain.pem. Your cert   will expire on 2017-04-19. To obtain a new or tweaked version of   this certificate in the future, simply run certbot-auto again. To   non-interactively renew *all* of your certificates, run   "certbot-auto renew" - If you like Certbot, please consider supporting our work by:>   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate   Donating to EFF:                    https://eff.org/donate-le查看生成的证书,检查是否存在对应域名的密钥文件

ll /etc/letsencrypt/live/

> 我们需要给Nginx配置用的文件为:fullchain.pem - 证书文件privkey.pem - 私钥文件####五、给Nginx添加SSL证书> HTTP 默认端口是 80,所以使用 http 时我们无须输入端口号,HTTPS 默认的端口是 443,所以现在使用 https 不输入端口号,实际上是使用的 443 端口了修改你的网站配置文件,下面以 nginx.conf 为例

vi nginx.conf

> 如果你原来的网站还允许 http 访问,那就先复制一份再来修改,如果直接全部使用https 则直接修改下面展示需要修改的主要配置代码

server {listen 443 ssl;# 如果你的服务器支持ipv6,可开启下面这一行# listen [::]:443 ssl http2;server_name www.yourdomain.com;

# SSL 验证配置ssl_certificate "/etc/letsencrypt/live/www.yourdomain.com/fullchain.pem";ssl_certificate_key "/etc/letsencrypt/live/www.yourdomain.com/privkey.pem";# 默认值ssl_ciphers HIGH:!aNULL:!MD5;# 据说这个兼容 ie6 xp , 但实际测试发现根本打不开网页啊#ssl_ciphers "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";#ssl_ciphers "EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";#ssl_ciphers "EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";#ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";ssl_session_timeout 10m;ssl_protocols TLSv1.2 TLSv1.1 TLSv1;ssl_prefer_server_ciphers on;ssl_session_cache shared:SSL:10m;# 下面还是你原来的其他配置...

}

> 对于 ssl_ciphers 这个参数的配置实在是没搞明白,网上找了半天也没有找到能说清楚具体怎么配置的,上面的几种都是网上看到的比较多的几种写法,也感觉不出来有什么区别,最后我还是使用的默认配置了。修改保存后记得先测试下配置是否正确

nginx -tnginx -s reload

####六、开启防火墙443端口允许外部访问

vi /etc/sysconfig/iptables

添加一行

-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

重启防火墙现在打开网站测试下访问是否正常。> 注意,如果你在浏览器上网址左边没看到一个绿色的锁,表示网页上应该还有非 https 的请求,需要将页面上的 http 请求全部改造成 https 之后就是绿色的锁喽。####七、定时任务自动更新证书续期> 因为据说证书的有效期是 90天,但可以无限续期,所以最后还要增加个证书的自动续期定时任务功能,注意更新证书的频率是有限制的哦,不要太频繁了,可以看看说明页面 https://letsencrypt.org/docs/rate-limits/英文一大堆有些看不懂,大概意思吧说的是各种新增更新之类的情况每周 5~20次的限制

crontab -e

增加任务,每月1号凌晨5点30分更新一次证书,并自动重载 nginx 配置

30 05 01 * * /usr/local/certbot/certbot-auto renew --renew-hook "/etc/init.d/nginx reload"

####八、测试是否符合苹果的ATS要求在苹果操作系统的终端中通过nscurl命令来诊断检查

nscurl --verbose --ats-diagnosticshttps://www.yourdomain.com

我在苹果上测试了下 TLSv1 TLSv1.1 TLSv1.2 全部 PASS 通过了的![为苹果ATS和微信小程序搭建 Nginx + HTTPS 服务](http://img.blog.csdn.net/20170122140627250?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXptZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)不过后来发现还可以线上测试:腾讯云上面有个在线苹果ATS检测的功能可以试试https://www.qcloud.com/product/ssl![为苹果ATS和微信小程序搭建 Nginx + HTTPS 服务](http://img.blog.csdn.net/20170122140844724?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhvdXptZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)测试也全部通过####九、其他问题1, 检测服务器 HTTPS 配置安全性https://www.ssllabs.com/ssltest/analyze.html出现下面提示,安全等级居然为 F 无语。。> This server is vulnerable to the OpenSSL Padding Oracle vulnerability (CVE-2016-2107) and insecure一番搜索后,发现是服务器的 openssl 版本太低的原因,需要升级 openssl 了,可以查看第一步更新下再重新编译Nginx2, 重定向的问题> 如果只想使用 HTTPS ,以前的 HTTP 方式一般是需要 301 或 302 重定向到 HTTPS 请求上的,但这样会导致多一次请求,而且同样存在可能被劫持的风险,此时可以使用 HSTS ,可以将当前的 HTTP 请求重置为 HTTPS 方式而不用跳转,max-age的时间根据你的需求自定义加上这个后,你的服务器在 SSLLAB 上的等级就是 A+ 啦在 server 部分添加 add_header

add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";

注意:> 若要取消时不能直接删除该配置,必须先将 max-age=0; 设置为 0 一段时间后再去掉,否则可能导致部分用户浏览器未更新配置。也就是说这个功能只能是当用户 通过 https 协议访问过网站一次后浏览器缓存住跳转信息,下次继续用 http 请求的时候浏览器才会自动跳了而不再是请求了服务器后来跳转建议如果不是全站都转移到 https ,仅用 https 访问网站的话还是别用,还是服务器来控制跳转好些3, SSL labs 出现提示:> This server supports weak Diffie-Hellman (DH) key exchange parameters. Grade capped to B. 解决方法(下面的密钥保存目录可自定义):

mkdir -p /usr/local/nginx/conf/vhost/sslopenssl dhparam -out /usr/local/nginx/conf/vhost/ssl/dhparams.pem 2048

添加 nginx ssl 配置:

vi nginx.confssl_dhparam /usr/local/nginx/conf/vhost/ssl/dhparams.pem;```

好了,整个服务端配置完成。

版权声明:为苹果ATS和微信小程序打造Nginx HTTPS服务是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。