脚本简介
- 基于运维统一脚本中,4、实用shell脚本下的1) 实用shell脚本选项harbor证书生成脚本
- 系统版本Centos7
脚本注解
- 该脚本为生成harbor的自签证的证书,给harbor去使用
- 把该脚本复制到部署harbor的服务器上,修改完成配置后,执行脚本即可
- 执行脚本结束后,所需的证书存放在脚本所在目录下的ssl
- harbor使用的证书:cd ssl/data/目录下
- docker客户端使用:cd ssl/certs.d目录下,并且打包成certs_d.tar.gz,只要把这个安装包存放到/etc/docker/
修改方式
city="Shanghai"
#证书的域名
domain_name="registry.harbor.cn"
#harbor中对外访问的端口,默认443,可根据实际情况去填写
domain_port="443"
- 根据访问arbor的域名来确认生成的ssl证书文件,根据实际情况填写,端口可根据实际情况修改
- 默认443,如果使用IP地址访问,则是没有问题
- 如果不是443,且脚本的端口未修改,则会导致其他docker客户端登录harbor服务时,则会出现证书不正确的情况,切记!!!
问题记录
443端口被占用后
端口被占用后,使用其他的端口进行访问,但是在使用证书登录的时候,可能会报错报错日志尚未留存
[root@myos certs.d]$ls
registry.harbor.com:8443
[root@myos certs.d]$pwd
/etc/docker/certs.d
根据端口,修改证书的目录名称即可
登录私有仓库时出错
daemon.json文件以配置,且重启后加载成功
[root@myos docker]$cat daemon.json
{
"insecure-registries": ["192.168.1.123:443"],
"registry-mirrors": ["https://geuj9lut.mirror.aliyuncs.com"]
}
在登录时依旧报错
docker login -u admin -p Harbor12345 192.168.1.123:443
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get "https://192.168.1.123:443/v2/": unable to decode token response: invalid character '<' looking for beginning of value
解决方式
- 查看harbor 下的common/config/registry/config.yml
。。。
token:
issuer: harbor-token-issuer
realm: https://www.harbor.com/service/token
rootcertbundle: /etc/registry/root.crt
service: harbor-registry
validation:
disabled: true
。。。
- 修改需要登录的主机的/etc/hosts文件,添加域名与地址之间的管理
- 修改daemon.json文件以配置,且重启后加载成功
- 重新使用域名登录。。。
[root@myos docker]$docker login -u admin -p Harbor12345 www.harbor.com
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
注意:使用域名部署的harbor,登陆时也要使用域名。。。!!!
执行方式
sh harbor_ssl.sh
脚本内容
#!/bin/bash
##########################################################################################
#定义变量
basepath=$(cd `dirname $0`; pwd)
city="Shanghai"
#证书的域名
domain_name="registry.harbor.cn"
#harbor中对外访问的端口,默认443,可根据实际情况去填写
domain_port="443"
damain_cerds_name="${domain_name}:${domain_port}"
domain_name1=`echo $domain_name |awk -F . '{print $1"."$2}'`
domain_name2=`echo $domain_name |awk -F . '{print $2}'`
#将服务器证书和密钥复制到Harbor主机上的certficates文件夹中
ssl_path="ssl"
ssl_path_vlome="data"
#crt文件解释为CA证书,并将.cert文件解释为客户端证书
cert_path="${ssl_path}/certs.d/${damain_cerds_name}"
cert_path_vlome="certs.d/${damain_cerds_name}"
##########################################################################################
info(){
echo -e "\033[35m [`hostname` `whoami` `date '+%Y-%m-%d %H:%M:%S'`]\033[0m " "\033[34m$1\033[0m"
}
#####################################################
#生成CA证书私钥
ca_key(){
openssl genrsa -out ca.key 4096 &>/dev/null
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=${city}/L=${city}/O=example/OU=Personal/CN= ${domain_name}" \
-key ca.key \
-out ca.crt &>/dev/null
}
#生成私钥
key(){
openssl genrsa -out ${domain_name}.key 4096 &>/dev/null
}
#生成证书签名请求(CSR)
csr(){
openssl req -sha512 -new \
-subj "/C=CN/ST=${city}/L=${city}/O=example/OU=Personal/CN=${domain_name}" \
-key ${domain_name}.key \
-out ${domain_name}.csr &>/dev/null
}
#生成一个x509 v3扩展文件
v3_ext(){
echo "
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=${domain_name}
DNS.2=${domain_name1}
DNS.3=${domain_name2}
" > v3.ext
}
#使用该v3.ext文件为您的Harbor主机生成证书。
Harbor_v3(){
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in ${domain_name}.csr \
-out ${domain_name}.crt &>/dev/null
}
#提供证书给Harbor和Docker
docker_crt(){
[ -d ${ssl_path_vlome} ] || mkdir -p ${ssl_path_vlome}
[ $? -eq 0 ]&& info "${ssl_path_vlome}创建成功"
cp ${domain_name}.crt ${ssl_path_vlome}
cp ${domain_name}.key ${ssl_path_vlome}
}
#Docker守护程序将.crt文件解释为CA证书,并将.cert文件解释为客户端证书
docker_cert(){
openssl x509 -inform PEM -in ${domain_name}.crt -out ${domain_name}.cert &>/dev/null
cp ${domain_name}.cert ${cert_path_vlome}
cp ${domain_name}.key ${cert_path_vlome}
cp ca.crt ${cert_path_vlome}
}
run_ca_start(){
info "生成CA证书私钥,请等待!!!"
ca_key
info "生成CA证书"
key
info "生成证书签名请求(CSR)"
csr
info "生成一个x509 v3扩展文件"
v3_ext
info "使用该v3.ext文件为您的Harbor主机生成证书"
Harbor_v3
info "提供证书给Harbor和Docker"
docker_crt
info "Docker守护程序将.crt文件解释为CA证书,并将.cert文件解释为客户端证书"
docker_cert
info "把certs.d目录打包成certs_d.tar.gz,复制其他docker客户端"
tar -zcf certs_d.tar.gz certs.d
if [ $? -eq 0 ];then
info "复制到docker客户端的/etc/docker/目录下"
info "执行tar -xvf ${domain_name}.tar.gz,解压到当前路径"
info "在daemon.json文件中添加\"insecure-registries\": [\"${domain_name}\"] "
else
exit 0
fi
}
[ -d ${basepath}/${ssl_path} ] || mkdir -p ${basepath}/${ssl_path}
[ $? -eq 0 ]&& info "${basepath}/${ssl_path}创建成功"
[ -d ${basepath}/${cert_path} ] || mkdir -p ${basepath}/${cert_path}
[ $? -eq 0 ]&& info "${basepath}/${cert_path}创建成功"
cd ${basepath}/${ssl_path}
run_ca_start