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 条评论
登录 后参与评论

相关文章

来自专栏技术博文

ssh证书登录

ssh有密码登录和证书登录,初学者都喜欢用密码登录,甚至是root账户登录,密码是123456。但是在实际工作中,尤其是互联网公司,基本都是证书登录的。内网的机...

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

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

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

4954
来自专栏云计算教程系列

如何在Debian 9中为Apache创建自签名SSL证书

TLS或传输层安全性及其前身SSL(代表安全套接字层)是用于将正常流量包装在受保护的加密包装中的Web协议。

792
来自专栏谈补锅

免费真机调试 -- Xcode7

  刚新安装了Xcode7 Version 7.1 beta , 据说这个版本可以免费真机调试,于是用了一个新的AppID测试了,发现真的可以免费真机调试了呢!...

1463
来自专栏hrscy

iOS集成极光推送iOS集成极光推送

苹果APNs(英文全称:Apple Push Notification Service)

1552
来自专栏玩转JavaEE

Spring Cloud Config服务端配置细节(二)之加密解密

在微服务架构中,由于独立的服务个数众多,加上前期测试工作量大,一些原本由运维人员维护的敏感信息会被我们直接写在微服务中,以提高开发效率,但是这种明文存储方式显然...

3074
来自专栏進无尽的文章

兼容-记录Xcode8.0恢复插件全过程

Xcode 的插件大大丰富了 Xcode 的功能,而且有了 Alcatraz ,插件的管理也非常容易,但是有个非常恼人的问题:一旦升级 Xcode ,插件就失效...

1242
来自专栏知晓程序

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

2512
来自专栏ShaoYL

苹果开发者证书创建和设置真机调试

45016
来自专栏云计算教程系列

如何使用CentOS 7上的Let's Encrypt来保护Apache

本教程将向您展示如何在运行Apache作为Web服务器的CentOS 7服务器上设置来自Let's Encrypt的TLS / SSL证书。此外,我们将介绍如何...

320

扫码关注云+社区