正在加载中,请稍后
author 首页 关于 笔记

按回车搜索更多

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中,非常顺利一次过。非常推荐

  1. # 环境如下centos7.4 python 2.7.5 tomcat8.5
  2.  
  3. # 如果没有git需要安装一下 有的话直接跳过
  4. # ubuntu
  5. sudo apt install git
  6. # centos / redhat
  7. sudo yum install git
  8.  
  9. # 已有git从这里开始
  10.  
  11. # 使用git下载脚本
  12. $ git clone https://github.com/letsencrypt/letsencrypt
  13.  
  14. # 进入到脚本所在目录
  15. $ cd letsencrypt
  16.  
  17. # 查看 letsencrypt-auto 工具的用法 (个人认为这一步是必须的 不要跳过)
  18. ./letsencrypt-auto --help
  19.  
  20. # 获取证书 ( 这里需要把邮箱和域名改成你自己的,域名可以是一个,也可以包含多个子域名,用-d开头,例子如下 )
  21. # 这里有个小坑,你的80和443必须没有被占用才会执行成功,执行之前建议先临时关闭nginx tomcat
  22. ./letsencrypt-auto certonly --standalone --email 12345@qq.com -d baidu.com -d www.baidu.com -d tieba.baidu.com
  23.  
  24. #必须要看到 "Congratulations! Your certificate and chain..." 才算成功,成功后会生成4个秘钥文件 位置参考上一步返回的信息
  25. #centos的位置如下
  26. /etc/letsencrypt/live/你的域名/cert.pem
  27. /etc/letsencrypt/live/你的域名/chain.pem
  28. /etc/letsencrypt/live/你的域名/fullchain.pem
  29. /etc/letsencrypt/live/你的域名/privkey.pem
  30. #其中最为重要的是后面两个,在后期配置cdn oss之类的,需要开启https的话,都必须填这两个的值
  31.  
  32. # 导出.p12格式的证书
  33. $ openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out zyxx_letsencrypt.p12 -name tomcat_letsencrypt
  34.  
  35. # 再将证书由.p12格式转换成.jks格式 ( 这一步要填写三个密码,密码后面查不到的,必须记住,建议设置成一样的3个 )
  36. $ keytool -importkeystore -deststorepass 'password1234' -destkeypass 'password1234' -destkeystore zyxx_letsencrypt.jks -srckeystore zyxx_letsencrypt.p12 -srcstoretype PKCS12 -srcstorepass 'password1234' -alias tomcat_letsencrypt
  37.  
  38. # 接下来会生生成一个叫做 zyxx_letsencrypt.jks 建议不移动位置,并且把*.pem 和 *.jks的所在位置都记住,后面配置都用的到
  39.  
  40. # 编辑 tomcat/conf/server.xml 加入以下这段
  41. <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
  42. maxThreads="150" scheme="https" secure="true"
  43. clientAuth="false" sslProtocol="TLS"
  44. keystoreFile="/etc/letsencrypt/live/你的域名/zyxx_letsencrypt.jks" <!-- 这里必须填写上一步生成的zyxx_letsencrypt.jks的全路径 -->
  45. keystorePass="zxxx_123" <!-- 这里必须填写上一步设置的密码 -->
  46. />
  47.  
  48. # 再次重启tomcat 通过localhost:8443 访问就可以通过了
  49.  
  50. # 此方法用的免费证书是Let's Encrypt 证书,他的有效期只有3个月,但是目前可以无限延期。直接写个定时任务脚本,每2个月执行一次
  51. # 强制执行续期的脚本如下 执行之前必须保持80和443畅通,也就是说要先停止nginx之类的软件,放出80 443端口。然后再启动nginx
  52. ./letsencrypt-auto renew --force-renew
  53.  
  54. # 自动续期脚本如下 新建一个renewSSL.sh 复制粘贴下面内容(我的80和443代理是用nginx,如果你占80 443的是其他软件,就把停止和启动nginx的改成tomcat、apache之类的) 必须腾出80 443端口
  55.  
  56. #!/bin/bash
  57. systemctl stop nginx
  58. bash /xxx/letsencrypt/letsencrypt-auto renew --force-renew
  59. systemctl start nginx
  60.  
  61.  
  62. # 复制粘贴以后再跑一下试一下,没问题以后加入定时任务 每月执行即可
  63. crontab -e
  64. # 加入下面这一行,意思是每月1号0点0分 执行脚本
  65. 0 0 1 * * /xxx/renewSSL.sh
  66. # 必须重启生效
  67. 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,这样不需要额外生成别的格式

  1. # 配置nginx.conf
  2. vim /etc/nginx/nginx.conf 
  3. # 80端口强制跳转方法
  4. server {
  5.     listen    80;
  6.     server_name   www.tczmh.club;
  7.     #rewrite ^(.*) https://$server_name$1 permanent; #这种跳转也可以,但是301更好一点
  8.     return 301 https://$server_name$request_uri;
  9. }
  10.  
  11. server {
  12.     listen    443;
  13.     server_name    www.tczmh.club;
  14.     ssl on;
  15.     ssl_certificate    /root/xxx/fullchain.pem;#fullchain.pem所在的全路径
  16.     ssl_certificate_key    /root/xxx/privkey.pem;#privkey.pem所在的全路径
  17.     
  18.     ssl_session_cache    shared:SSL:1m;
  19.     ssl_session_timeout    5m;
  20.     
  21.     ssl_ciphers    HIGH:!aNULL:!MD5;
  22.     ssl_prefer_server_ciphers    on;
  23.     location / {
  24.         proxy_pass https://localhost:8443;
  25.         proxy_set_header Host $host:443;
  26.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  27.         proxy_set_header X-Forwarded-Proto https;
  28.         proxy_connect_timeout 3;
  29.         proxy_read_timeout 3;
  30.         proxy_send_timeout 3;
  31.         limit_req zone=one burst=5;
  32.         access_log off;
  33.         break;
  34.     }
  35.     
  36. }

按照教程还有一个地方要配置 在tomcat/conf/server,xml

  1. <Connector port="8080" protocol="HTTP/1.1"
  2.                connectionTimeout="20000"
  3.                <!-- 要加下面这两个东西在8080端口 第一个应该默认就有了,主要是第二个 -->
  4.                redirectPort="8443" 
  5.                proxyPort="8443"

 


到这里就大功告成了,全站支持https。再次强调,全站引用的外链,必须全体https,如果引用了例如http://xxx/jquery.js 这样的链接,会直接报错

 

 

提交
评论区空空如也,赶紧添加一条评论吧 评论 {{counts.commentCount}}
{{comment.name}} {{comment.os}} {{comment.browser}}
{{dateFormatter(comment.createTime)}}

{{comment.message}}

{{comment.reply.name}} {{comment.reply.os}} {{comment.reply.browser}}
{{dateFormatter(comment.reply.createTime)}}

{{comment.reply.message}}

zzzmh
关于我 留言板

网址导航

{{alert.message}}
留言板 * 站长不经常查看信箱 若有重要事宜联系邮箱 admin@zzzmh.cn 取消 发送