目录
Dockerfile文件编写
Docker构建与运行
opessl 双向认证证书生成
nginx配置文件
测试运行结果
源码地址
?本文地址:https://arv000.blog.csdn.net/article/details/125331698
为快速构建nginx的双向认证服务器,我们使用构建docker镜像方式搭建,原始项目中包含了国密认证部分,文章仅介绍双向自签名的构建,因此在运行builddocker.sh脚本时我们只是用到了功能“7”。
本文介绍了docker的构建脚本、docker的运行脚本、https双向认证自签名脚本、生成根证书、服务器证书、客户端证书。
使用dockerfile构建docker镜像方便又快捷。
项目文件列表
文件类型 | 文件名称 | 说明 | 文件 | builddocker.sh | 构建和运行docker的bash脚本 | 文件 | Dockerfile_D_RSA | 构建双向认证的duckerfile文件。 | 目录 | rsa_d | nginx双向认证相关的配置文件 | 文件 | rsa_d/index.html | web服务首页,方便测试人员下证书 | 文件 | rsa_d/gm_rsa_config | nginx配置双向认证tls文件 | 文件 | rsa_d/build_ca.sh | 使用openssl命令构建服务器证书,根证书,客户端证书。 | 目录 | gm_tar | nginx源码包,以及openssl源码包 | 文件 | gm_tar/nginx-1.18.0.tar.gz | | 文件 | gm_tar/gmssl_openssl_1.1_b6.tar.gz | |
Dockerfile文件编写
关于dockerfile的编写规则可以看一下文章
地址:->? ??docker使用逃过不的Dockerfile
Dockerfile_D_RSA文件内容
# 基础镜像
FROM centos:7
LABEL maintainer="arv003@163.com"
# 修改环境变量,将nginx运行程序的环境变量添加到path
ENV PATH /usr/local/nginx/sbin:$PATH
# 上传国密openssl压缩包
ADD gm_tar/gmssl_openssl_1.1_b6.tar.gz /usr/local
# 上传nginx压缩包
ADD gm_tar/nginx-1.18.0.tar.gz /root
# 下载安装编译nginx依赖程序(注意需要联网)
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre unzip openssl && yum clean all
# 编译nginx
WORKDIR /root/nginx-1.18.0
RUN sed -i 's/$OPENSSL\/\.openssl/$OPENSSL/g' auto/lib/openssl/conf
RUN ./configure --without-http_gzip_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_v2_module \
--with-file-aio \
--with-openssl="/usr/local/gmssl" \
--with-cc-opt="-I/usr/local/gmssl/include" \
--with-ld-opt="-lm"
# 安装nginx
RUN make install
# 配置nginx配置文件
WORKDIR /root/
ADD rsa_d/build_ca.sh /root/
# 生成双向自签名证书
RUN /bin/bash -c "bash build_ca.sh"
RUN cp /root/client/kehuduan.p12 /usr/local/nginx/html/
ADD rsa_d/index.html /root/
RUN rm -f /usr/local/nginx/html/index.html
RUN mv /root/index.html /usr/local/nginx/html/
ADD rsa_d/gm_rsa_config /root
RUN sed -i '$d' /usr/local/nginx/conf/nginx.conf
RUN cat /root/gm_rsa_config >> /usr/local/nginx/conf/nginx.conf
RUN echo "" >> /usr/local/nginx/conf/nginx.conf
RUN echo "}" >> /usr/local/nginx/conf/nginx.conf
# 启动nginx
CMD /bin/sh -c 'nginx -g "daemon off;"'
# 指定docker开放
EXPOSE 80
EXPOSE 443
Docker构建与运行
默认的Dockerfile文件就叫这个名字,但是我们可以通过指定dockerfile文件进行构建(-f)。
sudo docker build -f Dockerfile_D_RSA -t gm_d_rsa:1.0 .
docker run命令运行docker镜像,为使得运行容器不冲突,我们可以先使用docker stop停止容器运行,docker rm删除容器。
# 暂停docker容器
sudo docker stop gm_d_rsa
# 删除docker容器
sudo docker rm gm_d_rsa
# docker容器
sudo docker run -d --restart=always --name=gm_d_rsa -p 8086:80 -p 8448:443 gm_d_rsa:1.0
--name:指定运行容器的名字。
-p: 指定宿主机和容器的端口绑定关系。
gm_d_rsa:1.0:构建镜像时的镜像名称。
sudo docker ps -a ::查看所有的容器
sudo docker ps : 查看运行的容器
sudo docker rm :删除容器
docker命令可以查看文件->?docker入门精髓?
opessl 双向认证证书生成
注释在以下代码中写得比较清楚
#!/bin/bash
# 构建自签名证书以及客户端证书.
# 构建之前需要安装openssl
PROJECT_NAME="TLS Project"
# 构建根证书
function build_ca_cert(){
# 一、 制作ca自签名证书
## step 1 生成私钥,
openssl genrsa -out ca_private.pem 2048
## step 2 制作自签名证书
openssl req -new -x509 -key ca_private.pem -out ca.crt -config ./ca_cert.conf
#openssl x509 -req -in root.csr -out root.crt -signkey ca.key -CAcreateserial -days 3650 -config ./ca_cert.conf
}
# 构建服务端证书
function build_server_cert()
{
# 二、准备服务器证书
## step 1 构建服务器私钥
openssl genrsa -out server.key 1024
## step 2 制作服务端服务器证书申请指定
openssl req -new -key server.key -sha512 -out server.csr -config ./server_cert.conf
## step 3 签署证书
openssl x509 -req -in server.csr -out server.crt -CAcreateserial -days 3650 -CA ../ca/ca.crt -CAkey ../ca/ca_private.pem
}
# 构建客户端证书
function build_client_cert(){
# 三、 准备客户端证书(导入到浏览器)
## step 1 制作客户端私钥
openssl genrsa -out kehuduan.key 1024
## step 2 制作客户端申请证书
openssl req -new -key kehuduan.key -out kehuduan.csr -config ./client_cert.conf
## step 3 签署客户端证书
openssl x509 -req -in kehuduan.csr -out kehuduan.crt -signkey kehuduan.key -CAcreateserial -days 3650 -CA ../ca/ca.crt -CAkey ../ca/ca_private.pem
## step 4 生成你客户端p12格式证书,用于导入浏览器
openssl pkcs12 -export -clcerts -in kehuduan.crt -inkey kehuduan.key -out kehuduan.p12 -passin pass:123456 -password pass:123456
}
# 构建根证书配置文件
function build_ca_config(){
cat > ca_cert.conf << EOF
[ req ]
distinguished_name=req_distinguished_name
prompt=no
[ req_distinguished_name ]
O=$PROJECT_NAME
CN=www.gmtest.cn
EOF
}
# 构建服务端证书配置文件
function build_server_config(){
cat > server_cert.conf << EOF
[ req ]
distinguished_name=req_distinguished_name
prompt=no
[ req_distinguished_name ]
O=$PROJECT_NAME
CN=www.gmtest.cn
EOF
}
# 构建客户端证书配置文件
function build_client_config(){
cat > client_cert.conf << EOF
[ req ]
distinguished_name=req_distinguished_name
prompt=no
[ req_distinguished_name ]
O=$PROJECT_NAME
CN=www.gmtest.cn
EOF
}
##################################### main #######################################
# 构建根证书
rm -rf ca
mkdir ca
cd ca
build_ca_config
build_ca_cert
cd ..
# 构建服务器证书
rm -rf server
mkdir server
cd server
build_server_config
build_server_cert
cd ..
# 构建客户端证书
rm -rf client
mkdir client
cd client
build_client_config
build_client_cert
nginx配置文件
在nignx.conf文件中添加如下配置
server
{
listen 0.0.0.0:443 ssl;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-RC4-SHA:!ECDHE-RSA-RC4-SHA:ECDH-ECDSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-AES256-SHA:!RC4-SHA:HIGH:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!CBC:!EDH:!kEDH:!PSK:!SRP:!kECDH;
ssl_verify_client on;
# 配置服务器证书
ssl_certificate /root/server/server.crt;
# 配置服务器私钥
ssl_certificate_key /root/server/server.key;
# 配置客户端证书
ssl_client_certificate /root/client/kehuduan.crt;
location /
{
root html;
index index.html index.htm;
}
}
测试运行结果
浏览器中访问:
# 可以通过这地址下载客户端证书,以及提示证书密码。
http://127.0.0.1:8086
htts://127.0.0.1:8448
访问url地址?http://127.0.0.1:8086
下载客户端证书?
证书密码为:123456
点击客户端下载可以直接下载客户端证书。
将客户端证书导入浏览器中,一般在浏览器的设置->隐私安全模块。
选中下载的客户端证书
??
在访问双向认证服务器时,浏览器会提示用户选择客户端证书。
选择正确的证书?
?访问结果
源码地址
源码下载:docker构建nginx双向认证https服务器
本文地址:https://arv000.blog.csdn.net/article/details/125331698
|