设为首页 收藏本站
查看: 1349|回复: 0

[经验分享] nginx 1.9.7安装使用

[复制链接]

尚未签到

发表于 2018-11-8 11:01:43 | 显示全部楼层 |阅读模式
  本文介绍nginx 1.9.7的安装,并启用http、https访问。
  By 泪痕之木
  实验环境
  操作系统:CentOS 6.7
  IP:192.168.80.60
  主机名:CentOS6
  YUM软件包安装:CentOS默认提供的在线YUM源
  openssl版本:openssl-1.0.2d.tar.gz(openssl官网获取)
  nginx版本:nginx-1.9.7.tar.gz(nginx官网获取)
1 依赖包安装
  安装openssl和nginx之前,需要先安装一些依赖包:gcc、pcre、zlib
  1、nginx gzip模块需要zlib库
  2、nginx rewrite模块需要pcre库
  3、nginx ssl模块需要openssl库
  [root@centos6 ~]# yum install gcc\* pcre\* zlib\* –y
2 Nginx安装
  将nginx和openssl源码包上传至服务器,这里上传到了 /root 目录
DSC0000.png

  openssl解压即可,并不需要安装
  [root@centos6 ~]# tar zxvf openssl-1.0.2d.tar.gz
  [root@centos6 ~]# tar zxvf nginx-1.9.7.tar.gz
  [root@centos6 ~]# cd nginx-1.9.7
  配置nginx安装选项
  [root@centos6 nginx-1.9.7]# ./configure --prefix=/usr/local/nginx --with-openssl=/root/openssl-1.0.2d --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module
  --with-openssl= 指定openssl源码包解压后的路径
  --with-http_ssl_module 启用SSL模块
  配置完毕后可以看到一个配置概要,概要中的5项必须都有了相应的库支持
DSC0001.png

  安装nginx
  [root@centos6 nginx-1.9.7]# make && make install
  安装完毕后,安装包和解压后的文件都可以删除
  [root@centos6 nginx-1.9.7]# cd ..
  [root@centos6 ~]# rm -fr openssl* nginx*
3 Nginx访问
3.1 HTTP访问
  关闭防火墙,并取消防火墙开机自启动
  [root@centos6 ~]# service iptables stop
  [root@centos6 ~]# chkconfig iptables off
  启动Nginx
  [root@centos6 ~]# cd /usr/local/nginx
  [root@centos6 nginx]# ./sbin/nginx
  Nginx启动后,查看HTTP端口已经监听,HTTP端口默认为80
  [root@centos6 nginx]# netstat -an|grep :80
DSC0002.jpg

  使用浏览器访问如下地址,如果出现截图页面,证明Nginx访问成功
  http://192.168.80.60
DSC0003.jpg

  
3.2 HTTPS访问
  首先需使用openssl生成PEM格式证书(或使用Windows证书颁发机构生成PFX格式证书,再转换为PEM格式)供nginx ssl模块使用。此部分请参考本人另外的文章《openssl安装使用》或《ActiveDirectory证书服务》。
3.2.1 修改nginx.conf
  创建ssl目录,将证书和私钥上传至/usr/local/nginx/conf/ssl目录
  [root@centos6 nginx]# mkdir conf/ssl
DSC0004.png

  编辑nginx配置文件,开启SSL访问,指定SSL协议、证书、私钥文件
  [root@centos6 nginx]# vim conf/nginx.conf
DSC0005.png

  将上述部分配置注释取消,并修改为如下配置
  这里使用的通配符证书:*.lhzm.com
  # HTTPS server
  #
  server {
  listen 443 ssl;
  server_name www.lhzm.com;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_certificate ssl/lhzmcert.pem;
  ssl_certificate_key ssl/lhzmkey.pem;
  ssl_session_cache shared:SSL:1m;
  ssl_session_timeout 5m;
  ssl_ciphers HIGH:!aNULL:!MD5;
  ssl_prefer_server_ciphers on;
  location / {
  root html;
  index index.html index.htm;
  }
  }
  由于私钥加密,所以配置了HTTPS之后,重新启动nginx需要输入私钥加密口令

  [root@centos6 nginx]# sbin/nginx -s>  Enter PEM pass phrase: 123456
