中秋假期,闲来无事。花了一下午折腾了下https,说实话这年头还有网站不上https显然是折腾精神不够啊~

1、SSL证书评估

看了市面上各种类型的证书,有收费的也有免费的,但是最终还是选择了腾讯云提供的TrustAsia一年免费期的证书,没有次数限制,可以过期后再次申请。最主要的原因还是我懒,哈哈~~

2、SSL证书安装

从腾讯云将申请的证书下载到本地,解压获得3个文件夹,分别是Apache、IIS、Nginx 服务器的证书文件,可以根据自己的实际情况,安装在三种服务器上。

我这里使用Nginx做前端转发。更多的介绍可以查看文档:https://cloud.tencent.com/document/product/400/4143

2.1 获取证书

Nginx文件夹内获得SSL证书文件 1_www.domain.com_bundle.crt 和私钥文件 2_www.domain.com.key,
1_www.domain.com_bundle.crt 文件包括两段证书代码 “-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”,
2_www.domain.com.key 文件包括一段私钥代码“-----BEGIN RSA PRIVATE KEY-----”和“-----END RSA PRIVATE KEY-----”。

2.2 证书安装

将域名 www.domain.com 的证书文件1_www.domain.com_bundle.crt 、私钥文件2_www.domain.com.key保存到同一个目录,例如/usr/local/nginx/conf目录下。
更新Nginx根目录下 conf/nginx.conf 文件如下:

  1. server {
  2. listen 443;
  3. server_name www.domain.com; #填写绑定证书的域名
  4. ssl on;
  5. ssl_certificate 1_www.domain.com_bundle.crt;
  6. ssl_certificate_key 2_www.domain.com.key;
  7. ssl_session_timeout 5m;
  8. ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
  9. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
  10. ssl_prefer_server_ciphers on;
  11. location / {
  12. root html; #站点目录
  13. index index.html index.htm;
  14. }
  15. }

配置完成后,先用bin/nginx –t来测试下配置是否有误,正确无误的话,重启nginx。就可以使用 https://www.domain.com 来访问了。

注:

配置文件参数 说明
listen 443 SSL访问端口号为443
ssl on 启用SSL功能
ssl_certificate 证书文件
ssl_certificate_key 私钥文件
ssl_protocols 使用的协议
ssl_ciphers 配置加密套件,写法遵循openssl标准

2.3 使用全站加密,http自动跳转https(可选)

对于用户不知道网站可以进行https访问的情况下,让服务器自动把http的请求重定向到https。
在服务器这边的话配置的话,可以在页面里加js脚本,也可以在后端程序里写重定向,当然也可以在web服务器来实现跳转。Nginx是支持rewrite的(只要在编译的时候没有去掉pcre)
在http的server里增加rewrite ^(.*) https://$host$1 permanent;
这样就可以实现80进来的请求,重定向为https了。

3、证书安装的一系列问题。

3.1 端口号问题

需要注意的是,我们通常使用的80端口作为http默认访问的端口,而在https中使用的443端口,这个是需要特别注意的,我在安装过程中一开始就没有注意端口号的问题,导致https一直没有生效,后来问了公司的运维同学才知道,耽误了很长的时间。

3.2 http跳转https

一般我们的网站支持https之后,就不在支持http的访问了。这时候就需要把http的访问请求,重定向到https。实现的过程也很简单,新增一个server,然后加入以下配置。

  1. server {
  2. listen 80;
  3.  
  4. location / {
  5. rewrite (.*) https://www.laoyeye.net;
  6. }
  7. }

直接将80端口的访问,全部转发到网站的https域名,其实我这个写的还不是很规范,一般不会将域名写死,而是根据请求的域名做重定向的。

3.3 一级域名跳转二级域名的问题

一般我们的网站很多都想让www作为网站的首页,这是一个二级域名,而我们默认的一级域名,如laoyeye.net是不提供服务的,这个时候就需要将https访问这个域名的请求重定向到www域名,实现的过程也很简单。

  1. server {
  2. listen 443;
  3. server_name laoyeye.net; #填写绑定证书的域名
  4. ssl on;
  5. ssl_certificate 1_www.laoyeye.net_bundle.crt;
  6. ssl_certificate_key 2_www.laoyeye.net.key;
  7. ssl_session_timeout 5m;
  8. ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置
  9. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置
  10. ssl_prefer_server_ciphers on;
  11. location / {
  12. rewrite (.*) http://www.laoyeye.net;
  13. }
  14. }
  1. 需要注意的是这里处理的是https://laoyeye.net链接,而http://laoyeye.net在上面端口80的监听中是已经做了处理的。

3.4 400 Bad Request | The plain HTTP request was sent to HTTPS port

完成上述的配置,基本上访问http://www.laoyeye.net/,还是http://laoyeye.net/,亦或是https://laoyeye.net/,均会跳转到https://www.laoyeye.net/。但是我发现个别的链接访问会出现400错误,搞了一下午才弄清问题所在。

原因主要是我在后端逻辑处理的时候使用了重定向,后端重定向后返回的是http链接,就会出现这个问题。

