如何使用带有 openSSL 而不是通用名称的 SAN?

How do I use SANs with openSSL instead of common name?

升级使用golang 1.15.0-rc.1的系统(kubernetes)后,卡在了这个错误信息:

"x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0". 

我唯一使用公用名(据我所知)的地方是为我的服务生成私钥时 openssl req -new -key certs/foo-bar.pem -subj "/CN=foobar.mydomain.svc" -out certs/foo-bar.csr -config certs/foo-bar_config.txt

如何将此命令转换为使用 SAN?

我认为这个博客 post 会对你有所帮助,Know about SAN Certificate and How to Create With OpenSSL。否则,您可以按照错误消息的建议进行操作,并将 GODEBUG="x509ignoreCN=0" 设置为环境变量。

您可能需要 -addext 标志。

例如:

openssl req -new -key certs/foo-bar.pem \
    -subj "/CN=foobar.mydomain.svc" \
    -addext "subjectAltName = DNS:foobar.mydomain.svc" \
    -out certs/foo-bar.csr \
    -config certs/foo-bar_config.txt

从这里得到答案:https://security.stackexchange.com/questions/74345/provide-subjectaltname-to-openssl-directly-on-the-command-line

解决方案

我解释的一清二楚

这个解决方案对我有效。首先你必须有一个 CA,然后由 CA 签署你的服务器证书。我创建了一个 CA 和服务器证书,最后通过下面的命令签署了服务器证书。(更改您想要的 -subj 和 CN)

在您的情况下,您应该在下面的最新命令行中签署服务器证书时传递 subjectAltName。

openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 365 -key ca.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=Acme Root CA" -out ca.crt

openssl req -newkey rsa:2048 -nodes -keyout server.key -subj "/C=CN/ST=GD/L=SZ/O=Acme, Inc./CN=*.example.com" -out server.csr
openssl x509 -req -extfile <(printf "subjectAltName=DNS:example.com,DNS:www.example.com") -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt

在 运行 这个命令之后,你可以在 kubernetes secret 中使用证书(server.crt,servert.key)进行入口。

我 运行 在 redhat 8.4 上使用环境变量,它适用于我

export GODEBUG="x509ignoreCN=0"
podman login repo.example.com:5000

用户名:注册用户 密码: 登录成功!