DSC0006.png

  经测试,使用reload重新启动nginx后,HTTPS并不生效,必须重启系统。
  系统重新启动后,启动nginx,查看443端口是否开放
  [root@centos6 nginx]# netstat -an | grep :443
DSC0007.jpg

3.2.2 添加本地解析
  如果在安装nginx的本机访问nginx,在/etc/hosts文件中添加本地解析
  [root@centos6 nginx]# vim /etc/hosts
DSC0008.jpg

  如果在其他外部计算机访问nginx,例如一台Windows,则在Windows添加本地解析
DSC0009.png

DSC00010.jpg

DSC00011.jpg

3.2.3 验证访问
  使用浏览器打开https://www.lhzm.com
  可以看到如下提示:不受信任的连接。
  由于颁发证书的CA不受本计算机信任,所以发布的证书也不被信任。通常我们访问的银行等HTTPS站点为什么没有这个提示呢?因为这些公众HTTPS站点的证书购买自一些受信任的第三方证书颁发机构,而这些第三方证书颁发机构的根证书默认已经内置在我们的计算机,所以他们发布的证书被信任。
  添加例外
DSC00012.jpg

  确认安全例外
DSC00013.png

  HTTPS访问成功
DSC00014.jpg

  点击锁状图标-更多信息
DSC00015.png

  可以看到和HTTPS站点通信使用的密码套件
DSC00016.jpg

  查看证书,可以看到证书的信息和颁发该证书的CA的信息
DSC00017.jpg

3.3 SSL语法
3.3.1 ssl
  语法:ssl [on|off]
  默认值:ssl off
  使用字段:main, server
  开启HTTPS
  说明:较新版本的nginx,例如本文使用的nginx 1.9.7,可以直接使用语法: listen 443 ssl
3.3.2 ssl_certificate
  语法:ssl_certificate file
  默认值:ssl_certificate cert.pem
  使用字段:main, server
  为这个虚拟主机指定PEM格式的证书文件,这个文件可以包含其他的证书和服务器私钥,同样,密钥也必须是PEM格式,0.6.7版本以后,这里的路径为相对于nginx.conf的路径,而不是编译时的prefix路径。
3.3.3 ssl_certificate_key
  语法:ssl_certificate_key file
  默认值:ssl_certificate_key cert.pem
  使用字段:main, server
  为这个虚拟主机指定PEM格式的私钥,0.6.7版本以后,这里的路径为相对于nginx.conf的路径,而不是编译时的prefix路径。
3.3.4 ssl_client_certificate
  语法:ssl_client_certificate file
  默认值:none
  使用字段:main, server
  指出包含PEM格式的CA(root)证书,它将用于检查客户端证书。
3.3.5 ssl_dhparam
  语法:ssl_dhparam file
  默认值:none
  使用字段:main, server
  该指令指定了一个PEM格式的文件,其中包含的Diffie-Hellman密钥协商协议密码参数,它将用于服务器和客户端之间的会话密钥交换。(翻译来自Google。- -!)
  原文:This directive specifies a file containing Diffie-Hellman key agreement protocol cryptographic parameters, in PEM format, utilized for exchanging session keys between server and client
3.3.6 ssl_ciphers
  语法:ssl_ciphersfile
  默认值:ssl_ciphers  HIGH:!aNULL:!MD5;
  使用字段:main,server
  指出为建立安全连接,服务器所允许的密码格式列表,密码指定为OpenSSL支持的格式,每个密码之间用“ : ”分开。
  查看当前安装的OpenSSL版本所支持的密码列表(也就是ssl_ciphers可以写入的值),可以使用下列命令:
  [root@centos6 ~]# openssl ciphers
DSC00018.png

  详细列出所有加密套件。包括ssl版本(SSLv2 、SSLv3以及 TLS)、密钥交换算法、身份验证算法、对称算法、摘要算法。
  -V会多显示一列密码套件的编号,可根据这个唯一编号查找到唯一对应的密码套件。
  [root@centos6 ~]# openssl ciphers -v
  [root@centos6 ~]# openssl ciphers -V
DSC00019.png DSC00020.png