解决办法也很多,很多人会改tomcat的配置,让重定向后的链接直接是https形式的。其实我不怎么喜欢这种方式,因为这样做的侵入性太大。当换一个tomcat服务器后,可能你并不会想起这个配置。

既然我们是在nginx上配置的ssl,这里我们还是从nginx上想办法。

在location种加入如下配置

  1. proxy_redirect http:// https://;

这句话的作用是对发送给客户端的URL进行修改, 将http协议强制转为https,完成这个配置后就不会出现400的问题了。

当然我还有一些个人的配置问题,比如QQ互联的回调地址啦,也是需要修改http为https才能正常使用。

附Nginx入门以及我的配置参考:

一、Nginx安装手册

三、nginx实现反向代理负载均衡

我的nginx配置供参考:

  1. user root;
  2. worker_processes 1;
  3.  
  4. #error_log logs/error.log;
  5. #error_log logs/error.log notice;
  6. #error_log logs/error.log info;
  7.  
  8. #pid logs/nginx.pid;
  9.  
  10. events {
  11. worker_connections 1024;
  12. }
  13.  
  14. http {
  15. include mime.types;
  16. default_type application/octet-stream;
  17.  
  18. upstream tomcat_server {
  19. server xxxx:xxxx;
  20. }
  21.  
  22. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  23. # '$status $body_bytes_sent "$http_referer" '
  24. # '"$http_user_agent" "$http_x_forwarded_for"';
  25.  
  26. #access_log logs/access.log main;
  27.  
  28. sendfile on;
  29. #tcp_nopush on;
  30.  
  31. #keepalive_timeout 0;
  32. keepalive_timeout 65;
  33.  
  34. #gzip on;
  35.  
  36. server {
  37.  
  38. listen 80;
  39.  
  40. location / {
  41.  
  42. rewrite (.*) https://www.laoyeye.net;
  43.  
  44. }
  45.  
  46. }
  47.  
  48. server {
  49. listen 443;
  50. server_name laoyeye.net;
  51.  
  52. ssl on;
  53. ssl_certificate 1_www.laoyeye.net_bundle.crt;
  54. ssl_certificate_key 2_www.laoyeye.net.key;
  55. ssl_session_timeout 5m;
  56. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  57. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  58. ssl_prefer_server_ciphers on;
  59.  
  60. #charset koi8-r;
  61.  
  62. #access_log logs/host.access.log main;
  63.  
  64. location / {
  65. rewrite (.*) https://www.laoyeye.net;
  66. }
  67.  
  68. #error_page 404 /404.html;
  69.  
  70. # redirect server error pages to the static page /50x.html
  71. #
  72. error_page 500 502 503 504 /50x.html;
  73. location = /50x.html {
  74. root html;
  75. }
  76.  
  77. # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  78. #
  79. #location ~ \.php$ {
  80. # proxy_pass http://127.0.0.1;
  81. #}
  82.  
  83. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
  84. #
  85. #location ~ \.php$ {
  86. # root html;
  87. # fastcgi_pass 127.0.0.1:9000;
  88. # fastcgi_index index.php;
  89. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  90. # include fastcgi_params;
  91. #}
  92.  
  93. # deny access to .htaccess files, if Apache's document root
  94. # concurs with nginx's one
  95. #
  96. #location ~ /\.ht {
  97. # deny all;
  98. #}
  99. }
  100. server {
  101. listen 443;
  102. server_name www.laoyeye.net;
  103. ssl on;
  104. ssl_certificate 1_www.laoyeye.net_bundle.crt;
  105. ssl_certificate_key 2_www.laoyeye.net.key;
  106. ssl_session_timeout 5m;
  107. ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  108. ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
  109. ssl_prefer_server_ciphers on;
  110.  
  111. location / {
  112.  
  113. #域名www.laoyeye.net的请求全部转发到tomcat_server即tomcat服务上
  114. proxy_pass http://tomcat_server;
  115. proxy_set_header Host $host:$server_port;
  116. proxy_set_header X-Real-IP $remote_addr;
  117. proxy_set_header X-Real-PORT $remote_port;
  118. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  119.  
  120. # 必须配置:
  121. proxy_set_header X-Forwarded-Proto $scheme;
  122.  
  123. # 作用是对发送给客户端的URL进行修改, 将http协议强制转为https
  124. proxy_redirect http:// https://;
  125. index index.jsp index.html index.htm;
  126.  
  127. }
  128.  
  129. }
  130.  
  131. # another virtual host using mix of IP-, name-, and port-based configuration
  132. #
  133. #server {
  134. # listen 8000;
  135. # listen somename:8080;
  136. # server_name somename alias another.alias;
  137.  
  138. # location / {
  139. # root html;
  140. # index index.html index.htm;
  141. # }
  142. #}
  143.  
  144. # HTTPS server
  145. #
  146. #server {
  147. # listen 443 ssl;
  148. # server_name localhost;
  149.  
  150. # ssl_certificate cert.pem;
  151. # ssl_certificate_key cert.key;
  152.  
  153. # ssl_session_cache shared:SSL:1m;
  154. # ssl_session_timeout 5m;
  155.  
  156. # ssl_ciphers HIGH:!aNULL:!MD5;
  157. # ssl_prefer_server_ciphers on;
  158.  
  159. # location / {
  160. # root html;
  161. # index index.html index.htm;
  162. # }
  163. #}
  164.  
  165. }

