NGINX部署HTTPS

0x00 前言

nginx是一款高性能的Web服务器,可以用作反向代理和负载均衡。随着HTTPS的不断推进,越来越多的网站都开始转到HTTPS方式,HTTP仅仅作为重定向到HTTPS的途径。

本文介绍了如何在Ubuntu 16.04服务器上搭建基于nginx的HTTPS服务器,并且支持SNI。

0x01 准备域名和HTTPS证书

域名分为免费域名和收费域名

免费域名

免费域名包含一级域名和二级域名。

一级域名推荐的是:TK域名,每次申请12个月以下是免费的,到期前14天可以免费续期。不过网上说可能会被收回,不过我还没有遇到(估计是我访问量太小吧)。

二级域名就比较多了,但是质量参差不齐,很多只能修改A记录,而且很有可能子域名被用作非法用途导致被列入黑名单,浏览器访问时可能会有拦截提示。

收费域名

如果可以的话,尽量还是购买收费的域名,比如腾讯云,经常会有活动(1元购买域名之类)。要绑定国内服务器,域名还需要备案,使用腾讯云的话备案只要提供少量信息,不用自己邮寄材料,总共花了大概40天左右。

证书可以分为自签名证书(Self-Signed Certificate)、个人网站证书、企业网站证书。

自签名证书

该类型证书可以通过以下命令行创建:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out certificate.crt -subj '/CN=<SERVER-IP>'

完成后会在当前目录创建私钥文件(privateKey.key)和证书文件(certificate.crt)。部署后浏览器会提示不安全的证书。

由于该类型证书无法通过验证,通常只在某些特殊场景下使用(如HTTPS抓包)。

个人网站证书

通常可以申请免费的个人网站证书,如腾讯云(https://buy.cloud.tencent.com/ssl)。该类型证书基本可以满足个人使用,建议使用。

企业网站证书

该类型证书可以提供企业认证,泛域名等,收费一般较高。不建议个人使用。

0x02 部署服务器

安装nginx

apt install nginx -y

使用如下命令确认是否支持HTTPSSNI

root@VM-171-28-ubuntu:/# nginx -V
nginx version: nginx/1.10.3 (Ubuntu)
built with OpenSSL 1.0.2g  1 Mar 2016
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fPIE -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_addition_module --with-http_dav_module --with-http_geoip_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_v2_module --with-http_sub_module --with-http_xslt_module --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-threads

TLS SNI support enabled表示SNI已经启用;--with-http_ssl_module表示支持HTTPS

创建配置文件

将证书文件和私钥文件放到/etc/nginx/ssl目录下。在/etc/nginx/conf.d目录下创建mysite.conf文件。内容如下:

server {
    listen 80;
    return 400;
}

server {
    listen 80;
    server_name mysite.com;
    return 301 https://$server_name$request_uri;
}

server{
    listen 443 default;
    ssl on;
    ssl_certificate /etc/nginx/ssl/default.crt;
    ssl_certificate_key /etc/nginx/ssl/default.key;
    return 400;
    access_log /data/log/nginx/default.access.log;
}

server{
    #比起默认的80 使用了443 默认 是ssl方式  多出default之后的ssl
    listen 443;
    #开启  如果把ssl on;这行去掉,ssl写在443端口后面。这样http和https的链接都可以用
    ssl on;
    #证书(公钥.发送到客户端的)
    ssl_certificate /etc/nginx/ssl/mysite.crt;
    #私钥,
    ssl_certificate_key /etc/nginx/ssl/mysite.key;
    #下面是绑定域名
    server_name mysite.com;

    location / {
        proxy_redirect off; #禁止跳转
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #配置反向代理
        proxy_pass http://127.0.0.1:8081;
    }
        
    access_log /data/log/nginx/mysite.access.log;
}

前两个server配置项是为了已配置域名使用HTTP访问时,强制跳转到HTTPS;ip或未配置域名访问时,返回400错误。

第三个server配置项中使用了default.crt证书,这是个自签名证书,是为了当用户通过ip或未配置域名使用HTTPS访问时,能够返回400错误。本来是想做成SSL握手时只要发现没有传SNI或不支持的域名时,就直接断开连接。但是,发现貌似nginx不支持这一特性(参考此链接),只能使用这种折中的解决方法。

重启nginx

systemctl restart nginx

如果没有报错的话,HTTPS服务就可以正常访问了。

0x03 后记

使用nginx反向代理的优点是:可以使用nginx实现HTTPS,而自己的Web服务使用HTTP。这样,开发、调试都很方便,也便于使用负载均衡。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯云API

腾讯云 API 最佳实践:保护你的密钥

使用腾讯云 API 时,你需要用密钥来签名你的 API 请求。腾讯云接收到你的请求后,会比对你的签名串和实际请求参数。

8.7K110
来自专栏知晓程序

如何搭建微信小程序 HTTPS 服务器?只需三个步骤

1.2K20
来自专栏魏艾斯博客www.vpsss.net

补充记录腾讯云 DNSPod 域名 API 申请 Let’s Encrypt 泛域名 SSL 证书需要注意的几点

刚写完了腾讯云 DNSPod 域名 API 申请 Let’s Encrypt 泛域名 SSL 证书这篇教程,感觉中间有几点是新手需要注意的,申请 SSL 泛域名...

58740
来自专栏云端架构

【云端架构】常见电脑开放端口及含义

说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端口,当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描,使用IP地址...

64070
来自专栏企鹅号快讯

Tomcat的设置HTTP页面自动跳转到HTTPS

HTTP转换到HTTPS常见的解决方案是部署SSL证书来升级。只有正确部署了SSL证书才能使用安全的HTTPS。但有时候,客户端使用HTTP进行访问时,HTTP...

41150
来自专栏签桶

RFC 7519 JWT介绍

服务端要存储登陆状态,这对单机模式没什么用影响,对于集群模式是很大的挑战,为了方便横向扩展,要把这些登陆态拆出来,常见的做法是写入redis集群和持久化sess...

29400
来自专栏醉梦轩

NGINX部署HTTPS

1.7K50
来自专栏魏艾斯博客www.vpsss.net

补充记录腾讯云 DNSPod 域名 API 申请 Let’s Encrypt 泛域名 SSL 证书需要注意的几点

21940
来自专栏安富莱嵌入式技术分享

【RL-TCPnet网络教程】第33章 SMTP简单邮件传输协议基础知识

本章节为大家讲解SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)的基础知识,方便后面章节的实战操作。

20420
来自专栏BestSDK

3秒钟,用python破解加密PDF|附工具地址

文中将介绍如果利用开源工具、python代码等秒破加密的pdf文件。 ? 过程分析 因为pdf文件加密的密码是随机的,而且密码不长。首先,我们需要指导pdf的加...

89550

扫码关注云+社区

领取腾讯云代金券