https证书制作/申请

自签证书

如果你使用的时IP而不是域名,只需要将下面的yourdomain.com改成IP地址即可。

  1. 生成CA证书私钥
    openssl genrsa -out ca.key 4096
  2. 生成CA根证书
    1
    2
    3
    4
    openssl req -x509 -new -nodes -sha512 -days 3650 \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
    -key ca.key \
    -out ca.crt
  3. 生成服务器证书私钥
    openssl genrsa -out yourdomain.com.key 4096
  4. 生成证书签名请求
    1
    2
    3
    4
    openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=yourdomain.com" \
    -key yourdomain.com.key \
    -out yourdomain.com.csr
  5. 生成 x509 v3扩展文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    cat > v3.ext <<-EOF
    authorityKeyIdentifier=keyid,issuer
    basicConstraints=CA:FALSE
    keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
    extendedKeyUsage = serverAuth
    subjectAltName = @alt_names

    [alt_names]
    DNS.1=yourdomain.com
    DNS.2=yourdomain
    DNS.3=hostname
    DNS.4=www.yourdomain.com
    EOF
    在前面制作证书时,我们使用的域名(CN/Common Name)都是yourdomain.com,如果我们这个域名提供服务有很多,如mail.yourdomain.com用于提供邮件服务,www.yourdomain.com提供网络服务,那就需要给这个域名单独申请一个证书,因为证书里的Common Name字段要和域名一一对应。当域名很多时,申请证书就很麻烦了。解决方法是只生成一个证书,但把证书给多个域名使用。该证书的Common Name,即CN字段为yourdomain.com,然后使用一个扩展文件,指定证书生效的域名有哪些,如上面的yourdomain,hostname,www.mydomain.com等等。
    当然,如果如果你没有域名,只有一个IP,上面的步骤也可以跳过。
    参考FQDN: https://blog.csdn.net/u012842205/article/details/51931017
    参考SAN: https://liaoph.com/openssl-san/ 简单来说,使用了 SAN 字段的 SSL 证书,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析。
  6. 通过v3扩展文件来生成服务端证书文件
    1
    2
    3
    4
    5
    openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in yourdomain.com.csr \
    -out yourdomain.com.crt
    以上即可生成自签证书。使用时,将ca.crt文件加入到系统的信任证书中即可。
  7. 如果服务是通过docker容器的形式对外提供,需要将crt证书转换成cert格式的证书。因为docker daemon会把crt后缀的证书当作CA根证书。
  • 生成cert证书:
    openssl x509 -inform PEM -in yourdomain.com.crt -out yourdomain.com.cert
  • 将证书拷贝到docker的证书目录
    1
    2
    3
    cp yourdomain.com.cert /etc/docker/certs.d/yourdomain.com/
    cp yourdomain.com.key /etc/docker/certs.d/yourdomain.com/
    cp ca.crt /etc/docker/certs.d/yourdomain.com/
    注: 如果你使用的nginx默认https端口不是443端口,需要将上述的路径修改成/etc/docker/certs.d/yourdomain.com:portetc/docker/certs.d/harbor_IP:port
  • 重启docker。 systemctl restart docker

完整的脚本如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
yourdomain=$1
openssl genrsa -out ca.key 4096

openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=${yourdomain}" \
-key ca.key \
-out ca.crt

openssl genrsa -out ${yourdomain}.key 4096

openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=${yourdomain}" \
-key ${yourdomain}.key \
-out ${yourdomain}.csr

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=${yourdomain}.com
DNS.2=${yourdomain}
DNS.3=www.${yourdomain}.com
EOF

openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in ${yourdomain}.csr \
-out ${yourdomain}.crt

申请免费证书。

如果需要在公网提供服务,下面的网站可以申请90天的免费证书,按照步骤申请即可。
https://app.zerossl.com/certificate/new
阿里云、腾讯云等云厂商也提供了免费的证书申请,可以直接申请一年的证书。