使用nginx把 http 向https升级

时间:2023-01-23 14:22:40

为什么要使用 HTTPS ?

首先来说一下 HTTP 与 HTTPS 协议的区别吧,他们的根本区别就是 HTTPS 在 HTTP 协议的基础上加入了 SSL 层,在传输层对网络连接进行加密。简单点说在 HTTP 协议下你的网站是光着身子在奔跑,但到了 HTTPS 下你穿了一件衣服,别人看不到你的肌肉了(当然,这好像不是好事,不重要),更安全了一点点,就大概这个意思。 SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。采用 HTTPS 的服务器必须从证书颁发机构 CA(Certificate Authority)申请一个用于证明服务器用途类型的证书,当然一般都有收费,而且不便宜,其实你也可以通过 OpenSSL 自己造一个证书,这样有一个弊端是大家都不信任你造的证书。那怎么办?

你必须知道的步骤

通过上面的简单介绍你应该知道了,要想你的网站支持 HTTPS ,就必须有一个被信任的证书,那这个证书就必须由证书颁发机构(如VeriSign、Microsoft等)颁发的,否则你就会遇到如打开 12306.cn 这样的您的连接不是私密连接的尴尬。

使用nginx把 http 向https升级

你肯定不想用户打开后,你的网站是上面这样的,身边有好多朋友买票时问过我这是什么意思?我都没办法解释给他们,哎。所以你需要要有下面几个东西:

  • 一个域名(你肯定有)
  • Web 服务器(Nginx,Apache,IIS都行)
  • SSL 证书(最好 CA 机构颁发的)

就完了,上面三个东西可能最麻烦就是搞到一个被全世界都信任的证书了,没关系,现在我试着让你免费获取一个,注意是免费!!!

提供免费的证书商也就那么几个,最知名的可能是 StartSSL ,其他我还知道 Let's Encrypt ,不过这里我用的是国内腾讯云的。

感谢腾讯云

对于得到一个受信任的证书很简单,找第三方证书颁发机构购买就行了,但是一个每年大几千的证书费用对于小企业或个人来说,有点接受不了,或者是没钱。现在好了,腾讯云认证用户可以申请到赛门铁克(Symantec)免费的 TrustAsia DV SSL 证书了。

登录腾讯云管理平台

SSL 证书申请地址在这里: https://console.qcloud.com/ssl,点击申请证书,会弹出下面的框:

使用nginx把 http 向https升级

上面显示什么价值1900元/年,不要管,点击确认按钮。弹出表单你填写你要绑定的域名就行了:

使用nginx把 http 向https升级

接下来会验证你的域名,简单说就是验证一下这个域名是不是你的,所以你要在域名解析添加一条 CName 记录,实在不懂的话,官方也有怎么添加的文档。

使用nginx把 http 向https升级

一般验证过程会很快,几个小时吧,申请通过后,这时候你看到状态是已颁发后,就能下载证书了。

使用nginx把 http 向https升级

下载下来你打开文件会看到Nginx,Apache,IIS三个文件夹,里边放的就是对应各个服务器的证书。到这里,整个证书申请流程就算完了,接下来就是配置 Web 服务器来支持网站的 HTTPS 访问了。我这里用的 Nginx 演示。

Nginx 平滑升级以支持 HTTPS

要想让 Web服务器支持 HTTPS ,首先你的服务器肯定要支持 SSL ,所以我们先检查 Nginx 是否支持 SSL :

/usr/local/nginx/sbin/nginx -V

通过命令显示信息,我们看configure arguments中是否有-with-http_ssl_module字样,如果像我这样没有的话,你就需要重新编译 Nginx 以支持 SSL 了。如果有,请跳过这步骤,直接看Nginx 配置 HTTPS 服务那一节。

