生成自签名SSL证书
CA 和证书
CA(Catificate Authority,数字证书认证机构),负责发放和管理数字证书的权威机构,并作为受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
CA 是公钥基础设施的核心,负责签发证书、认证证书、管理已颁发证书的机关。它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。
证书实际是由证书签证机关(CA)签发的对用户的公钥的认证。
证书的内容包括:电子签证机关的信息、公钥用户信息、公钥、权威机构的签字和有效期等等。目前,证书的格式和验证方法普遍遵循X.509国际标准。
- 加密:CA认证将文字转换成不能直接阅读的形式(即密文)的过程称为加密。
- 解密:将密文转换成能够直接阅读的文字(即明文)的过程称为解密。
如打算在电子文档上实现签名的目的,可使用数字签名。RSA公钥体制可实现对数字信息的数字签名,方法如下:
信息发送者用其私钥对从所传报文中提取出的特征数据(或称数字指纹)进行RSA算法操作,以保证发信人无法抵赖曾发过该信息(即不可抵赖性),同时也确保信息报文在传递过程中未被篡改(即完整性)。当信息接收者收到报文后,就可以用发送者的公钥对数字签名进行验证。
在数字签名中有重要作用的数字指纹是通过一类特殊的散列函数(HASH函数)生成的。对这些HASH函数的特殊要求是:
- 接受的输入报文数据没有长度限制;
- 对任何输入报文数据生成固定长度的摘要(数字指纹)输出;
- 从报文能方便地算出摘要;
- 难以对指定的摘要生成一个报文,而由该报文可以算出该指定的摘要;
- 两个不同的报文难以生成具有相同的摘要。
创建 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
-x509
: 说明是要生成自签名证书。-days 36500
: 从生成之时算起,证书时效为 36500 天。-keyout ./CA/rootCA.key
: 将生成的秘钥对保存到./CA/rootCA.key
。-out ./CA/rootCA.crt.pem
: 将生成的证书请求保存到文件./CA/rootCA.crt.pem
。-subj
: 添加 CA 信息- CN (Common Name , 通用名,FQDN 或 名称)
- C (Country , 国家)
- ST (State or Province ,州或省)
- L (Locality , 城市)
- O (Organization , 组织名称)
- OU (Organizational Unit , 组织部门)
若不添加 -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
-passout pass:159753
指定秘钥对的密码为159753
去除秘钥密码:
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
-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://github.com/FiloSottile/mkcert
参考
openSSL命令、PKI、CA、SSL证书原理 - 郑瀚Andrew.Hann - 博客园