热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法

这篇文章主要介绍了Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法,即从HTTP跳转到HTTPS,需要的朋友可以参考下
HTTPS简介
HTTPS(Hyper Text Transfer Protocol Secure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传输的。HTTPS协议是在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。Https使用的默认端口是443。更多HTTPS原理可以参考阮一峰老师的文章:http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

SSL证书
证书类型简介
要设置安全服务器,使用公共钥创建一对公私钥对。大多数情况下,发送证书请求(包括自己的公钥),你的公司证明材料以及费用到一个证书颁发机构(CA)。CA验证证书请求及您的身份,然后将证书返回给您的安全服务器。
但是内网实现一个服务器端和客户端传输内容的加密,可以自己给自己颁发证书,只需要忽略掉浏览器不信任的警报即可!
由CA签署的证书为您的服务器提供两个重要的功能:

  1. 浏览器会自动识别证书并且在不提示用户的情况下允许创建一个安全连接。
  2. 当一个CA生成一个签署过的证书,它为提供网页给浏览器的组织提供身份担保。

多数支持ssl的web服务器都有一个CA列表,它们的证书会被自动接受。当一个浏览器遇到一个其授权CA并不在列表中的证书,浏览器将询问用户是否接受或拒绝连接。

制作CA证书
ca.key CA私钥:

openssl genrsa -des3 -out ca.key 2048

2015816174647523.jpg (768×167)

ca.crt CA根证书(公钥):

openssl req -new -x509 -days 365 -key ca.key -out ca.crt

2015816174708350.jpg (901×376)

制作网站的证书并用CA签名认证
这里,假设网站域名为www.example.com,生成com.example.com证书私钥:

  openssl genrsa -des3 -out www.example.com.pem 1024 

2015816174727737.jpg (826×165)

制作解密后的www.example.com证书私钥:

  openssl rsa -in www.example.com.pem -out www.example.com.key 


2015816174745612.jpg (937×71)

生成签名请求:

  openssl req -new -key www.example.com.pem -out www.example.com.csr 

2015816174821668.jpg (1005×491)

可以在Common Name中填入网站域名,即可生产该网站的证书。
用CA进行签名:

代码如下:

openssl ca -policy policy_anything -days 365 -cert ca.crt -keyfile ca.key -in www.example.com.csr -out www.example.com.crt

可能执行签名时,会出现“I am unable to access the ./demoCA/newcerts directory”问题:

2015816174842731.jpg (566×98)

解决方法:

  mkdir -p demoCA/newcerts 
  touch demoCA/index.txt 
  touch demoCA/serial 
  echo "01" > demoCA/serial 

然后,再执行签名命令即可。

基于Nginx搭建HTTPS虚拟主机
虚拟主机配置文件

  upstream sslfpm { 
    server 127.0.0.1:9000  weight=10  max_fails=3 fail_timeout=20s; 
  } 
   
  server {  
    listen    192.168.1.*:443;  
    server_name 192.168.1.*;  
     
    #为一个server开启ssl支持 
    ssl         on; 
    #为虚拟主机指定pem格式的证书文件 
    ssl_certificate   /home/wangzhengyi/ssl/wangzhengyi.crt;  
    #为虚拟主机指定私钥文件 
    ssl_certificate_key /home/wangzhengyi/ssl/wangzhengyi_nopass.key;  
    #客户端能够重复使用存储在缓存中的会话参数时间 
    ssl_session_timeout 5m; 
    #指定使用的ssl协议  
    ssl_protocols SSLv3 TLSv1;  
    #指定许可的密码描述 
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;  
    #SSLv3和TLSv1协议的服务器密码需求优先级高于客户端密码 
    ssl_prefer_server_ciphers  on;  
   
    location / {  
      root  /home/wangzhengyi/ssl/; 
      autoindex on; 
        autoindex_exact_size  off; 
        autoindex_localtime on; 
    }  
      # redirect server error pages to the static page /50x.html 
      # 
      error_page  500 502 503 504 /50x.html; 
      error_page  404 /404.html; 
   
    location = /50x.html { 
        root  /usr/share/nginx/www; 
      } 
    location = /404.html { 
        root  /usr/share/nginx/www; 
      } 
     
      # proxy the PHP scripts to fpm 
      location ~ \.php$ { 
      access_log /var/log/nginx/ssl/ssl.access.log main; 
      error_log /var/log/nginx/ssl/ssl.error.log; 
      root /home/wangzhengyi/ssl/;  
      fastcgi_param  HTTPS  on; 
        include /etc/nginx/fastcgi_params;  
        fastcgi_pass  sslfpm; 
      } 
  } 

HTTPS服务器优化
方法
SSL操作需要消耗CPU资源,所以在多处理器的系统,需要启动多个工作进程,而且数量需要不少于可用CPU的个数。最消耗CPU资源的SSL操作是SSL握手,有两种方法可以将每个客户端的握手操作数量降到最低:

保持客户端长连接,在一个SSL连接发送多个请求
在并发的连接或者后续的连接中重用SSL会话参数,这样可以避免SSL握手操作。

会话缓存用于保存SSL会话,这些缓存在工作进程间共享,可以使用ssl_session_cache指令进行配置。1M缓存可以存放约4000个会话。默认的缓存超时时间是5m,可以使用ssl_session_timeout加大它。
ssl_session_cache指令

语法:ssl_session_cache off|none|builtin:size|shared:name:size
使用环境:main,server
缓存类型:
off -- 硬关闭,nginx明确告诉客户端这个会话不可重用
none -- 软关闭,nginx告诉客户端会话能够被重用,但是nginx实际上不会重用它们
bultin -- openssl内置缓存,仅可用于一个工作进程.可能导致内存碎片
shared -- 所有工作进程的共享缓存。(1)缓存大小用字节数指定(2)每个缓存必须拥有自己的名称(3)同名的缓存可用于多个虚拟主机

优化示例

  #优化ssl服务 
  ssl_session_cache  shared:wzy:10m;  
  #客户端能够重复使用存储在缓存中的会话参数时间 
  ssl_session_timeout 10m; 

nginx强制使用https访问(http跳转到https)


基于nginx搭建了一个https访问的虚拟主机,监听的域名是test.com,但是很多用户不清楚https和http的区别,会很容易敲成http://test.com,这时会报出404错误,所以我需要做基于test.com域名的http向https的强制跳转

nginx的rewrite方法


思路
这应该是大家最容易想到的方法,将所有的http请求通过rewrite重写到https上即可

配置

  server { 
    listen 192.168.1.111:80; 
    server_name test.com; 
     
    rewrite ^(.*)$ https://$host$1 permanent; 
  } 


搭建此虚拟主机完成后,就可以将http://test.com的请求全部重写到https://test.com上了


nginx的497状态码

error code 497

  497 - normal request was sent to HTTPS 


解释:当此虚拟站点只允许https访问时,当用http访问时nginx会报出497错误码

思路
利用error_page命令将497状态码的链接重定向到https://test.com这个域名上

配置

  server { 
    listen    192.168.1.11:443; #ssl端口 
    listen    192.168.1.11:80;  #用户习惯用http访问,加上80,后面通过497状态码让它自动跳到443端口 
    server_name test.com; 
    #为一个server{......}开启ssl支持 
    ssl         on; 
    #指定PEM格式的证书文件  
    ssl_certificate   /etc/nginx/test.pem;  
    #指定PEM格式的私钥文件 
    ssl_certificate_key /etc/nginx/test.key; 
     
    #让http请求重定向到https请求  
    error_page 497 https://$host$uri?$args; 
  } 

index.html刷新网页


思路
上述两种方法均会耗费服务器的资源,我们用curl访问baidu.com试一下,看百度的公司是如何实现baidu.com向www.baidu.com的跳转

2015816174906881.png (1024×410)

可以看到百度很巧妙的利用meta的刷新作用,将baidu.com跳转到www.baidu.com.因此我们可以基于http://test.com的虚拟主机路径下也写一个index.html,内容就是http向https的跳转

index.html

   
   
   


推荐阅读
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 使用Numpy实现无外部库依赖的双线性插值图像缩放
    本文介绍如何仅使用Numpy库,通过双线性插值方法实现图像的高效缩放,避免了对OpenCV等图像处理库的依赖。文中详细解释了算法原理,并提供了完整的代码示例。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 深入理解OAuth认证机制
    本文介绍了OAuth认证协议的核心概念及其工作原理。OAuth是一种开放标准,旨在为第三方应用提供安全的用户资源访问授权,同时确保用户的账户信息(如用户名和密码)不会暴露给第三方。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 本文总结了汇编语言中第五至第八章的关键知识点,涵盖间接寻址、指令格式、安全编程空间、逻辑运算指令及数据重复定义等内容。通过详细解析这些内容,帮助读者更好地理解和应用汇编语言的高级特性。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
author-avatar
手机用户2502927203
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有