生成自签名SSL证书

CA 和证书

CA(Catificate Authority,数字证书认证机构),负责发放和管理数字证书的权威机构,并作为受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
CA 是公钥基础设施的核心,负责签发证书、认证证书、管理已颁发证书的机关。它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。

证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。
证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。目前,证书的格式和验证方法普遍遵循X.509国际标准。

如打算在电子文档上实现签名的目的,可使用数字签名。RSA公钥体制可实现对数字信息的数字签名,方法如下:
信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在传递过程中未被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。
在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH函数)生成的。对这些HASH函数的特殊要求是:

  1. 接受的输入报文数据没有长度限制;
  2. 对任何输入报文数据生成固定长度的摘要(数字指纹)输出;
  3. 从报文能方便地算出摘要;
  4. 难以对指定的摘要生成一个报文,而由该报文可以算出该指定的摘要;
  5. 两个不同的报文难以生成具有相同的摘要。

创建 CA 证书

OpenSSL 默认配置文件 openssl.cnf (/usr/lib/ssl/openssl.cnf/etc/ssl/openssl.cnf)

创建 CA 目录结构

创建相应的目录和文件:

mkdir CA

生成 CA 秘钥和证书

openssl req -x509 \
            -sha256 -days 35600 \
            -nodes \
            -newkey rsa:2048 \
            -subj "/CN=LOCAL CA_eonun/C=CN/ST=beijing/L=beijing/O=eonun Pty Ltd/OU=eonun" \
            -keyout ./CA/rootCA.key -out ./CA/rootCA.crt.pem

若不添加 -subj 选项,则通过交互方式输入 CA 信息

Enter pass phrase for ./CA/rootCA.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

Country Name (2 letter code) [AU]:CN # 国家简写
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:Local Certification # 填写 CA 机构名称
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

如果出现以下错误,修改/etc/ssl/openssl.cnf ,将RANDFILE = $ENV::HOME/.rnd 那一行注释

Can't load /home/vagrant/.rnd into RNG

创建用户证书

生成用户秘钥对

openssl genrsa -out cloud.key 2048

生成带密码的秘钥对 : openssl genrsa -des3 -passout pass:159753 -out cloud.key 2048

去除秘钥密码: openssl rsa -in cloud.key -out nopass.cloud.key

生成用户证书签名请求(Certificate Signing Request , CSR)

创建请求配置

cat > cloud.csr.conf <<EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
# 国家
C = CN
# 州或省
ST = beijing
# 城市名称
L = beijing
# 组织名称
O = eonun Pty Ltd
# 部门名称
OU = eonun
# 通用名
CN = cloud.eonun.local

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
#DNS.1 = demo.mlopshub.com
#DNS.2 = www.demo.mlopshub.com
#IP.1 = 192.168.1.5
#IP.2 = 192.168.1.6
DNS.1 = cloud.eonun.local
DNS.2 = www.cloud.eonun.local

EOF

生成请求

openssl req -new -key cloud.key -out cloud.csr -config cloud.csr.conf

签发证书

创建证书配置文件

cat > cloud.cert.conf <<EOF

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = cloud.eonun.local

EOF

生成证书

openssl x509 -req \
    -in cloud.csr \
    -CA ./CA/rootCA.crt.pem -CAkey ./CA/rootCA.key \
    -CAcreateserial -out cloud.crt.pem \
    -days 3650 \
    -sha256 -extfile cloud.cert.conf

查看证书

openssl x509 -in cloud.crt.pem -text -noout

Windows 下需将证书重命名为 .crt 后缀的才可被识别

脚本

cat > CAssl.sh <<EOF
#! /bin/bash
if [ "\$#" -ne 1 ]
then
  echo "Error: 未提供 PQDN 参数 或 CA 名称"
  echo "使用方法: CAssl.sh demo.mlopshub.com 或 CAssl.sh LOCAL_CA_demo"
  exit 1
fi

DOMAIN=\$1

mkdir CA
echo "# 创建 CA & CA 私钥"
openssl req -x509 \\
            -sha256 -days 3560 \\
            -nodes \\
            -newkey rsa:2048 \\
            -subj "/CN=\${DOMAIN}/C=CN/ST=beijing/L=beijing" \\
            -keyout ./CA/rootCA.key -out ./CA/rootCA.crt.pem

openssl x509 -in ./CA/rootCA.crt.pem -text -noout

EOF
cat > USERssl.sh <<USE
#! /bin/bash
if [ "\$#" -ne 1 ]
then
  echo "Error: 未提供域名参数"
  echo "使用方法: USERssl.sh demo.mlopshub.com"
  exit 1
fi

DOMAIN=\$1

mkdir \$DOMAIN
echo "生成用户私钥"
openssl genrsa -out ./\$DOMAIN/\${DOMAIN}.key 2048

echo "创建证书签名请求(Certificate Signing Request , CSR)配置"
cat > ./\$DOMAIN/csr.conf <<EOF
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
# 国家
C = CN
# 州或省
ST = beijing
# 城市名称
L = beijing
# 组织名称
O = eonun Pty Ltd
# 部门名称
OU = eonun
# 通用名
CN = \${DOMAIN}

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = \${DOMAIN}
DNS.2 = www.\${DOMAIN}
#IP.1 = 192.168.1.5 
#IP.2 = 192.168.1.6

EOF

echo "使用请求配置和私钥生成请求"
openssl req -new -key ./\$DOMAIN/\${DOMAIN}.key -out ./\$DOMAIN/\${DOMAIN}.csr -config ./\$DOMAIN/csr.conf

echo "创建用户证书配置"
cat > ./\$DOMAIN/cert.conf <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = \${DOMAIN}

EOF

echo "生成用户证书"
openssl x509 -req \\
    -in ./\$DOMAIN/\${DOMAIN}.csr \\
    -CA ./CA/rootCA.crt.pem -CAkey ./CA/rootCA.key \\
    -CAcreateserial -out ./\$DOMAIN/\${DOMAIN}.crt.pem \\
    -days 3650 \\
    -sha256 -extfile ./\$DOMAIN/cert.conf
    
openssl x509 -in ./\$DOMAIN/\${DOMAIN}.crt.pem -text -noout

USE

chmod +x CAssl.sh USERssl.sh

./CAssl.sh ca.mlopshub.com

./USERssl.sh user.mlopshub.com

全平台证书工具

https://keymanager.org/

https://github.com/FiloSottile/mkcert

参考

openSSL命令、PKI、CA、SSL证书原理 - 郑瀚Andrew.Hann - 博客园

OpenSSL 自建CA及签发证书_scuyxi的博客-CSDN博客

实现局域网https域名访问内网服务 - 掘金