nginx双向认证

        使用自建CA配置nginx双向认证遇到的坑

一、安装部署nginx

  1. 总体说明

在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel。如果未安装以上程序,在安装nginx过程中会出现对应错误提示,可单独再安装对应依赖程序。

  • 出现 ./configure: error: C compiler cc is not found错误,安装gcc-c++
  • 出现 ./configure: error: the HTTP rewrite module requires the PCRE library错误,安装pcre-devel
  • 出现 ./configure: error: the HTTP gzip module requires the zlib library错误,安装zlib
  • 出现./configure: error: SSL modules require the OpenSSL library错误,安装OpenSSL-devel
    1. 在线一键安装依赖环境

以上依赖环境在线一键安装

yum -y install gcc pcre-devel zlib-devel openssl openssl-devel

    1. 安装gcc-c++
      1. 在线安装

# yum install gcc-c++

      1. 离线安装

1、拷贝/ gcc 文件到liunx服务器的/usr目录下

2、安装

# cd /gcc

# rpm -ivh* --force --nodeps

    1. 安装 pcre-devel
      1. 在线安装

# yum install -y pcre pcre-devel

下载位置:https://ftp.pcre.org/pub/pcre/pcre-8.37.tar.gz

      1. 离线安装

1、拷贝/ pcre-8.40.tar.gz 文件到liunx服务器的/usr目录下

2、解压pcre-8.40.tar.gz

# cd /usr

# tar -xvf pcre-8.40.tar.gz

3、编码

# cd pcre-8.40

# ./configure && make && make install

    1. 安装zlib
      1. 在线安装

# yum install -y zlib zlib-devel

      1. 离线安装

1、拷贝/ zlib-1.2.11.tar.gz 文件到liunx服务器的/usr目录下

2、解压zlib-1.2.11.tar.gz

# cd /usr

# tar -xvf zlib-1.2.11.tar.gz

3、编码

# cd zlib-1.2.11

# ./configure && make && make install

    1. 安装OpenSSL-devel
      1. 在线安装

# yum install -y openssl openssl-devel

      1. 安装OpenSSL(离线安装)
        1.  安装perl(安装前通过perl -v查看系统是否安装)

PS:已安装可以跳过此步骤

  1. 拷贝\Product\12.服务器备货专用软件\Nginx\目录下的perl-5.28.0.tar.gz文件到linux服务器的/usr目录下;
  2. 解压perl,进入/usr目录下,解压perl-5.28.0.tar.gz

# tar -zxvf perl-5.28.0.tar.gz   

  1. 进入解压目录

# cd perl-5.28.0

  1. 自定义安装目录

# ./Configure -des -Dusethreads -Dprefix=/usr/local/perl

  1. 编译和安装,依次执行以下命令

#make

#make test

#make intall

  1. 安装完成,查看版本

#perl -v

        1.  安装openssl

安装前确认perl已经安装,若没有请查看1.5.2.1步骤进行安装

  1. 拷贝\Product\12.服务器备货专用软件\Nginx目录下的openssl-1.0.2j.tar.gz文件到linux服务器/usr目录;
  2. 进入/usr目录,解压openssl-1.0.2j.tar.gz;

#tar -zxvf openssl-1.0.2j.tar.gz

  1. 进入到解压后的目录

#cd openssl-1.0.2j

  1. 配置

#./config

  1. 编译

#make

  1. 安装

#make install

  1. 安装Nginx
    1. 离线安装

下载安装包:# wget -c https://nginx.org/download/nginx-1.9.9.tar.gz

1、拷贝/ nginx-1.18.0.tar.gz 文件到liunx服务器的/usr目录下

2、解压nginx-1.18.0.tar.gz

# cd /usr

# tar -xvf nginx-1.18.0.tar.gz

  1. 配置安装模块

# cd nginx-1.18.0

如果执行了1.5.1在线安装命令,请执行以下命令

# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module  --with-stream

如果执行了1.5.2已安装openssl,请使用以下命令进行模块安装

# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module  --with-stream --with-openssl=/usr/openssl-1.0.2j/

4、编码安装

# make

#make install

  1. Nginx配置
    1. 注册Nginx服务

问题现象:-bash: nginx: command not found

解决办法:把nginx路径 配置到环境变量里

1:进入 vim /etc/profile 文件在文件最后添加一个 PATH

export PATH=$PATH:/usr/local/nginx/sbin

2:source命令使用配置立即生效

    1. nginx 自启动配置

再rc.local 文件中增加启动命令

# vim /etc/rc.local

增加一行:# /usr/local/nginx/sbin/nginx

执行权限: # chmod 777 /etc/rc.local

    1. 启动nginx

默认/nginx/conf/nginx.conf

# /usr/local/nginx/sbin/nginx

配置文件方式启动

# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

  1. Nginx 命令汇总
    1. 停止nginx

# /usr/local/nginx/sbin/nginx -s stop 

    1. 重启nginx

# /usr/local/nginx/sbin/nginx -s reload

    1. 验证配置是否成功

# /usr/local/nginx/sbin/nginx -t 

    1. 查看nginx进程

# ps -ef | grep nginx 

    1. 验证是否安装SSL模块

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

    1. P12证书转成crt和key

使用openssl命令导出.crt

openssl pkcs12 -in Sign.p12 -nokeys -out server.crt

使用openssl命令导出.key

openssl pkcs12 -in Sign.p12 -nocerts -nodes -out server.key

使用openssl命令导出.csr

openssl pkcs12 -in keystore.p12 -nokeys -out my_key_store.csr

    1. 生成自签证书
  1. 创建证书密钥文件

openssl genrsa -out server.key 2048

  1. 利用密钥生成证书请求文件,按提示输入证书信息(密码为空)

openssl req -new -key server.key -out server.csr

  1. 利用证书请求文件自成自签证书

openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt

二、配置nginx

    ssl_certificate /usr/local/nginx/ssl_cert/server.crt;  // ssl证书 证书名称需要跟 域名一致
    ssl_certificate_key /usr/local/nginx/ssl_cert/server.key; //ssl证书私钥

    ssl_client_certificate /usr/local/nginx/ssl_cert/cacert.pem; //客户端证书链
    ssl_verify_client on; //双向认证
    ssl_verify_depth 3; //就这个配置被坑了,着重记录,自签CA使用3级CA作为客户端证书的证书链

  • ssl_verify_depth  这个参数是使用受信证书能成功进行客户端验证的关键,注意它的值是 3

因为当 ssl_verify_depth 设置为 1( Nginx 的默认值)的时候,服务端只会接受直接被 CA 签发的客户端证书或自签名的证书。也就是说,直接尝试使用中级 CA 来验证客户端是无法通过的,OpenSSL 会自动的去找中级 CA 的签发者并一层层验证上去,直到找到根证书。

所以,就算将中级 CA 和根 CA 都放在信任证书列表中,由于最终 ssl_verify_depth 为 2 的缘故,验证还是通不过的。

因此,在实际使用的时候,需要注意以下两点:

  • CA 文件中必须同时存在 中级 CA 和根 CA,必须构成完整证书链,不能少任何一个;

  • 默认的验证深度 ssl_verify_depth 是 1,中级 CA 签发的客户端证书一律无法通过认证,需要增大该值,所以我们上面配置中 ssl_verify_depth 值为 3 。

    ssl_session_timeout  5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers  on;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值