DSC00021.png 以上面截图为例:

  0xC0,0x14:密码套件的编号(可参考本人openssl文章中的密码套件列表)。
  ECDHE-RSA-AES256-SHA:密码套件的名称,可以写在ssl_ciphers后的具体值。
  SSLv3:协议版本。
  Kx:密钥交换算法,Kx+Au构成完整的密钥交换机制。
  Au:数字签名算法,Kx+Au构成完整的密钥交换机制。aNULL代表没有数字签名。
  Enc:数据加密算法。eNULL代表数据没有加密。
  Mac:消息验证码算法,即加密后的散列值。(消息验证码有两种计算方式,一种是利用已有的加密算法,如DES等直接对摘要值进行加密处理;另一种是使用专门的MAC算法。HMAC,基于MD5或者SHA)
  指定密码套件:直接在ssl_ciphers后面写入密码套件名称
  ssl_ciphers  AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:!aNULL:!eNULL:!MD5;
  禁用某个密码套件:在ssl_ciphers后面写入密码套件名称,并在套件名称前加“ !”
  ssl_ciphers  HIGH:!AES256-SHA256:!AES128-SHA256:!AES256-SHA:!AES128-SHA:!aNULL:!MD5;
  指定或禁用一类密码套件——例如指定或禁用ECDHE类密码套件
  首先在openssl验证该类别名有效
  openssl ciphers –V ‘ECDHE’    密码套件类别和名称都可以这么验证
DSC00022.png

  在ssl_ciphers指定或禁用——例如这里禁用下列密码套件和密码套件类别
  ssl_ciphers   HIGH:!DH:!ECDH:!RC4:!SRP:!PSK:!IDEA:!CAMELLIA:DES-CBC3-SHA:!DES-CBC3-SHA:!AES128-GCM-SHA256:!AES256-GCM-SHA384:!aNULL:!eNULL:!MD5;
  aNULL——代表无数字签名
DSC00023.png

  eNULL——代表数据没有加密
DSC00024.png

  NULL——代表密码套件名中有NULL的类别
DSC00025.png

  ssl-ciphers配置完毕后,必须有可用的密码套件
  没有密码套件符合——出现下图错误有2种原因
  1、密码套件名称或类别拼写错误;
  2、没有密码套件可显示(如这里全部用的是“非哪些密码套件”,自然没有密码套件显示)
DSC00026.png

  例:通过指定和禁用的方式得出同样的密码套件(注意禁用方式中必须写一个HIGH)
DSC00027.png

  HIGH——安全度较高的密码套件
DSC00028.png

  密钥交换算法+身份认证算法+加密算法+散列算法
  1)可指定全部4个算法,也可只指定部分的项(如下面2种组合和3种组合);
  2)不同项前后顺序无所谓;
DSC00029.png

3.3.7 ssl_crl
  语法:ssl_crl file
  默认值:none
  使用字段:http, server
  指令可用于0.8.7以后版本,用于指定一个证书吊销列表的文件名,使用PEM格式,它将用于检查证书吊销状态。
3.3.8 ssl_prefer_server_ciphers
  语法:ssl_prefer_server_ciphers [on|off]
  默认值:ssl_prefer_server_ciphers off
  使用字段:main, server
  依赖SSLv3和TLS协议的服务器密码将优先于客户端密码。
3.3.9 ssl_protocols
  语法:ssl_protocols [SSLv2] [SSLv3] [TLSv1]
  默认值:ssl_protocols SSLv2 SSLv3 TLSv1
  使用字段:main, server
  指定要开启的SSL协议。
3.3.10 ssl_verify_client
  语法:ssl_verify_client on|off|optional
  默认值:ssl_verify_client off
  使用字段:main, server
  启用客户端身份验证,参数“optional”将使用客户端提供的证书检查它的权限(0.8.7与0.7.63版本之前为”ask”)。
3.3.11 ssl_verify_depth
  语法:ssl_verify_depth number
  默认值:ssl_verify_depth 1
  使用字段:main, server
  设置服务器按顺序检查客户端提供的证书链的长度。
