步骤/目录:
1.准备工作
2.运行并测试
3.其他方式

本文首发于个人博客https://lisper517.top/index.php/archives/23/,转载请注明出处。
本文的目的是使用docker在云服务器上运行portainer,并使得其网页UI只能使用https访问。
本文实验日期为2022年7月29日。本文使用的是树莓派4B(内存8G版),系统为Pi OS 64位桌面版(2022年4月4日更新,镜像名 2022-04-04-raspios-bullseye-arm64.img )。云服务器为阿里云的轻量应用服务器,镜像为Docker 19.03。

之前的文章中曾介绍过使用https访问frp的dashboard,详见 Docker树莓派实践——frp(附dashboard开启https、frp双向验证) 。上次生成的server.crt和server.key在本文中也会用到。

本文主要参考了 portainer的官方文档

1.准备工作

首先需要生成自己的.crt和.key文件。这里和 Docker树莓派实践——frp(附dashboard开启https、frp双向验证) 中一模一样,同样参考了 gofrp文档
在树莓派上进行以下操作:

mkdir /home/pi/ssl_cert #或者在其他文件夹,只要是WinSCP登录用户能访问的文件夹
cd /home/pi/ssl_cert
find / -name "openssl.cnf" #查找openssl.cnf

openssl.cnf是openssl的配置文件,需要拷贝到/home/pi/ssl_cert下。在树莓派上找到了/usr/lib/ssl/openssl.cnf和/etc/ssl/openssl.cnf,但内容与 gofrp文档 有些差异。于是笔者直接复制了 gofrp文档 中的配置:

nano /home/pi/ssl_cert/my-openssl.cnf

写入以下内容:

[ ca ]
default_ca = CA_default
[ CA_default ]
x509_extensions = usr_cert
[ req ]
default_bits        = 2048
default_md          = sha256
default_keyfile     = privkey.pem
distinguished_name  = req_distinguished_name
attributes          = req_attributes
x509_extensions     = v3_ca
string_mask         = utf8only
[ req_distinguished_name ]
[ req_attributes ]
[ usr_cert ]
basicConstraints       = CA:FALSE
nsComment              = "OpenSSL Generated Certificate"
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer
[ v3_ca ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints       = CA:true

接下来生成默认ca(CA即Certification Authority,颁发证书的机构):

openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=www.lisper517.top" -days 5000 -out ca.crt

其中可以把www.lisper517.top改成自己的域名,或者也可以乱写。
然后使用以下命令生成证书:

#第一条命令
openssl genrsa -out server.key 2048
#第二条命令
openssl req -new -sha256 -key server.key \
    -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=server.com" \
    -reqexts SAN \
    -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:47.98.39.236,DNS:lisper517.top")) \
    -out server.csr
#第三条命令
openssl x509 -req -days 365 \
    -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
    -extfile <(printf "subjectAltName=DNS:localhost,IP:47.98.39.236,DNS:lisper517.top") \
    -out server.crt

注意把第二、三条命令中的IP:47.98.39.236,DNS:lisper517.top修改一下,IP改成自己云服务器的ip,DNS改成自己的域名。
这些文件里需要的是server.crt和server.key,本文中不需要用到ca.crt,或者如果要关闭浏览器警告也可以留着。可以使用如下命令压缩:

zip cert.zip ca.crt server.crt server.key

因为用WinSCP把server.key转移到win10机器上时出现Permisson denied,所以先压缩一下才能转移。之后解压一下,还是通过WinSCP放到云服务器上(笔者放到了/docker/portainer/ssl_certificate目录下,ca.crt可以不放到云服务器上)。另外,如果想通过配置使得win10或linux接受自己颁发的证书,还要记得转移一下ca.crt,这个文件用于确认颁发证书的机构。
最后记得删除临时文件夹:

cd ..
rm -r /home/pi/ssl_cert

至此就生成并转移了需要的三个文件。

2.运行并测试

先进行试运行,在服务器上使用如下命令:

docker pull portainer/portainer-ce
docker volume create portainer_data
docker run --name portainer -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data -v /docker/portainer/ssl_certificate:/ssl_certificate -p 9001:9000 -p 9002:9443 --restart always portainer/portainer-ce --sslcert /ssl_certificate/server.crt --sslkey /ssl_certificate/server.key

然后在服务器的防火墙设置中打开9001、9002端口(注意不要用ufw或iptables打开),浏览器访问 http://lisper517.top:9001https://lisper517.top:9002 ,两个网页都可正常打开。然后删除试运行的容器,在生产环境下去掉http端口、只用https端口:

docker stop portainer
docker container rm portainer
docker run -d --name portainer -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data -v /docker/portainer/ssl_certificate:/ssl_certificate -p 9443:9443 --restart always portainer/portainer-ce --sslcert /ssl_certificate/server.crt --sslkey /ssl_certificate/server.key

然后在服务器防火墙设置中删除9001、9002规则,打开9443端口,那么以后正常访问 https://lisper517.top:9443 即可安全访问portainer了。

3.其他方式

portainer/portainer已经停止更新了,目前推荐用portainer/portainer-ce。新版的portainer中加入了在网页UI中设置https的功能,在左侧选中 Setting 大标签(注意不要选到子项),有一项 SSL certificate ,在这里可以上传 .crt、.key 文件,所以其实不用挂载 /docker/portainer/ssl_certificate:/ssl_certificate ,而是可以从http访问、在这里上传两个文件、再从https端口访问。另外,上面的 Force HTTPS only 是只打开https端口,在这里笔者生产环境中 docker run 的时候就只打开了https端口,所以无所谓。另外,在 Users 里可以改密码。
最后,若要关闭浏览器访问警告,可参考 Docker树莓派实践——frp(附dashboard开启https、frp双向验证) 中的 附录1.(3)访问的注意事项

标签: 树莓派, docker, SSL/TLS, HTTPS, portainer

添加新评论