如果拥有域名,国内各大云服务商都提供免费的站点证书;也可以使用 openssl 自行签发。
下面以给私有仓库 docker.domain.com 签发 SSL 证书为例。
第一步:创建 CA 私钥
openssl genrsa -out "root-ca.key" 4096
第二步:创建 CA 根证书请求文件
openssl req \
-new -key "root-ca.key" \
-out "root-ca.csr" -sha256 \
-subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=Your Company Name Docker Registry CA'
-subj 参数说明:
| 字段 | 含义 | 示例 |
|---|---|---|
/C | 国家 | CN |
/ST | 省 | Shanxi |
/L | 城市或地区 | Datong |
/O | 组织名 | Your Company Name |
/CN | 通用名称 | 域名或 CA 名称 |
第三步:配置 CA 根证书
新建 root-ca.cnf:
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash
第四步:签发根证书
openssl x509 -req -days 3650 -in "root-ca.csr" \
-signkey "root-ca.key" -sha256 -out "root-ca.crt" \
-extfile "root-ca.cnf" -extensions \
root_ca
第五步:生成站点 SSL 私钥
openssl genrsa -out "docker.domain.com.key" 4096
第六步:生成证书请求文件
openssl req -new -key "docker.domain.com.key" -out "site.csr" -sha256 \
-subj '/C=CN/ST=Shanxi/L=Datong/O=Your Company Name/CN=docker.domain.com'
第七步:配置证书
新建 site.cnf,注意 subjectAltName 要同时写域名和 IP:
[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:docker.domain.com, IP:127.0.0.1
subjectKeyIdentifier=hash
第八步:签署站点 SSL 证书
openssl x509 -req -days 750 -in "site.csr" -sha256 \
-CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial \
-out "docker.domain.com.crt" -extfile "site.cnf" -extensions server
收尾
此时已得到三个文件:
- 站点 SSL 私钥
docker.domain.com.key - 站点 SSL 证书
docker.domain.com.crt - CA 根证书
root-ca.crt
新建 ssl 文件夹,把这三个文件移入,删除其余中间文件(root-ca.csr、site.csr 等)。
客户端需要信任
root-ca.crt才不会报证书警告:Linux 拷到/usr/local/share/ca-certificates/后执行update-ca-certificates,macOS 用「钥匙串访问」导入并设为始终信任。