kubernetes AKS上的MinIO + OpenID(Keycloak)无法验证TLS

wqlqzqxt  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(1)|浏览(244)

嗨,我在用MinIO配置OIDC(Keycloak)时不知所措(两者都部署在同一个AKS集群上)。我已经为两者配置了一个Ingress,两者都使用我从DigiCert获得的相同的认证。然而,每当我配置OIDC(通过Helm值或在控制台中手动)时,我都会得到以下错误:

Get "https://<FQDN_KEYCLOAK>/realms/master/.well-known/openid-configuration": tls: failed to verify certificate: x509: certificate signed by unknown authority

我尝试手动将tls secret挂载到MinIO pod上的/etc/minio/certs中,但出现了相同的错误。有什么建议吗?谢谢

UPDATE:我在集成Keycloak(OIDC)和ArgoCD时也遇到了同样的异常。

6rqinv9w

6rqinv9w1#

因为你有一个错误“TLS: failed to verify certificate: x509: certificate signed by unknown authority“,这应该意味着Keycloak服务器使用的证书不受运行MinIO和ArgoCD的系统的信任。
您应该确保为您的证书签名的证书颁发机构(CA)受到MinIO和ArgoCD系统的信任。既然你提到你使用的是DigiCert的证书,它不被识别是很奇怪的,因为DigiCert是一个著名的CA。
首先,检查证书是否正确安装在Keycloak服务器上。您可以使用OpenSSLonline SSL checkers等工具验证证书安装。

openssl s_client -connect <FQDN_KEYCLOAK>:443 -showcerts

运行此命令时,请在输出中查找“Certificate chain”部分。如果您看到一个证书,请确保链中所有级别的证书都存在并且正确configured in your server configuration, which, in this case, is Keycloak
证书必须连接在一个文件(https-certificate-file)中,首先是服务器的证书,然后是中间证书,最后是根证书,以形成一个完整的链。
更新MinIOArgoCD系统上的证书信任存储区,以包含签署Keycloak证书的CA证书。

  • 对于MinIO,您需要正确配置它以信任您的CA证书。您可以将证书添加到系统信任存储区,或配置MinIO以使用自定义CA证书:
mkdir -p /root/.minio/certs/CAs/
cp your-root-ca.crt /root/.minio/certs/CAs/

添加证书后重新启动MinIO服务器。

  • 与MinIO类似,对于ArgoCD,更新信任存储以包含您的CA证书。

所有这一切都假设错误消息中指定的路由器正确解析到您的Keycloak服务器,并且没有网络问题阻止连接。
您可以使用curl手动测试证书验证:

curl -v https://<FQDN_KEYCLOAK>/realms/master/.well-known/openid-configuration --cacert /path/to/your/ca/cert.pem

如果curl命令成功而没有证书错误,则表明证书已正确安装并受信任。
这是一个非常奇怪的错误,因为我已经在其他K8s环境中使用Keycloak配置了这两个服务,它似乎只是这个(在AKS上运行)。
证书肯定是使用Bitnami chart安装在Keycloak中的,curl命令没有返回cert错误(使用Keycloak和argo的cursor都是如此)。
由于您已经在其他Kubernetes环境中成功配置了这些服务,并且仅在此特定AKS集群中遇到问题,因此问题应该特定于此特定AKS环境或所涉及的证书。成功的curl命令测试是一个强有力的指示,表明Keycloak服务器上的证书已正确安装,并且可以从集群中访问。
所以检查aks特定的配置:AKS可能有一些影响TLS验证的特定安全策略或网络配置。确认没有可能干扰Keycloak连接的配置。
并在pod中查看已安装的证书:检查MinIO和ArgoCD pod以查看CA证书是否正确安装和可访问。

kubectl exec -it <pod_name> -n <namespace> -- /bin/sh
ls /etc/minio/certs/CAs/  # or corresponding path

确保没有Kubernetes网络策略或Azure特定的防火墙规则可能会干扰证书验证过程。
例如,在集群中的其他Pod内部使用curl来排除MinIO或ArgoCD特定的任何网络问题。

kubectl run --rm -i --tty --image=busybox testpod -- sh
wget --ca-cert=/path/to/ca.crt https://<FQDN_KEYCLOAK>/realms/master/.well-known/openid-configuration

OP在评论中补充说:
最后我把它弄清楚了,这是由于两个问题:

  • 我试图使用一个wildcar cert为auth.<BASE_URL>argo.<BASE_URL>,切换到使用letsencrypt,
  • 我需要将证书转换为PEM格式并挂载到/opt/bitnami/keycloak/certs

正确:

使用单个证书:

但是,根据颁发证书的证书颁发机构(CA)和所涉及的应用程序,SSL证书可能并不总是无缝工作。而且,将单个证书用于多个服务有时会带来复杂性或限制。

  • 通过选择Let's Encrypt,您可以轻松地为每个子域(auth.<BASE_URL>argo.<BASE_URL>)颁发单独的证书,从而隔离每个服务的SSL配置。

这通常更容易管理和故障排除。Let's Encrypt的自动化功能还可以简化续订过程,进一步减少维护开销。

转换为PEM格式:

证书可以有多种格式,如DER,PEM,PFX等。所涉及的应用程序(在本例中,Bitnami的Keycloak图表)可能期望证书采用特定格式。

  • PEM(Privacy-Enhanced Mail)是最常用的证书格式之一,可通过-----BEGIN CERTIFICATE----------END CERTIFICATE-----分隔符识别。并非所有软件都可以读取所有格式,因此转换为PEM通常是兼容性所必需的。

  • 安装到/opt/bitnami/keycloak/certs:这是Bitnami Keycloak Helm chart特有的。Helm charts通常会定义特定的路径,以查找配置或证书。您需要确保PEM格式的证书放在这个特定的目录中,以便Keycloak正确使用它们。

相关问题