使用自建CA配置nginx双向认证遇到的坑
一、安装部署nginx
- 总体说明
在安装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
- 在线一键安装依赖环境
以上依赖环境在线一键安装
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
-
- 安装gcc-c++
- 在线安装
- 安装gcc-c++
# yum install gcc-c++
-
-
- 离线安装
-
1、拷贝/ gcc 文件到liunx服务器的/usr目录下
2、安装
# cd /gcc
# rpm -ivh* --force --nodeps
-
- 安装 pcre-devel
- 在线安装
- 安装 pcre-devel
# yum install -y pcre pcre-devel
下载位置:https://ftp.pcre.org/pub/pcre/pcre-8.37.tar.gz
-
-
- 离线安装
-
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
-
- 安装zlib
- 在线安装
- 安装zlib
# yum install -y zlib zlib-devel
-
-
- 离线安装
-
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
-
- 安装OpenSSL-devel
- 在线安装
- 安装OpenSSL-devel
# yum install -y openssl openssl-devel
PS:已安装可以跳过此步骤
- 拷贝\Product\12.服务器备货专用软件\Nginx\目录下的perl-5.28.0.tar.gz文件到linux服务器的/usr目录下;
- 解压perl,进入/usr目录下,解压perl-5.28.0.tar.gz
# tar -zxvf perl-5.28.0.tar.gz
- 进入解压目录
# cd perl-5.28.0
- 自定义安装目录
# ./Configure -des -Dusethreads -Dprefix=/usr/local/perl
- 编译和安装,依次执行以下命令
#make
#make test
#make intall
- 安装完成,查看版本
#perl -v
-
-
-
- 安装openssl
-
-
安装前确认perl已经安装,若没有请查看1.5.2.1步骤进行安装
- 拷贝\Product\12.服务器备货专用软件\Nginx目录下的openssl-1.0.2j.tar.gz文件到linux服务器/usr目录;
- 进入/usr目录,解压openssl-1.0.2j.tar.gz;
#tar -zxvf openssl-1.0.2j.tar.gz
- 进入到解压后的目录
#cd openssl-1.0.2j
- 配置
#./config
- 编译
#make
- 安装
#make install
- 安装Nginx
- 离线安装
下载安装包:# 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
- 配置安装模块
# 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
- Nginx配置
- 注册Nginx服务
问题现象:-bash: nginx: command not found
解决办法:把nginx路径 配置到环境变量里
1:进入 vim /etc/profile 文件在文件最后添加一个 PATH
export PATH=$PATH:/usr/local/nginx/sbin
2:source命令使用配置立即生效
-
- nginx 自启动配置
再rc.local 文件中增加启动命令
# vim /etc/rc.local
增加一行:# /usr/local/nginx/sbin/nginx
执行权限: # chmod 777 /etc/rc.local
-
- 启动nginx
默认/nginx/conf/nginx.conf
# /usr/local/nginx/sbin/nginx
配置文件方式启动
# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
- Nginx 命令汇总
- 停止nginx
# /usr/local/nginx/sbin/nginx -s stop
-
- 重启nginx
# /usr/local/nginx/sbin/nginx -s reload
-
- 验证配置是否成功
# /usr/local/nginx/sbin/nginx -t
-
- 查看nginx进程
# ps -ef | grep nginx
-
- 验证是否安装SSL模块
# /usr/local/nginx/sbin/nginx -V
-
- 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
-
- 生成自签证书
- 创建证书密钥文件
openssl genrsa -out server.key 2048
- 利用密钥生成证书请求文件,按提示输入证书信息(密码为空)
openssl req -new -key server.key -out server.csr
- 利用证书请求文件自成自签证书
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;