一、背景
研究了好久如何创建一个可供https和docker仓库使用的内网证书,最终参考这篇文章( https://www.mogublog.net/post/2443.html )和自己的摸索搞定了。用于网站的证书其实很好建,一条命令既可:“openssl req -new -x509 -days 3560 -nodes -out web.crt -keyout web.key ”。问题是,这种方式创建的证书有几个问题:
1、不能用于docker的registry仓库服务,docker会认为证书不合法,拉取、推送镜像时都会报错。
2、每生成一个证书,每个客户端浏览器或软件就需要信任一次,或者在客户端操作系统导入一次。特别是访问自建的centos系统的yum仓库(https),需要修改各个客户端的yum配置或导入到系统证书目录。(因此需要自建CA证书,客户端导入CA证书,这样用CA生成的所有证书在客户端都能信任)
3、浏览器即便信任了证书,还是会出现“不安全连接”的提示。
因此需要创建CA证书,然后用CA证书生成一个规范的域名证书,才能满足上述所有需要。创建证书可以使用前面那篇文章的脚本。我的创建、部署过程如下:
二、创建证书
1、CA证书创建脚本createCA.sh
#!/bin/bash
mkdir CA
cd CA
openssl genrsa -out ca.key 4096
openssl req -new -x509 -days 36500 -key ca.key -out ca.crt -subj "/C=CN/ST=SC/L=CD/O=COMPANY/OU=ServerOperation/CN=neiwang.yuming/emailAddress=someone@neiwang.yuming"
echo "1" > serial
# Useage: sh createCA.sh
我举例使用了内网自建域名“neiwang.yuming”,只要你的自建dns能解析,域名可以使用自定义域名。CA证书过期时间设置为100年! 😄
执行sh createCA.sh
创建出CA证书,需要保管好创建出的ca.crt和ca.key文件,不应对外暴露ca.key,必要时还应考虑对ca.key加密。
2、签署证书脚本signDoamin.sh
#!/bin/bash
mkdir ${1}
cd ${1}
echo "[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
req_extensions = req_ext
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
stateOrProvinceName = State or Province Name (full name)
stateOrProvinceName_default = SC
localityName = Locality Name (eg, city)
localityName_default = CD
organizationName = Organization Name (eg, company)
organizationName_default = COMPANY
organizationalUnitName = Organizational Unit Name (eg, section)
organizationalUnitName_default = ServerOperation
commonName = Common Name (e.g. server FQDN or YOUR name)
commonName_max = 64
commonName_default = ${1}
[ req_ext ]
subjectAltName = @alt_names
[alt_names]
DNS.1 = ${1}
#IP.1 = ${1}
" > san.conf
openssl genrsa -out ${1}.key 4096
openssl req -new -key ${1}.key -out ${1}.csr -config san.conf -sha256
# serial 唯一
serial=$(cat ../CA/serial)
openssl x509 -req -days 18250 -in ${1}.csr -CA ../CA/ca.crt -CAkey ../CA/ca.key -set_serial $((serial+1)) -out ${1}.crt -extfile san.conf -extensions req_ext
echo $((serial+1)) > ../CA/serial
# Useage: sh signDoamin.sh yourdomain.suffix
域名过期时间我设置为50年! 😄
执行sh signDoamin.sh svrops.neiwang.yuming
,创建出域名为svrops.neiwang.yuming的证书。
三、部署证书
1、在服务器端部署web证书
将签署生成的svrops.neiwang.yuming.crt、svrops.neiwang.yuming.key文件加载至web服务。
2、在客户端部署CA证书
2.1、客户端为centos7
将生成的ca.crt文件重命名为neiwang.yuming-CA.crt
,然后拷贝到客户端centos7系统的/etc/pki/ca-trust/source/anchors/
目录中。然后执行update-ca-trust
命令使证书生效。注意,如果是使用docker访问服务器端,则还需要重启docker服务!(如果docker设置了代理,则要注意将该域名加入NoProxy列表,我就犯了这个低级错误,浪费了时间!下同)
2.2、客户端为ubuntu
将生成的ca.crt文件重命名为neiwang.yuming-CA.crt
,然后拷贝到客户端ubuntu系统的/usr/local/share/ca-certificates/
目录中。然后执行update-ca-certificates
命令使证书生效。注意,如果是使用docker访问服务器端,则还需要重启docker服务!
2.3、客户端为windows
将生成的ca.crt文件导入IE、firefox浏览器即可。