创建自签名Root CA
方法一:通过修改openssl.cnf文件来制作, 这个方法是最正规的方法,如果需要生成中间证书,或者需要db/index进行证书维护的话,这个方法是必要的。
准备必要的文件夹和文件
mkdir -p ~/ssl/demo_rootCA/{certs,newcerts,crl,csr,private}
cd ~/ssl/demo_rootCA
touch index.txt
echo "01" > serial
其实index.txt 和 serial 文件的路径也是openssl.cnf 中定义的,所以复制出来openssl.cnf 为所用的root-ca.cnf 之后,也要注意这个路径在root-ca.cnf内配置是否正确
复制openssl.cnf模板为root-ca.conf,进行自定义设置
sudo cp /etc/ssl/openssl.cnf ~/ssl/demo_rootCA/root-ca.cnf
vi ~/ssl/demo_rootCA/root-ca.cnf
主要是修改如下部分:
####################################################################
[ CA_default ]
dir = /root/ssl/demo_rootCA/ # Where everything is kept
certificate = $dir/certs/root-ca.crt.pem
private_key = $dir/private/root-ca.key.pem
要注意下,cnf文件中默认给予的privatekey文件的默认名字, index.txt, serial路径等信息是否符合预期,或者正确
生成Root CA的私钥
cd ~/ssl/demo_rootCA
# 注意这里的私钥名字和路径要和cnf文件里面的对应
openssl genrsa -aes256 -out private/root-ca.key.pem 4096
# 养成给key 400的习惯
chmod 400 private/root-ca.key.pem
生成Root CA的CSR请求文件
这一步会开始询问CN等信息,一步步回答即可。
cd ~/ssl/demo_rootCA
openssl req -new -config ./root-ca.cnf -sha256 -key private/root-ca.key.pem -out csr/root-ca.csr.pem
(Optional)免去交互应答的设定CSR的设置
[ req ]
# Options for the `req` tool (`man req`).
# Optionally, specify some defaults.
prompt = no
input_password = 123456
(Optional) 查看CSR文件
openssl req -text -noout -in csr/rootca.csr.pem
创建Root CA的证书
这里要注意几点:
-
-selfsing
选项,它说明所有的根证书都是自签名的 - 这一步会有交互,询问你有效时间,几个证书需要签名等
- 当前文件夹下,会有新的serial,index.txt 等文件生成
- 正常的生产环境则是找第三方CA公司进行签发。
openssl ca -selfsign -config root-ca.cnf -extensions v3_ca -days 7300 -notext -md sha256 -in csr/root-ca.csr.pem -out certs/root-ca.crt.pem
(Optional) 查看证书详情信息
openssl x509 [-noout] -text -in rootca.crt
且,查看证书详情里面,主要要关注以下信息:
Subject 指明证书自身的信息,这里 Issurer 和 Subject 的信息是一样的;下面还有 X509 协议相关的信息,这部分信息由配置文件 rootca.cnf 中的 [ v3_ca ] 段控制:
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
55:a4:cd:af:b4:2b:e2:cc:af:ff:d7:7f:ae:42:59:a0:a3:1a:45:64
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = Guangdong, L = Guangzhou, O = "Demo, Ltd.", OU = Demo CA ROOT, CN = *.demo.com, emailAddress = dev@demo.com
Validity
Not Before: Nov 27 09:26:42 2022 GMT
Not After : Nov 27 09:26:42 2023 GMT
Subject: C = CN, ST = Guangdong, L = Guangzhou, O = "Demo, Ltd.", OU = Demo CA ROOT, CN = *.demo.com, emailAddress = dev@demo.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
...
X509v3 extensions:
X509v3 Subject Key Identifier:
CB:DF:E7:A0:CC:79:49:A6:C6:5A:14:49:21:0D:56:8E:80:30:CF:DD
X509v3 Authority Key Identifier:
CB:DF:E7:A0:CC:79:49:A6:C6:5A:14:49:21:0D:56:8E:80:30:CF:DD
X509v3 Basic Constraints: critical
CA:TRUE
方法二:简单些方法步来完成制作自签名根CA(不指定openssl.cnf文件)
生成root CA的私钥,(实际上无论根CA,还是服务端,客户端,私钥均是如此生成)。 经过测试,如果制定-aes256
参数,则会询问输入密码。
openssl genrsa [-aes256] -out rootca.key 4096
(Optional) 查看Key文件详细解析:
openssl rsa -in rootca.key -text
(Optional) 通过私钥可以提取公钥
openssl rsa -pubout -in rootca.key
根据私钥文件生成CSR请求文件, 这个过程中,会询问CN等信息,按照需要填写
openssl req -new [-sha256] -out root-req.csr -key rootca.key [-keyform PEM]
(Optional) 查看CSR文件详情
openssl req -text -noout -in root-req.csr
利用上一步得到的CSR签发自签名的RootT CA根证书,注意,正常的生产环境则是找第三方CA公司进行签发。
openssl x509 -req -days 365 [-sha256 -CAcreateserial -extensions v3_ca] -in root-req.csr -signkey rootca.key -out rootca.crt
-CAcreateserial,创建证书序列号,使用此选项,当CA序列号文件不存在时将被创建:它将包含序列号“02”(根据实际配置文件Serial来),正在签名的证书将具有1作为其序列号。通常如果指定了-CA选项并且序列号文件不存在,则会出现错误
-extensions, ignoring -extensions option without -extfile, 需要指定extfile
Tips
Tips: 方法二实际上就是方法三的拆解步骤。在某些特殊需求条件下,我们是需要保留类似CSR请求文件和Serial文件的,所以方法一和方法二,某些场景下,依然需要。
方法三:直接一步命令生成CA证书密钥对
一步生成CA证书和对应密钥,实际上就是免去了中间生成CSR的步骤,而是通过交互方式完成输入过程。
openssl req -new -x509 -newkey rsa:4096 -keyout cakey.key -out cacert.crt -days 365
甚至连交互输入CSR信息都免去,命令后参数带上-subj
参数
openssl req -x509 -newkey rsa:4096 -days 365 -nodes -keyout ca-key.pem -out ca-cert.pem -subj "/C=CN/ST=Guangdong/L=Guangzhou/O=Demo, Ltd./OU=Demo CA ROOT/CN=*.demo.com/emailAddress=dev@demo.com"
创建中间Intermediate CA
必要说明
该部分操作,是延续上文中创建root CA方法一之后的延续。请参考上文说明之后进行如下操作
准备文件夹和文件
mkdir -p ~/ssl/demo_intermediateCA/{certs,newcerts,crl,csr,private}
cd ~/ssl/demo_intermediateCA
touch index.txt
echo "01" > serial
复制openssl.cnf模板为intermediate-ca.cnf,进行自定义设置
sudo cp /etc/ssl/openssl.cnf ~/ssl/demo_intermediateCA/intermediate-ca.cnf
vi ~/ssl/demo_intermediateCA/intermediate-ca.cnf
主要是修改如下部分:
####################################################################
[ CA_default ]
dir = /root/ssl/demo_intermediateCA/ # Where everything is kept
certificate = $dir/certs/intermediate-ca.crt.pem
private_key = $dir/private/intermediate-ca.key.pem # The private key
...
(Optional) 同时要注意,要给上一级root ca的cnf文件 rootca.cnf
也进行下修改,修改如下 --- 当然不修改也可以,直接使用默认值**v3_ca**
设定也可以, 这里只是提供一种思路:
[ req ]
...
# 原本为v3_ca
x509_extensions = v3_intermediate_ca # The extensions to add to the self signed cert
...
# 可以从[ v3_ca ] section进行复制并修改如下
[ v3_intermediate_ca ]
# Extensions for a typical intermediate CA
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid:always,issuer
basicConstraints = critical,CA:true
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
要注意下,cnf文件中默认给予的privatekey文件的默认名字, index.txt, serial路径等信息是否符合预期,或者正确
这里为了和root ca进行区分,把private key的默认名字修改了下。实际上不修改也可以,只要操作者能区分即可。
创建私钥
cd ~/ssl/demo_intermediateCA
#注意和intermediate.cnf 文件内的路径一致
openssl genrsa -aes256 -out private/intermediate-ca.key.pem 4096
# 养成给key 400的习惯
chmod 400 private/intermediate-ca.key.pem
生成CSR请求文件
这一步的交互问答CN等重要信息,不要和Root CA一样,要有区别。
cd ~/ssl/demo_intermediateCA
openssl req -new -config ./intermediate-ca.cnf -sha256 -key private/intermediate-ca.key.pem -out csr/intermediate-ca.csr.pem
创建中间CA证书
这里有几点需要注意的地方:
- 注意!这里是用的是Root CA 的 root-ca.cnf 和 Intermediate CA 自己的 csr 为用户生成中间CA证书。
- 另外,这里是直接使用了
v3_ca
的section,并非是上文修改的c3_intermediate_ca
- 文件夹下的index.txt 等文件都会更新的
- **./demo_rootCA/index **文件是 OpenSSL CA 工具存储证书的数据库,请不要手动修改这个文件
cd ..
openssl ca -config ./demo_rootCA/root-ca.cnf -extensions v3_ca -days 365 -notext -md sha256 -in ./demo_intermediateCA/csr/intermediate-ca.csr.pem -out ./demo_intermediateCA/certs/intermediate-ca.crt.pem
查看证书信息
openssl x509 -noout -text -in ./demo_intermediateCA/certs/intermediate-ca.crt.pem
验证中间证CA书
openssl verify -CAfile ./demo_rootCA/certs/root-ca.crt.pem ./demo_intermediateCA/certs/intermediate-ca.crt.pem
./demo_intermediateCA/certs/intermediate-ca.crt.pem: OK
创建证书链
所谓的证书链,简单的说就是把根证书和中间证书按照顺序放置在同一个证书文件中。重点是:中间证书在上面,根证书在下面
cat ./demo_intermediateCA/certs/intermediate-ca.crt.pem ./demo_rootCA/certs/root-ca.crt.pem > ./demo_intermediateCA/certs/ca-chain.crt.pem
(Optional)生成pkcs12的证书链
openssl pkcs12 --export -name "intermediate CA chain pkcs12" -inkey ./demo_intermediateCA/private/intermediate-ca.key.pem -in ./demo_intermediateCA/certs/intermediate-ca.crt.pem -certfile ./demo_intermediateCA/certs/ca-chain.crt.pem -out ./demo_intermediateCA/certs/ca-chain.crt.pk12
Enter pass phrase for ./demo_intermediateCA/private/intermediate-ca.key.pem:
Enter Export Password:
Verifying - Enter Export Password:
创建(对CA而言)客户端证书
概念容易混淆的地方说明
对于网络服务器和浏览器两者,或者OpenVPN而言,分为服务端和客户端,都是两个对端彼此校验。我们习惯性称为服务端
和客户端
. 但是对于CA来说,他们都是对于CA来说的“客户端”。所以下面的操作步骤,我们只需要执行两次---生成两套证书,分别给网络的服务端和用户客户端分别使用即可。
我这里使用“enduser"作为名字,实际操作中,可以将”enduser"替换为“server_end" 和 ”client_end" 来生成两套证书即可
准备文件夹和文件
mkdir -p ~/ssl/demo_enduserCert/{certs,newcerts,crl,csr,private}
cd ~/ssl/demo_enduserCert
touch index.txt
echo "01" > serial
复制openssl.cnf模板为intermediate-ca.cnf,进行自定义设置
sudo cp /etc/ssl/openssl.cnf ~/ssl/demo_enduserCert/enduser-cert.cnf
vi ~/ssl/demo_enduserCert/enduser-cert.cnf
主要是修改如下部分:
####################################################################
[ CA_default ]
dir = /root/ssl/demo_enduserCert/ # Where everything is kept
certificate = $dir/certs/enduser-cert.crt.pem
private_key = $dir/private/enduser-cert.key.pem # The private key
...
创建私钥
cd ~/ssl/demo_enduserCert
#注意和intermediate.cnf 文件内的路径一致
openssl genrsa -aes256 -out private/enduser-cert.key.pem 4096
# 养成给key 400的习惯
chmod 400 private/enduser-cert.key.pem
创建CSR请求文件
openssl req -new -sha256 -config ./enduser-cert.cnf -key private/enduser-cert.key.pem -out csr/enduser-cert.csr.pem
利用中间CA来签发证书
注意要点:
- 用的是中间CA的cnf文件
- 用enduser 自己的csr文件
- 注意extensions指定的是中间CA的cnf文件里面
usr_cert
的section
openssl ca -config ./demo_intermediateCA/intermediate-ca.cnf -extensions usr_cert -days 365 -notext -md sha256 -in ./demo_enduserCert/csr/enduser-cert.csr.pem -out ./demo_enduserCert/certs/enduser-cert.crt.pem
如果不想使用intermediate-ca.cnf 文件,也可以用如下命令来用中间CA来签发证书:
openssl x509 -req -in ./demo_enduserCert/csr/enduser-cert.csr.pem -CA ./demo_intermediateCA/certs/intermediate-ca.crt.pem -CAkey ./demo_intermediateCA/private/intermediate-ca.key.pem -out ./demo_enduserCert/certs/enduser-cert-without-cnf.crt.pem -set_serial 1000 -days 365
#或者
openssl x509 -req -in ./demo_enduserCert/csr/enduser-cert.csr.pem -CA ./demo_intermediateCA/certs/intermediate-ca.crt.pem -CAkey ./demo_intermediateCA/private/intermediate-ca.key.pem -out ./demo_enduserCert/certs/enduser-cert-without-cnf-createserial.crt.pem -CAcreateserial -days 365
查看证书信息
我们可以注意到是中间CA签发的(Issuer字段)。且CA:FALSE, 表示不能作为CA证书了。
openssl x509 -noout -text -in ./demo_enduserCert/certs/enduser-cert.crt.pem
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 1 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = CN, ST = Shanghai, O = JP Org, OU = JP Org Unit, CN = JP Intermediate CA
Validity
Not Before: Nov 27 15:53:56 2022 GMT
Not After : Nov 27 15:53:56 2023 GMT
Subject: C = CN, ST = Shanghai, O = JP Org, OU = JP Org Unit, CN = JP Enduser Cert
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (4096 bit)
Modulus:
...
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
验证证书的合法性
openssl verify -CAfile ./demo_intermediateCA/certs/ca-chain.crt.pem ./demo_enduserCert/certs/enduser-cert.crt.pem
./demo_enduserCert/certs/enduser-cert.crt.pem: OK
如果用的不是完整证书链,而仅仅是中间CA的话,报错如下
openssl verify -CAfile ./demo_intermediateCA/certs/intermediate-ca.crt.pem ./demo_enduserCert/certs/enduser-cert.crt.pem
C = CN, ST = Shanghai, O = JP Org, OU = JP Org Unit, CN = JP Intermediate CA
error 2 at 1 depth lookup: unable to get issuer certificate
error ./demo_enduserCert/certs/enduser-cert.crt.pem: verification failed
部署和安装
部署的话,以部署服务端证书为例子。
把上面的enduser 的证书,部署到服务端,比如Web服务器中,然后用户的电脑或者Firefox导入对应的证书链即可。