首页
Nginx Ingress controller 私有证书不生效

测试在使用k8s创建ingress使用了自签的证书后,访问服务发现证书还是Kubernetes Ingress Controller Fake Certificate

问题分析

查看ingress controller 容器组的日志,发现有如下错误信息:

 Unexpected error validating SSL certificate "test_ns/tls_example" for server "example.com": x509: certificate relies on legacy Common Name field, use SANs instead

我们之前签发的私有证书使用如下命令,是没有SAN信息的:

openssl genrsa -out tls.key
openssl req -new -x509 -key tls.key -out tls.crt -subj /C=CN/ST=ShangHai/L=ShangHai/O=Ingress/CN=example.com

解决

重亲签发带有SAN信息的证书即可。

如果只用的 OpenSSL ≥ 1.1.1 ,可以使用 -addext 参数自签 example.comexample.net 带有SAN信息的证书:

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
  -keyout example.key -out example.crt -subj '/CN=example.com' \
  -addext 'subjectAltName=DNS:example.com,DNS:example.net'

如果使用 OpenSSL ≤ 1.1.0 ,比如在 Debian ≤ 9 or CentOS ≤ 7 ,我们可以使用 -extensions-config 参数(或者使用openssl.cnf配置文件的方式)。

openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
  -keyout example.key -out example.crt -subj '/CN=example.com' \
  -extensions san \
  -config <(echo '[req]'; echo 'distinguished_name=req';
            echo '[san]'; echo 'subjectAltName=DNS:example.com,DNS:example.net')