Docker环境下将容器的http端口发布为https

862 阅读3分钟

一、准备模拟服务器

服务器IP描述
172.25.0.255模拟应用服务器,在88、8080、9090端口上部署了应用

二、准备88、8080、9090端口上的服务

直接用nginx启动在88、8080、9090端口上,用来模拟服务器的http应用

docker run -d -p 88:80 --name app1 nginx:latest
docker run -d -p 8080:80 --name app2 nginx:latest
docker run -d -p 9090:80 --name app3 nginx:latest

image.png

三、安装openssl工具

3.1 yum源替换

因Centos7已正式停止维护,yum官方源已失效,需替换为阿里云源:developer.aliyun.com/article/841…

3.2 安装openssl

yum install openssl

四、生成可用于多台服务器的局域网自签名https(ssl)证书

4.1 创建配置文件

在/data/build-ssl目录下,创建ssl配置文件

mkdir /data/build-ssl
cd /data/build-ssl
vim openssl.cnf

配置文件内容如下,注意仅需要修改[alt_names]下的内容即可,将需要做https的服务器IP全部写入,最终生成出的ssl证书就能在这些服务器使用。

[req]
distinguished_name = req_distinguished_name
req_extensions = v5_req
[req_distinguished_name]
countryName = Country Name (2 letter code)
countryName_default = CN
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = ShanDong
localityName = Locality Name (eg, city)
localityName_default = Qingdao
organizationalUnitName  = Organizational Unit Name (eg, section)
organizationalUnitName_default  = Bencare
commonName = DCM
commonName_max  = 64
emailAddress = ip@163.com
 
[v5_req]
# Extensions to add to a certificate request
basicConstraints = CA:FALSE
subjectAltName = @alt_names
[alt_names]
#此处增加域名和ip,使用https服务器的局域网ip即可,ip可以配置多个,只要一个自行删除
IP.1 = 172.25.0.255
IP.2 = 172.25.3.241

4.2 生成my-ssl.key

openssl genrsa -out my-ssl.key 2048

image.png

4.3 生成请求文件my-ssl.csr

openssl req -new -out my-ssl.csr -key my-ssl.key -config openssl.cnf

image.png

4.4 生成证书my-ssl.crt

openssl x509 -req -days 3650 -in my-ssl.csr -signkey my-ssl.key -out my-ssl.crt -extensions v5_req -extfile openssl.cnf

image.png

4.5 证书生成完毕

最终/data/build-ssl目录下的my-ssl.key、my-ssl.crt两个文件就是我们后续部署所需用到的Key及证书。

五、使用mul-https-forward容器进行请求转发

mul-https-forward工具的作用,就是将从https端口进入的请求转发至现有的http端口上。 我们希望的转发规则如下:

入口https地址目标http地址
https://172.25.0.255:188http://172.25.0.255:88
https://172.25.0.255:18080http://172.25.0.255:8080
https://172.25.0.255:19090http://172.25.0.255:9090

5.1 准备https证书

将【四】生成好的证书放到/etc/mhf/ssl目录下

mkdir -p /etc/mhf/ssl
cp /data/build-ssl/my-ssl.key /etc/mhf/ssl/my-ssl.key
cp /data/build-ssl/my-ssl.crt /etc/mhf/ssl/my-ssl.crt

image.png

5.2 下载mul-https-forward镜像包

下载地址:github.com/hellozhaoxu…

docker load -i mul-https-forward_beta.tar

5.3 编写转发规则配置文件

  • 在/etc/mhf/rules目录下新建mul.conf文件
mkdir -p /etc/mhf/rules
vim /etc/mhf/rules/mul.conf
  • mul.conf文件中填写以下内容,每一个server块表示一个转发规则,每个块只有三个地方需要修改,其他内容请勿修改
# https的188 转发至 http的88
server {
    listen 188 ssl;   # 此处188需修改为https的端口
    server_name 172.25.0.255;  # 此处172.25.0.255需修改为服务器的IP
    ssl_certificate /etc/https/my-ssl.crt;
    ssl_certificate_key /etc/https/my-ssl.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://172.25.0.255:88; # 此处的IP和端口需修改为目标http地址
    }
}

# https的18080 转发至 http的8080
server {
    listen 18080 ssl;
    server_name 172.25.0.255;
    ssl_certificate /etc/https/my-ssl.crt;
    ssl_certificate_key /etc/https/my-ssl.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://172.25.0.255:8080;
    }
}

# https的19090 转发至 http的9090
server {
    listen 19090 ssl;
    server_name 172.25.0.255;
    ssl_certificate /etc/https/my-ssl.crt;
    ssl_certificate_key /etc/https/my-ssl.key;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://172.25.0.255:9090;
    }
}

5.4 启动mul-https-forward容器

docker run -d --restart=always --privileged=true \
 -v /etc/mhf/rules:/etc/nginx/conf.d \
 -v /etc/mhf/ssl:/etc/https \
 --net=host \
 --name https mul-https-forward:beta

六、使用https访问新的端口测试效果

image.png