Nginx Tomcat 实现网站全站https 基于免费的SSL证书Let's Encrypt
2018-08-25
阅读 {{counts.readCount}}
评论 {{counts.commentCount}}
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 加入以下这段
- <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
- maxThreads="150" scheme="https" secure="true"
- clientAuth="false" sslProtocol="TLS"
- keystoreFile="/etc/letsencrypt/live/你的域名/zyxx_letsencrypt.jks" <!-- 这里必须填写上一步生成的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
- <Connector port="8080" protocol="HTTP/1.1"
- connectionTimeout="20000"
- <!-- 要加下面这两个东西在8080端口 第一个应该默认就有了,主要是第二个 -->
- redirectPort="8443"
- proxyPort="8443"
到这里就大功告成了,全站支持https。再次强调,全站引用的外链,必须全体https,如果引用了例如http://xxx/jquery.js 这样的链接,会直接报错
评论区空空如也,赶紧添加一条评论吧
评论 {{counts.commentCount}}
{{comment.name}}
{{comment.os}}
{{comment.browser}}
{{comment.reply.name}}
{{comment.reply.os}}
{{comment.reply.browser}}