安装 Nginx 可能大家都会,不会的可以看 从零开始学 Java - CentOS 下安装 Nginx,但是平滑升级 Nginx 可能你没有体验过,这样说吧,在线上服务器环境下,你要支持 HTTPS 访问,但是你发现你的 Nginx 不支持 SSL ,你肯定不能卸载 Nginx 重新安装时加载 SSL 模块,因为那是线上服务器。你只能在现有安装的 Nginx 下进行无痛升级以以支持 SSL ,这就用到了 Nginx 的平滑升级概念。

找到你之前安装 Nginx 时的编译目录,如果你和我一样找不到或许删除了,那我们就需要重新下载一个 Nginx 了,当然我们是通过 wget方式,看命令:

wget -c https://nginx.org/download/nginx-1.10.1.tar.gz tar -zxvf nginx-1.10.1.tar.gz cd nginx-1.10.1

配置,加入 SSL 模块:

./configure --with-http_ssl_module make

注意,千万不能在像安装的时候make install了,因为我们这是升级。

备份原 Nginx 执行脚本

mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old

把新版本 Nginx 编译脚本放到可执行文件目录下

cd objs/ cp nginx /usr/local/nginx/sbin/

进行平滑升级,命令:

make upgrade

使用nginx把 http 向https升级

这时候会输出这些信息:

/usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful kill -USR2 `cat /usr/local/nginx/logs/nginx.pid` sleep 1 test -f /usr/local/nginx/logs/nginx.pid.oldbin kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`

没问题之后接下来,查看现在目前版本及安装模块:

/usr/local/nginx/sbin/nginx -V

看到已经从 1.4.6 版本升级到了 1.10.1,而且这种升级不影响正常访问的。线上环境操作也是可以的。

Nginx 配置 HTTPS 服务

编辑配置文件:

cd /usr/local/nginx/conf vim nginx.conf

拉到最下面,会看到 HTTPS 配置被注释掉了。嗯,这是模板,我们就在这配置。

使用nginx把 http 向https升级

文字版:

server { listen 443 ssl; server_name www.domain.com; ssl on; ssl_certificate 1_www.domain.com_bundle.crt; ssl_certificate_key 2_www.domain.com.key; ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }

把上面的ssl_certificatessl_certificate_key替换成你下载下来的证书存放路径就行,记着下载下来的证书这种配置是放在/usr/local/nginx/conf目录下的,当然你也可以随意放。

这时候,你就可以打开浏览器访问一下试试了。正常情况 HTTPS 请求是打不开的,因为我们还没设置防火墙,记得要开放443端口!,嗯,设置过防火墙就可以正常访问了吧。

其实到这里,这个服务器支持 HTTPS 请求流程已经结束了,但是你发现好多人在浏览器地址栏输入域名的时候都不输入http://https://的,因为浏览器会自动帮我们加上http://的,所以,这时候输入我们刚刚设置的域名其实还是没有走https://请求,那怎么让就是输入http://也走HTTPS呢?

很简单,Nginx 中这样配置就行啦!

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

我们利用rewrite来做跳转。监听到80端口的 HTTP 请求后,就转发到 HTTPS ,当然还有好多处理方式。

这篇文章讲了一下怎么申请免费的 HTTPS 证书,然后利用 Nginx 服务器来配置 HTTPS 请求访问,并其中顺手平滑升级 Nginx,如丝般顺滑的升级,不影响正常访问。HTTPS 方式的传输对我们网站来说应该是提高了一些安全性的,况且这种方式又很简单,可以试着搞一搞。


第二篇文章:

使用ssl模块配置同时支持http和https并存

一,生成证书

# 1、首先,进入你想创建证书和私钥的目录,例如:
cd /etc/nginx/

# 2、创建服务器私钥,命令会让你输入一个口令:
openssl genrsa -des3 -out server.key 1024

# 3、创建签名请求的证书(CSR):
openssl req -new -key server.key -out server.csr

# 4、在加载SSL支持的Nginx并使用上述私钥时除去必须的口令:
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key


# 5、最后标记证书使用上述私钥和CSR:
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

二,配置nginx

cd /etc/nginx
vim nginx.conf
#
# HTTPS server configuration
#
server {
listen 443;
server_name 本机的IP地址;

ssl on;
ssl_certificate /etc/nginx/server.crt;
ssl_certificate_key /etc/nginx/server.key;

ssl_session_timeout 5m;

# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;

location / {
#root html;
#index testssl.html index.html index.htm;
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://IP地址/ssl/;
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

重启nginx,在浏览器输入:https://IP地址 会跳转到 http://IP地址/ssl/ 这个地址(后期调整为webservice接口地址即可)

三、受浏览器信任的StartSSL免费SSL证书:

跟VeriSign一样,StartSSL(网址:http://www.startssl.com,公司名:StartCom)也是一家CA机构,

它的根证书很 久之前就被一些具有开源背景的浏览器支持(Firefox浏览器、谷歌Chrome浏览器、苹果Safari浏览器等)。

四、项目需要,将访问目录 \services\ 由http访问 重定向到 https (解决方法:nginx rewrite 加上 location 方式实现)

location ~ /services/.*$ {
if ($server_port ~ "^80$"){
set $rule_0 1$rule_0;
}
if ($rule_0 = "1"){
rewrite /(.*) https://IP地址/$1 permanent; break;
}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

五,配置结束上传以后用nginx -t 测试下配置无误 就reload一下nginx服务 检查443端口是否在监听

/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful (显示表示配置文件没有错误)

service nginx reload (重新加载nginx服务)
netstat -lan | grep 443 (查看443端口)
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN (有看到这一行 就表示HTTPS已经在工作了)



第三篇文章:

一、什么是 SSL 证书,什么是 HTTPS
SSL 证书是一种数字证书,它使用 Secure Socket Layer 协议在浏览器和 Web 服务器之间建立一条安全通道,从而实现:
1、数据信息在客户端和服务器之间的加密传输,保证双方传递信息的安全性,不可被第三方窃听;
2、用户可以通过服务器证书验证他所访问的网站是否真实可靠。

HTTPS 是以安全为目标的 HTTP 通道,即 HTTP 下加入 SSL 加密层。HTTPS 不同于 HTTP 的端口,HTTP默认端口为80,HTTPS默认端口为443。

推荐阅读:

基于OpenSSL实现C/S架构中的HTTPS会话 http://www.linuxidc.com/Linux/2013-05/84477.htm

RHEL6.3下配置简单Apache HTTPS  http://www.linuxidc.com/Linux/2013-02/78874.htm

Nginx搭建HTTPS服务器 http://www.linuxidc.com/Linux/2013-01/78263.htm

Linux实现HTTPS方式访问站点 http://www.linuxidc.com/Linux/2012-08/69429.htm

二、什么网站需要使用SSL证书
1、购物交易类网站
不用多说,网上银行、支付宝、Paypal等肯定会全程加密以保护你的信息安全。

2、注册与登陆
一些大的网站,比如电子邮箱,注册会员或者登陆的时候,会专门通过SSL通道,保证密码安全不被窃取。

3、某些在线代理
这个。。。嗯哼,就不说了。

4、装B
比如我……

三、自行颁发不受浏览器信任的SSL证书
为晒晒IQ网颁发证书。ssh登陆到服务器上,终端输入以下命令,使用openssl生成RSA密钥及证书。

# 生成一个RSA密钥 
$ openssl genrsa -des3 -out 33iq.key 1024

# 拷贝一个不需要输入密码的密钥文件
$ openssl rsa -in 33iq.key -out 33iq_nopass.key

# 生成一个证书请求
$ openssl req -new -key 33iq.key -out 33iq.csr

# 自己签发证书
$ openssl x509 -req -days 365 -in 33iq.csr -signkey 33iq.key -out 33iq.crt

第3个命令是生成证书请求,会提示输入省份、城市、域名信息等,重要的是,email一定要是你的域名后缀的。这样就有一个 csr 文件了,提交给 ssl 提供商的时候就是这个 csr 文件。当然我这里并没有向证书提供商申请,而是在第4步自己签发了证书。

使用nginx把 http 向https升级

编辑配置文件nginx.conf,给站点加上HTTPS协议

server {
server_name YOUR_DOMAINNAME_HERE;
listen 443;
ssl on;
ssl_certificate /usr/local/nginx/conf/33iq.crt;
ssl_certificate_key /usr/local/nginx/conf/33iq_nopass.key;
# 若ssl_certificate_key使用33iq.key,则每次启动Nginx服务器都要求输入key的密码。
}

重启Nginx后即可通过https访问网站了。

自行颁发的SSL证书能够实现加密传输功能,但浏览器并不信任,会出现以下提示:

使用nginx把 http 向https升级

四、受浏览器信任的证书
要获取受浏览器信任的证书,则需要到证书提供商处申请。证书授证中心,又叫做CA机构,为每个使用公开密钥的用户发放一个数字证书。浏览器在默认情况下内置了一些CA机构的证书,使得这些机构颁发的证书受到信任。VeriSign即是一个著名的国外CA机构,工行、建行、招行、支付宝、财付通等网站均使用VeriSign的证书,而网易邮箱等非金融网站采用的是中国互联网信息中心 CNNIC颁发的SSL证书。一般来说,一个证书的价格不菲,以VeriSign的证书为例,价格在每年8000元人民币左右。

据说也有免费的证书可以申请。和VeriSign一样,StartSSL也 是一家CA机构,它的根证书很久之前就被一些具有开源背景的浏览器支持(Firefox浏览器、谷歌Chrome浏览器、苹果Safari浏览器等)。后 来StartSSL竟然搞定了微软:在升级补丁中,微软更新了通过Windows根证书认证(Windows Root Certificate Program)的厂商清单,并首次将StartCom公司列入了该认证清单。现在,在Windows 7或安装了升级补丁的Windows Vista或Windows XP操作系统中,系统会完全信任由StartCom这类免费数字认证机构认证的数字证书,从而使StartSSL也得到了IE浏览器的支持。(来源及申请步骤

五、只针对注册、登陆进行https加密处理
既然HTTPS能保证安全,为什么全世界大部分网站都仍旧在使用HTTP呢?使用HTTPS协议,对服务器来说是很大的负载开销。从性能上考虑,我 们无法做到对于每个用户的每个访问请求都进行安全加密(当然,Google这种大神除外)。作为一个普通网站,我们所追求的只是在进行交易、密码登陆等操 作时的安全。通过配置Nginx服务器,可以使用rewrite来做到这一点。

在https server下加入如下配置:

if ($uri !~* "/logging.php$")
{
rewrite ^/(.*)$ http://$host/$1 redirect;
}
 

在http server下加入如下配置:

if ($uri ~* "/logging.php$")
{
rewrite ^/(.*)$ https://$host/$1 redirect;
}
 

这样一来,用户会且只会在访问logging.php的情况下,才会通过https访问。

更新:有一些开发框架会根据 $_SERVER['HTTPS'] 这个 PHP 变量是否为 on 来判断当前的访问请求是否是使用 https。为此我们需要在 Nginx 配置文件中添加一句来设置这个变量。遇到 https 链接重定向后会自动跳到 http 问题的同学可以参考一下。

server {
    ...
    listen 443;
    location \.php$ {
        ...
        include fastcgi_params;
        fastcgi_param HTTPS on; # 多加这一句
    }
}
 
server {
    ...
    listen 80;
    location \.php$ {
        ...
        include fastcgi_params;
    }
}

参考链接:

Nginx下只针对logging.php进行https处理的重写规则 http://www.linuxidc.com/Linux/2013-08/88272.htm

全球可信并且唯一免费的HTTPS(SSL)证书颁发机构:StartSSL  http://www.linuxidc.com/Linux/2011-11/47478.htm

Nginx 的详细介绍请点这里
Nginx 的下载地址请点这里