Nginx配置ssl加密实现https访问

背景

关于https和ssl等基本概念,可以参考之前的博文。 今天我们主要讲一下具体在Nginx里面如何配置使用。

默认的Nginx安装是没有使用SSL模块的,我们可以在编译安装nginx时加入 –with-http_ssl_module 选项。如果我们是从一开始就直接安装编译很简单,但是如果是我们在最开始的时候没有编译这个模块的话,那么如何来将它加入呢 ?  我们来实践一下:

在已经安装的nginx上,增加ssl模块

1. 使用 Nginx -V 命令查看Nginx版本以及它已经安装的模块

从上面的命令我们得到了Nginx的版本号,以及 prefix前缀安装路径,以及它已经安装的模块。

2. 下载对应的Nginx源码包,重新编译,加入模块

3. 执行make,但不要执行 make install (否则会形成覆盖)

4. 执行完之后替换nginx可执行二进制文件

5. 再次执行 nginx -V 验证Nginx是否已经加入了对应的模块 

6. 启动Nginx,开始正常使用 

注:以上过程均在测试环境中完成,生产环境请谨慎参考。

Nginx改造为https提供服务

比如我们的网站需要实现全站https,这时候就需要对Nginx进行重新配置:

注:server.key 和 server.pem 需要放在此配置文件对应的上级目录中。

SSL相关参数解读:

  • ssl_certificate :证书其实代表公钥,在与客户端的交互过程中它会被发送到客户端。
  • ssl_certificate_key :是公钥对应的私钥,用来解密的,所以它的权限要得到保护但nginx的主进程能够读取。
  • ssl_protocals :用来强制用户连接只能引入SSL/TLS那些强壮的协议版本和强大的加密算法。
  • ssl_ciphers:选择加密套件,不同的浏览器所支持的套件(和顺序)可能会不同。这里指定的是OpenSSL库能够识别的写法。
  • ssl_prefer_server_ciphers on :设置协商加密算法时,优先使用我们服务端的加密套件,而不是客户端浏览器的加密套件。
  • ssl_session_timeout:客户端可以重用会话缓存中ssl参数的过期时间。

Nginx 配置http与https共存

很多情况下,因为业务需求的不同,我们往往需要http与https共存,即部分域名走http,部分域名走https,我们来简单的研究下这种配置方式:

其实挺简单的,没啥区别,把80端口的配置copy一份出来,略作修改,加上https的ssl相关参数即可。

Nginx实现双向ssl认证

我们上面的讲的ssl认证是单向的,都是客户端去认证被访问的站点域名是否真实可信,并对传输过程加密,但服务器端并没有认证客户端是否可信。 (实际上除非特别重要的场景,也没必要去认证访问者,除非像银行U盾这样的情况,因为这也是一种成本,通信的效率也会降低)

要实现双向认证HTTPS,nginx服务器上必须导入CA证书(根证书/中间级证书),因为现在是由服务器端通过CA去验证客户端的信息。还有必须在申请服务器证书的同时,用同样的方法生成客户证书。取得客户证书后,还要将它转换成浏览器识别的格式(大部分浏览器都认识PKCS12格式):

然后把这个 client.p12 发给你相信的人,让它导入到浏览器中,访问站点建立连接的时候nginx会要求客户端把这个证书发给自己验证,如果没有这个证书就拒绝访问。

同时别忘了在 nginx.conf 里配置信任的CA:(如果是二级CA,请把根CA放在后面,形成CA证书链)

 

参考

http://seanlook.com/2015/05/28/nginx-ssl/

发表评论