一、前言

因一次Harbor 域名DNS解析变更,导致在认证以及push或pull都会出现 “x509: certificate signed by unknown authority”问题。

记一次SSL x509导致Harbor认证失败问题_SSL

二、问题排查思路

首先在Harbor仓库本地尝试docker login登录验证是否可行,发现同样失败。

记一次SSL x509导致Harbor认证失败问题_SSL_02

该错误在网上很常见,尝试在本地指定insecure-registries参数,设置允许Docker客户端连接未使用https安全协议的仓库

{
"insecure-registries":["harbor.51trust.net"]
}

配置完成尝试重启Docker服务,结果发现无法正常启动成功

记一次SSL x509导致Harbor认证失败问题_Nginx_03

于是乎,我尝试修改"/usr/lib/systemd/system/docker.service"配置文件

.....省略
ExecStart=/usr/bin/dockerd --insecure-registry=xxx.xxx.xxx域名地址
....省略

再次尝试重启Docker服务,并将Harbor服务运行。此时发现本地认证正常,但是在其它节点以及Jenkins构建过程中仍然出现证书认证失败的问题。

记一次SSL x509导致Harbor认证失败问题_Nginx_04

最后对比域名迁移前以及域名迁移后的证书,发现证书时间是不一样的,于是乎将之前的证书文件拷贝到现有Nginx,结果仍然出现认证问题。

记一次SSL x509导致Harbor认证失败问题_服务器_05

看来问题的点还是没有抓到,随后尝试抓包来判断追踪问题。抓包显示访问过程中使用的新DNS解析的代理抓包时访问用的是TLS1.2。原来负载入口SSL协议是TLS1.3。

记一次SSL x509导致Harbor认证失败问题_Nginx_06

记一次SSL x509导致Harbor认证失败问题_服务器_07

最后对比了两者Nginx  TLS版本都是一致的,但是发现证书文件引用得名称有区别。于是尝试将新Nginx配置文件中的"ssl_certificate" cer文件更改为fullchain.cer,也就是和之前Nginx所指定的证书文件全部保持一致。

记一次SSL x509导致Harbor认证失败问题_服务器_08

尝试登录验证,就没有报出509证书问题了,另外尝试Jenkins构建上传镜像等环节均正常。问题解决。

记一次SSL x509导致Harbor认证失败问题_Nginx_09

三、总结

好了,回过头来分析下这为何两者证书为啥不一致就会导致该问题的出现吧?再次之前我们现在复习下关于ssl证书的知识点。

在Nginx中,我们通常都会配置https,而对应的就离不开ssl_certificate_keyssl_certificate这两个参数。它主要适用于配置SSL/TLS加密连接的关键指令。

1、ssl_certificate_key: 这个指令用于指定SSL证书的私钥文件的路径。私钥文件通常包含与SSL证书配对的私钥,用于加密和解密通信中的数据。私钥是SSL/TLS加密的关键组成部分,它用于生成加密的会话密钥和对数据进行解密。私钥文件通常是以PEM格式存储的。

ssl_certificate_key /etc/nginx/ssl/xxx.com.key;

2、ssl_certificate: 这个指令用于指定SSL证书文件的路径。SSL证书文件包含用于验证服务器身份的公钥以及相关信息,如服务器的域名和证书颁发机构(CA)的签名。当客户端与服务器建立SSL/TLS连接时,服务器会发送该证书以供客户端验证。证书文件通常是以PEM格式存储的。

ssl_certificate /etc/nginx/ssl/xxx.com.crt;

我们刚才引用ssl_certificate 证书文件出了问题,查看了证书文件内容,发现里面只有一部分也就是服务器证书,也就是网站的主证书。如下图所示,所以我们指定之后虽然harbor https证书生效了,通过浏览器访问没问题,是因为里面仅配置了网站主证书,所以浏览器访问正常。

记一次SSL x509导致Harbor认证失败问题_Nginx_10

正常情况下,ssl_certificate指定的证书文件会包含三个不同的内容板块。如下

  • 服务器证书:这是网站的主证书,包含了网站的公钥和与其有关的信息(如域名和过期时间)。它用于证明网站的身份。
  • 中间证书:中间证书链用于建立从服务器证书到根证书的信任链。这些证书是由认证机构(CA)签发的,帮助用户的浏览器信任服务器证书。有时,一个服务器证书可能不会直接由根证书签署,而是通过中间证书进行链式信任。
  • 根证书:虽然根证书通常不直接在服务器配置中包含,但是整个证书链的基础。它由受信任的认证机构提供,用户的浏览器通常自带这些证书,用于验证中间证书和服务器证书的有效性。 组合在一起,这三种证书确保通信的安全性和可信赖性。在配置SSL时,如果缺少其中任何一个部分,可能会导致浏览器无法验证网站的身份,出现安全警告

以上,由于Harbor 更换之后的DNS解析对应的Nginx域名证书缺少中间证书以及根证书,因此最终导致Harbor服务无法正常通过验证,出现x509: certificate signed by unknown authority错误信息