创建内网私有CA证书签署自定义域名证书

一、背景

  研究了好久如何创建一个可供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浏览器即可。

posted @ 2020-09-29 13:03  会游泳的鱼·bytefish  阅读(2051)  评论(0编辑  收藏  举报