原因
如果服务器名称是 IP 地址,还会检查证书的Subject Alternative Name(SAN),因此需要创建一个包含此名称的证书。 否则,docker login 时会报如下错误:
Error response from daemon: Get https://x.x.x.x/v2/: x509: cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs
解决方法
在证书中生成x509v3 Extensions。要将?extensions?添加到证书中,需要在签署证书时使用“-extensions”选项。
例:
#openssl ca -policy policy_anything -config -out windows_server.crt -extensions some_ext -extfile some_extensions.txt -infiles cert_request.csr
重点在于【-extensions some_ext -extfile some_extensions.txt】这句。且前提是,已经在同一目录下创建了一个名为“some_extensions.txt”的文件,并且它具有 some_ext 扩展名。
为了实现自动化,可以在shell中写入如下代码,让其自动执行。
要点如下:
- 本次需要的extensions类型是"v3_ca",内容是"subjectAltName = IP:ip地址",需要在生成csr之前作成此文件。
- 在生成crt的语句中,需要加入"-extensions v3_ca -extfile /etc/cert/extfile.cnf"。
#!/bin/sh
if [ ! -d /etc/cert ] ; then
mkdir -p /etc/cert
touch /etc/cert/extfile.cnf
cat>/etc/cert/extfile.cnf<<EOF
[v3_ca]
subjectAltName = IP:ip地址
EOF
fi
echo "Create Private Key....."
...(略)
echo "Create Certificate Sigining Request....."
...(略)
echo "Create Certificate....."
...(前略) -extensions v3_ca -extfile /etc/cert/extfile.cnf
echo "Done."
签署证书后,检查扩展是否正确添加。
#openssl x509 -text -noout -in user-certificate.crt
...(略)
X509v3 extensions:
X509v3 Subject Alternative Name:
IP Address:ip地址
...(略)
参考
构建docker私有仓库
当服务器名是IP地址时创建SSL证书
How to generate x509v3 Extensions in the End user certificate
|