nginx从http到https

admin
admin 2019年07月15日
  • 在其它设备中阅读本文章

一、Http 与 Https 简介

HTTP:HTTP 协议是基于 C / S 架构进行通信的简单的请求 - 响应协议,而 HTTP 协议的服务器端实现程序有 nginx 等,其客户端的实现程序主要是 Web 浏览器,例如 IE、chrome。
HTTPS:是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即 HTTP 下加入 SSL 层。作用有两个:一是建立一个信息安全通道,来保证数据传输的安全;二是确认网站的真实性。

主要区别

  • https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。
  • http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
  • http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
  • http 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。
    Https 优缺点
    优点:相比于 http,https 可以提供更加优质保密的信息,保证了用户数据的安全性,此外 https 同时也一定程度上保护了服务端,使用恶意攻击和伪装数据的成本大大提高。
    缺点:第一 CA 机构颁发的证书可能需要年费;其二,https 加重了服务端的负担(相比 http 在传递信息过程中多了加密解密),会产生一些性能损耗。

二、获取数字证书

配置支持 https 的网站需要数字证书,通常是在可信任的证书授权机构申请,如果对安全性要求不高或测试可以使用自签证书。以自签证书为例,使用 openssl 一键生成 hello.com 的自签证书。执行

openssl req -x509 -days 365 -newkey rsa:4096 -nodes -keyout hello.key -out hello.crt\
-subj "/C=CN/ST=BJ/L=BJ/O=HD/OU=dev/CN=hello.com/emailAddress=hello@world.com"

将会在本目录下生成 数字证书 hello.crt 和 证书密钥 hello.key,同样的在 CA 机构申请的证书也会得到这两个文件,数字证书可以任意传播,而证书密钥要私密保存。

三、配置 nginx

这里以 debian9 为例,修改 /etc/nginx/sites-available/default 文件,关键配置如下:

# listen 80 default_server;
# listen [::]:80 default_server;

# SSL configuration
#
listen 443 ssl default_server;
listen [::]:443 ssl default_server;
ssl_certificate_key /etc/nginx/ssl/hello.key;
ssl_certificate /etc/nginx/ssl/hello.crt;

主要关闭 http 端口 80 的访问和开启 https 端口 443 的支持(当然端口可以任意指定),并且指定数字证书和证书密钥的路径(绝对路径)。

四、重定向

可以关闭 http 的访问,也可以配置 http 重定向到 https。

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