Nginx Tomcat 实现网站全站https 基于免费的SSL证书Let’s Encrypt
编辑:浏览器知识https好处众多,例如可以提高熊掌号分数,提高百度搜索的排名。可以支持微信小程序的后台。chrome和firefox终于不再天天说我网站不安全劝退用户了。有个小绿锁看起来也高大上!还有就是https一定是未来趋势,早升早解脱。
事先说明一下,我的本职是java后台,其余例如前端、运维、SEO都是我现学现用的,本篇博客的方案,并不是最简单直接正确明了的方式,而是我屡战屡败屡败屡战之后积累出来的,用到的原理是我都是这两天临时抱佛脚的。所以之能说作为一个参考,不一定就是完美方案,只能说是全部按照我的流程,一定可以成功。
另外全站https还有一个坑,就是不支持http https混合,否则还是会被浏览器报不安全,你必须全站所有请求 所有外链https
因此我放弃了七牛云,因为七牛云免费10G的OSS是针对HTTP,HTTPS按照我的用量每个月5块钱多点。
所以我找了青云 又拍云 腾讯云。试了一圈,首先CDN基本全体宣告,战败。十有八九是我对CDN的理解有问题。
最终选定腾讯云,因为青云又拍云都有限制,又拍云的活动也只能领取1年免费。腾讯的COS目前没规定免费的失效。
正文开始
由于我在此之前也完全没接触过,所以全程都参考了大神们的帖子。
全民https时代,Let’s Encrypt免费SSL证书的申请及使用(Tomcat版) 作者 CSDN 柳峰
https://blog.csdn.net/lyq8479/article/details/79022888
这篇文章中参考了他的 免费SSL申请和部署到tomcat中,非常顺利一次过。非常推荐
# 环境如下centos7.4 python 2.7.5 tomcat8.5
# 如果没有git需要安装一下 有的话直接跳过
# ubuntu
sudo apt install git
# centos / redhat
sudo yum install git
# 已有git从这里开始
# 使用git下载脚本
$ git clone https://github.com/letsencrypt/letsencrypt
# 进入到脚本所在目录
$ cd letsencrypt
# 查看 letsencrypt-auto 工具的用法 (个人认为这一步是必须的 不要跳过)
$ ./letsencrypt-auto –help
# 获取证书 ( 这里需要把邮箱和域名改成你自己的,域名可以是一个,也可以包含多个子域名,用-d开头,例子如下 )
# 这里有个小坑,你的80和443必须没有被占用才会执行成功,执行之前建议先临时关闭nginx tomcat
$ ./letsencrypt-auto certonly –standalone –email 12345@qq.com -d baidu.com -d www.baidu.com -d tieba.baidu.com
#必须要看到 “Congratulations! Your certificate and chain…” 才算成功,成功后会生成4个秘钥文件 位置参考上一步返回的信息
#centos的位置如下
/etc/letsencrypt/live/你的域名/cert.pem
/etc/letsencrypt/live/你的域名/chain.pem
/etc/letsencrypt/live/你的域名/fullchain.pem
/etc/letsencrypt/live/你的域名/privkey.pem
#其中最为重要的是后面两个,在后期配置cdn oss之类的,需要开启https的话,都必须填这两个的值
# 导出.p12格式的证书
$ openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out zyxx_letsencrypt.p12 -name tomcat_letsencrypt
# 再将证书由.p12格式转换成.jks格式 ( 这一步要填写三个密码,密码后面查不到的,必须记住,建议设置成一样的3个 )
$ keytool -importkeystore -deststorepass ‘password1234’ -destkeypass ‘password1234’ -destkeystore zyxx_letsencrypt.jks -srckeystore zyxx_letsencrypt.p12 -srcstoretype PKCS12 -srcstorepass ‘password1234’ -alias tomcat_letsencrypt
# 接下来会生生成一个叫做 zyxx_letsencrypt.jks 建议不移动位置,并且把*.pem 和 *.jks的所在位置都记住,后面配置都用的到
# 编辑 tomcat/conf/server.xml 加入以下这段
maxThreads=”150″ scheme=”https” secure=”true”
clientAuth=”false” sslProtocol=”TLS”
keystoreFile=”/etc/letsencrypt/live/你的域名/zyxx_letsencrypt.jks”
keystorePass=”zxxx_123″
/>
# 再次重启tomcat 通过localhost:8443 访问就可以通过了
# 此方法用的免费证书是Let’s Encrypt 证书,他的有效期只有3个月,但是目前可以无限延期。直接写个定时任务脚本,每2个月执行一次
# 强制执行续期的脚本如下 执行之前必须保持80和443畅通,也就是说要先停止nginx之类的软件,放出80 443端口。然后再启动nginx
./letsencrypt-auto renew –force-renew
# 自动续期脚本如下 新建一个renewSSL.sh 复制粘贴下面内容(我的80和443代理是用nginx,如果你占80 443的是其他软件,就把停止和启动nginx的改成tomcat、apache之类的) 必须腾出80 443端口
#!/bin/bash
systemctl stop nginx
bash /xxx/letsencrypt/letsencrypt-auto renew –force-renew
systemctl start nginx
# 复制粘贴以后再跑一下试一下,没问题以后加入定时任务 每月执行即可
crontab -e
# 加入下面这一行,意思是每月1号0点0分 执行脚本
0 0 1 * * /xxx/renewSSL.sh
# 必须重启生效
sudo service crond restart
之后的部分参考的是 nginx+tomcat https实践 作者 cnblogs 小翔No9
https://www.cnblogs.com/xiang-/p/6071499.html
我的用法是tomcat开启8080 & 8443端口 nginx再反向代理
所以下一步要做的就是让nginx反向代理8443端口到443上,再把80端口强制跳转到443
这一步和网上不太一样的是ssl_certificate ssl_certificate_key 用的是fullchain.pem privkey.pem,这样不需要额外生成别的格式
# 配置nginx.conf vim /etc/nginx/nginx.conf # 80端口强制跳转方法 server { listen 80; server_name www.tczmh.club; #rewrite ^(.*) https://$server_name$1 permanent; #这种跳转也可以,但是301更好一点 return 301 https://$server_name$request_uri; } server { listen 443; server_name www.tczmh.club; ssl on; ssl_certificate /root/xxx/fullchain.pem;#fullchain.pem所在的全路径 ssl_certificate_key /root/xxx/privkey.pem;#privkey.pem所在的全路径 ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; location / { proxy_pass https://localhost:8443; proxy_set_header Host $host:443; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_connect_timeout 3; proxy_read_timeout 3; proxy_send_timeout 3; limit_req zone=one burst=5; access_log off; break; } }
按照教程还有一个地方要配置 在tomcat/conf/server,xml
connectionTimeout=”20000″
redirectPort=”8443″
proxyPort=”8443″
到这里就大功告成了,全站支持https。再次强调,全站引用的外链,必须全体https,如果引用了例如http://xxx/jquery.js 这样的链接,会直接报错
加载全部内容