3.3.12 ssl_session_cache
  语法:ssl_session_cache off|none|builtin:size and/or shared:name:size
  默认值:ssl_session_cache off
  使用字段: main, server
  设置储存SSL会话的缓存类型和大小。
  缓存类型为:
  off - 强制关闭:nginx告诉客户端这个会话已经不能被再次使用。
  none - 非强制关闭:nginx告诉客户端这个会话可以被再次使用,但是nginx实际上并不使用它们,这是为某些使用ssl_session_cache的邮件客户端提供的一种变通方案,可以使用在邮件代理和HTTP服务器中。
  builtin - 内建OpenSSL缓存,仅能用在一个工作进程中,缓存大小在会话总数中指定,注意:如果要使用这个类型可能会引起内存碎片问题,具体请查看下文中参考文档。
  shared - 缓存在所有的工作进程中共享,缓存大小指定单位为字节,1MB缓存大概保存4000个会话,每个共享的缓存必须有自己的名称,相同名称的缓存可以使用在不同的虚拟主机中。
  可以同时使用两个缓存类型,内建和共享,如:
  ssl_session_cache builtin:1000 shared:SSL:10m;
  但是,使用共享缓存而不使用内建缓存将更为有效。
  0.8.34版本之前如果ssl_verify_client设置为'on'或者'optional'时这里不能设置为none或off。
  注意,为了让缓存恢复工作,你需要在服务器为SSL socket配置默认服务器,例如:
  listen [::]:443 ssl default_server;

  这是因为缓存的重用发生在任何TLS扩展启用之前,即服务器名称认证(Server Name>  最好的方法是将ssl_session_cache放到http字段,这样下面配置的server/虚拟主机字段都将得到相同的SSL缓存配置。
3.3.13 ssl_session_timeout
  语法:ssl_session_timeout time
  默认值:ssl_session_timeout 5m
  使用字段: main, server
  设置客户端能够反复使用储存在缓存中的会话参数时间。
3.3.14 ssl_engine
  语法:ssl_engine
  指定使用的OpenSSL引擎,如Padlock,例如PadLock,下列命令可以查看你的OpenSSL支持的引擎:
3.3.15 openssl engine
  Debian系统在版本0.9.8o的OpenSSL运行后返回:
  $ openssl engine
  (padlock) VIA PadLock (no-RNG, no-ACE)
  (dynamic) Dynamic engine loading support
  内置变量
  ngx_http_ssl_module模块支持下列内建变量:
  $ssl_cipher - 返回建立的SSL连接中那些使用的密码字段。
  $ssl_client_serial - 返回建立的SSL连接中客户端证书的序列号。
  $ssl_client_s_dn - 返回建立的SSL连接中客户端证书的DN主题字段。
  $ssl_client_i_dn - 返回建立的SSL连接中客户端证书的DN发行者字段。
  $ssl_protocol - 返回建立的SSL连接中使用的协议。
  $ssl_session_id - 需要0.8.20以上版本。
  $ssl_client_cert
  $ssl_client_raw_cert
  $ssl_client_verify - 如果客户端证书审核通过,这个变量为“SUCCESS”。
  非标准错误代码
  这个模块支持一些非标准的HTTP错误代码,可以借助error_page指令用于调试:
  495 - 检查客户端证书时发生错误。
  496 - 客户端无法提供必须的证书。
  497 - 传送到HTTPS的普通请求。
  在请求完整的废除后调试完成,并取得一些内置变量,如:$request_uri, $uri, $arg等。
3.4 信任证书
  如果希望信任一个证书或信任一个CA,可以将该用户证书或CA证书导入本地计算机“受信任的根证书颁发机构”。之后再访问使用该用户证书的站点或该使用该CA发布证书的站点,默认站点将被信任。
  这里演示CA证书导入到Windows计算机的“受信任的根证书颁发机构”。
  首先,将由openssl生成的CA证书cacert.pem更改后缀名,修改为Windows识别的.crt后缀。
DSC00030.png

  双击证书后,安装证书
DSC00031.png

  本地计算机
DSC00032.jpg

  浏览至“受信任的根证书颁发机构”
DSC00033.jpg

  完成
DSC00034.jpg

  导入成功,确定
DSC00035.png

  说明:上面讲述的理论是正确的,但随着现在操作系统和浏览器的安全机制不断加强,实际操作时该方法一般并不生效,因为浏览器等关联了更多的证书验证方式,不再仅仅依靠内置的根证书验证。
  可以参考下图以搜狗浏览器为例的两个站点对比,其中www.lhzm.com使用了自己搭建CA的证书,并已经将证书导入“受信任的根证书颁发机构”。
DSC00036.png

DSC00037.png



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-632331-1-1.html 上篇帖子: Nginx支持shtml-IT人的网络人生 下篇帖子: Nginx 的location配置详解
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表