记一次全站升级https引发的一系列问题的更多相关文章

  1. 为什么非全站升级HTTPS不可?

    升级HTTPS已经是大势所趋,但仍有大量互联网企业犹豫是否要全站升级HTTPS,为此本文梳理了全站升级HTTPS与部分升级HTTPS的优劣势对比,来判断是否真的有必要进行全站HTTPS升级. HTTP ...

  2. 记一次centos6升级salt-minion启动失败的问题

    记一次centos6升级salt-minion启动失败的问题 作者:耀耀 blog:https://www.liuyao.me 一.起因 升级Salt-minion后 使用/etc/init.d/sa ...

  3. iOS 升级HTTPS通过ATS你所要知道的

    由于苹果规定2017年1月1日以后,所有APP都要使用HTTPS进行网络请求,否则无法上架,因此研究了一下在iOS中使用HTTPS请求的实现.网上搜索了一些比较有用资料,大家可以参考下 苹果强制升级的 ...

  4. 我是如何将网站全站启用Https的?-记录博客安装配置SSL证书全过程

    评论»   文章目录 为什么要Https 如何选择Https 安装部署SSL证书 平滑过渡Https 搜索引擎的响应 启用Https小结 正如大家所看到的,部落全站已经启用了Https访问了,连续几天 ...

  5. iOS升级HTTPS通过ATS你所要知道的

    由于苹果规定2017年1月1日以后,所有APP都要使用HTTPS进行网络请求,否则无法上架,因此研究了一下在iOS中使用HTTPS请求的实现.网上搜索了一些比较有用资料,大家可以参考下 苹果强制升级的 ...

  6. 阿里云免费购买SSL证书,nginx无缝升级https

    最近在升级交流学习社区,觉得有必要升级成https.以下是自己在升级中记录. 以下包括以下部分: 一.阿里云免费购买SSL证书 1.自己在阿里云申请了免费的,然后自己支付0元,购买了SSL证书 2.我 ...

  7. 网站HTTP升级HTTPS完全配置手册

    本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 今天,所有使用Google Chrome稳定版的用户迎来了v68正式 ...

  8. 网站 HTTP 升级 HTTPS 完全配置手册

    网站 HTTP 升级 HTTPS 完全配置手册 今天,所有使用Google Chrome稳定版的用户迎来了v68正式版首个版本的发布,详细版本号为v68.0.3440.75,上一个正式版v67.0.3 ...

  9. centos7编译安装nginx及无缝升级https

    安装依赖: yum install -y gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel 下载nginx: wget -c  ...

随机推荐

  1. 在 if 条件句中使用向量

    上述例子的函数中,都只输入了单一值.如果我们提供一个向量,那么这个函数将产生警告,这是因为 if 语句不能与多值向量共存.check_ _positive(c(1,-1,0))## Warning i ...

  2. Java中的注解基础

    一.元注解 元注解的作用就是负责注解其他注解. 1.@Target @Target用来指明注解所修饰的目标,包括packages.types(类.接口.枚举.Annotation类型).类型成员(方法 ...

  3. ThinkPHP 3.2 调用自定义函数库

    ThinkPHP3.2 和3.1 区别还是有点大的 引入了命名空间,强化了驱动化和行为,增强了模块化的概念和对云平台的支持,并改进了诸多的细节.主要改进包括:模块化架构的全新设计全新命名空间和自动导入 ...

  4. Appium 自动化测试(8) -- Appium Python client -- API

    最好的学习方法,就是看源码! 在  \appium\webdriver\webdriver.py ,新增了两个封装好定位安卓元素的方法,如  find_element_by_accessibility ...

  5. vue 点击按钮 input框架获取焦点的方法

    在按钮事件里加上这一段this.$nextTick(() =>{ this.$refs.input.focus()})

  6. 动态更新ViewPager中的Fragment(替换Fragment)

    1.最近做需求,遇到一个问题,一个Fragment中包含了一个ViewPager,viewPager中包含一adapter ,adapter中包含了4个Fragment.想要动态替换第3个Fragme ...

  7. 免费获取一年 AVG Internet Security 2014 和 Antivirus Pro 2014

    华为版的 AVG 2014 系列出炉了,用过华为版 2013 系列的童鞋都知道是什么回事,内置一年多的序列号不用那么麻烦去找了. 下载地址: 内置的许可证是:IBY9X-ESYXT-W4BZQ-QI4 ...

  8. python中实现上下文管理器的两种方法

    上下文管理器: python中实现了__enter__和__exit__方法的对象就可以称之为上下文管理器 实现方法一举例: def File(object): def __init__(self, ...

  9. Yii Model

    REFs 自动生成代码 创建第一个Yii应用 创建模型 Yii 用户登陆机制

  10. create newline in Github Bio

    /********************************************************************************* * create newline ...