日常在周末更新相关容器,更新 potainer 2.6.3 后发现所有远程 docker 节点都无法连接了,看了下日志报错是这样的:

background schedule error (endpoint snapshot). Unable to create snapshot (endpoint=TOS, URL=tcp://host:port) (err=error during connect: Get "https://host:port/_ping": x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0)

从网上检索的信息大概是这个意思:Go 1.15 版本开始废弃 CommonName,因此推荐使用 SAN 证书。

想必就是potainer 更新了 Go 版本吧。虽然也有说可以暂时忽略,但既然更新就有其更新的原因,经过一上午的研究,发现真香。在我之前的文章 Portainer 使用 TLS 加密连接远端节点上的 Docker 中写得是又臭又长,我自己都看不下去了,仔细看了下,决定取其精华去其糟粕,重新生成一套证书,走你。

根证书以及私钥创建

openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -subj "/CN=$HOST" -out ca.pem
openssl genrsa -out server-key.pem 4096

自行更改根证书$HOST,同时在生成 ca-key.pem 时会要求输入密码,后面的密码确认都需要。

服务器证书签发

openssl req -new -sha256 \
  -key server-key.pem \
  -subj "/C=CN/OU=$ORG/O=$COMP/CN=$NAME" \
  -reqexts SAN \
  -config <(cat /etc/ssl/openssl.cnf \
      <(printf "\n[SAN]\nsubjectAltName=DNS:$HOST1,DNS:$HOST2")) \
  -out server.csr
openssl x509 -req -days 365 \
  -in server.csr -out server-cert.pem \
  -CA ca.pem -CAkey ca-key.pem -CAcreateserial \
  -extensions SAN \
  -extfile <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:$HOST1,DNS:$HOST2"))

需要自行修改$ORG $COMP $NAME ,CN 也可改,没记错的话分别对应组织,机构,机构名(哎呀,自己签发的随便写)

接着就是DNS:$HOST1,DNS:$HOST2 这就是 SAN 证书的好处,网上都会拿 google 的 tls 证书举例,其实就是支持通配符,比如我有子域名 server1.lckiss.com,server2.lckiss.com,那么我统一授权为 *.lckiss.com 即可,后面还可以继续加域名。

PS:上述命令中的 /etc/ssl/openssl.cnf,即 openssl 的配置文件路径并不一定适合所有系统,可以使用 find 命令找出自己系统中 openssl.cnf 的位置:

find / -name openssl.cnf

查看服务器证书信息

上述命令输入后,该有的文件就有了,可以看看最终的证书情况:

openssl x509 -noout -text -in server-cert.pem
...
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:*.lckiss.com, DNS:lckiss-otherhost.com
...

最终需要的是三个文件:ca.pem 、server-cert 、server-key.pem 。

配置 Docker 启动服务

vi /usr/lib/systemd/system/docker.service

找到ExecStart字段在-H之前加入以下配置:

--tlsverify --tlscacert=/path/to/ca.pem --tlscert=/path/to/server-cert.pem --tlskey=/path/to/server-key.pem -H tcp://0.0.0.0:port

重启 docker ,在 portainer 中配置 Endpoint 证书即可。

systemctl daemon-reload && systemctl restart docker

这部分可以参考旧文: Portainer 使用 TLS 加密连接远端节点上的 Docker

以上;

参考:

使用openssl创建包含SAN的证书

最新文章

  1. winform快速开发平台 -&gt; 基础组件之分页控件
  2. 【Python】supervisor安装和管理celery
  3. 实例之HTML标签属性
  4. IOS开发UI基础UIView
  5. [Solution] 一步一步WCF(2) 终结点Endpoint
  6. JAVA与ABA问题
  7. [selenium webdriver Java]隐式的等待同步
  8. 【转】Linux下查看TCP网络连接情况
  9. windows7 64位下运行 regsvr32 注册ocx或者dll的方法
  10. Hive:表1inner join表2结果group by优化
  11. mysql 设置skip_name_resolve参数 日志 [Warning] &#39;user&#39; entry &#39;root@localhost&#39; ignored in --skip-name-resolve mode
  12. PHP全栈从入门到精通1
  13. 使用@RequestBody将请求体映射到Action方法参数中
  14. 11.8luffycity(3)
  15. BZOJ1090 [SCOI2003]字符串折叠 区间动态规划 字符串
  16. pitch, yaw, roll
  17. Bluedroid: 蓝牙协议栈源码剖析
  18. Android 反编译神器jadx的使用
  19. 通过ping 主机名,或者主机名对应的IP地址
  20. 【转】理解 pkg-config 工具

热门文章

  1. C语言经典100例【1、2】
  2. video.js 苹果手机设置了currentTime却还是从头播放?
  3. 整合jUnit4和jUnit5
  4. 物流扫码固定式扫描相机BXT-10M 自动分拣读码器 条码识别扫码器
  5. 光纤加速计算 383-高速信号处理板 XCKU060的双路QSFP+光纤PCIe 卡 XCKU060板卡
  6. MVC对session或cookie保存的值在js中做处理
  7. window.onerror的总结
  8. 杭电oj 青年歌手大奖赛_评委会打分
  9. 网络服务之DHCP与FTP
  10. JS篇(003)-请用 js 去除字符串空格?