最近把公司的微信公众号,从HTTP升级到了HTTPS,过程还是非常坎坷的,参考了不少的文章,也踩过很多坑,所以这里想和大家分享一下。
如果有同学也是使用Nginx +Tomcat,或许这篇文章可以会帮上你大忙哦。
刚开始使用Openssl制作证书,但是制作证书完成后发现不受信任,就像下面这样:
Openssl制作证书可以参考下面两篇文章:
https://segmentfault.com/a/1190000004976222(Linux)
http://www.cnblogs.com/vincent-li666/p/5851463.html(Windows)
如果要消除这种状况,就必须向CA申请,这个一般是要收费的。还好,有免费的CA,也就是我们今天的主角,Let's Encrypt.
Linux:
1. 下载 certbot
1. $ git clone https://github.com/certbot/certbot
2. $ cd certbot
3. $ ./certbot-auto --help
2. 生成免费证书
./certbot-auto certonly --webroot --agree-tos -v -t --email
邮箱地址
-w
网站根目录
-d
网站域名
./certbot-auto certonly --webroot --agree-tos -v -t --email keeliizhou@gmail.com -w /path/to/your/web/root -d note.crazy4code.com
注意这里 默认会自动生成 /网站根目录/.well-known/acme-challenge,然后 shell 脚本会对应的访问 网站域名/.well-known/acme-challenge
如果返回正常就确认了你对这个网站的所有权,就能顺利生成
3. 获取证书
如果上面的步骤正常 shell 脚本会展示如下信息:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/
网站域名
/fullchain.pem
4. 生成 dhparams
使用 openssl 工具生成dhparams
openssl dhparam -out /etc/ssl/certs/dhparams.pem 2048
5. 配置 Nginx
打开 nginx server 配置文件加入如下设置:
listen 443 ssl;
ssl_certificate/etc/letsencrypt/live/网站域名/fullchain.pem;
ssl_certificate_key/etc/letsencrypt/live/网站域名/privkey.pem;
ssl_dhparam/etc/ssl/certs/dhparams.pem;
ssl_protocolsSSLv3TLSv1TLSv1.1TLSv1.2;
ssl_ciphersHIGH:!aNULL:!MD5;
location / {
proxy_pass **Tomcat Server**
}
然后重启 nginx 服务就可以了
参考:
https://zhuanlan.zhihu.com/p/21286171
http://mp.weixin.qq.com/s/vxRpZU6DNoewrQZLDW7YDA (通配符证书,一键子域名开启 HTTPS)
Windows:
1. 下载Let's Encrypt Windows认证客户端
http://files.cnblogs.com/files/teamblog/letsencrypt-win-simple.V1.9.1.zip
2. 解压缩,打开letsencrypt.exe
3. 设置提醒邮箱
4. 按Y同意条款
5. 按M方式认证
6. 在你想要上https的域名的后台文件里,加入对"/.well-known/acme-challenge/*"形式访问的处理
7. 输入你想转为https的域名
8. 验证文件的域名(如果用我的代码,就还输入你的域名就行,验证原理是访问你输入的值+/.well-known/acme-challenge/+生成的随机码)
9. 证书到这里就生成成功了
10. 由于Let's Encrypt是免费的SSL证书,90天就过期了,需要再次认证,贴心的Let's Encrypt客户端程序会自动帮你生成验证脚本,不要关闭窗口,继续往下走就行
11. 确认帮你创建定时任务(不确定的话90天后SSL证书过期,就不是https了)
12. 输入该计算机(服务器)的管理员帐号密码
13. 证书部分完成,可以关闭该窗口了
14. 找到生成的证书文件,默认路径在 C:\Users\Administrator\AppData\Roaming\letsencrypt-win-simple\httpsacme-v01.api.letsencrypt.org\主要使用如下两个文件:
XXX-chain.pem
XXX-key.pem
15. 配置Nginx:
server {
listen 443 ssl;
server_name localhost;
ssl_certificate XXX-chain.pem;
ssl_certificate_key XXX-key.pem;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass **Tomcat Server**
}
}
重启Nginx,大功告成
参考:
https://www.cnblogs.com/blog5277/p/6375473.html
https://www.cnblogs.com/teamblog/p/6219204.html
Nginx(HTTPS) + Tomcat(HTTP)
是不是很开心?但是到这里还没有完,我们搭建的是Nginx +Tomcat
如果Nginx变成了https,而Tomcat依然使用http的话,你仍然无法正常访问,会出现:
Provisional headers are shown
不过也很简单,只需要修改一下Tomcat的server.xml文件就可以,修改connection如下:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" proxyPort="443"/>
参考:
https://www.oschina.net/question/12_213459
至此,全部搞定!