openssl颁发自签名证书

证书需要CA机构颁发,首先弄个CA根证书,相当于自己弄了个虚拟CA机构,只不过这个CA机构是没有人信任的(自己弄的当然没人信任),再虚拟CA机构去颁发用户证书

一、CA根证书

若相关目录不存在自行创建即可。

1.创建ca私钥

openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048

2.创建自签名ca根证书

openssl req -new -x509 -days 365 -utf8 -key /etc/pki/CA/private/cakey.pem -out cacert.pem -subj '/C=CN/ST=Shanghai/L=Shanghai/O=Test Trust CA/OU=Test Trust Root CA/CN=Test Trust Root CA/emailAddress=testcaroot@testcaroot.com'  -addext basicConstraints=critical,CA:TRUE,pathlen:3

其中subj用于描述证书拥有者,从左到右参数依次为:C=国家代码,ST=省份/州,L=城市,O=组织,OU=组织单位/部门),CN=主机名称/域名,emailAddress=联系邮箱。

CA证书必须包含basicConstraints值,且CA参数需为TRUE,pathlen参数指明了在证书信任链中,在当前证书之下允许存在的最大CA数量。当CA的pathlen值为0时,该CA仅能对终端用户证书进行签名,不能再对CA进行签名。

二、颁发用户证书

证书序列号从0开始 echo 00 > /etc/pki/CA/serial

1.创建用户证书私钥

openssl genrsa -out server-key.pem 2048
若需要对私钥加密可加加密算法参数,如-aes256,输入两次密码

2.生成证书申请文件

openssl req -new -utf8 -key test.key -out test.csr -subj /C=CN/ST=Shanghai/O=瑞文测试公司/CN=*.riventest.com  -addext basicConstraints=CA:FALSE -addext subjectAltName=DNS.1:www.riventest.com,DNS.2:*.riventest.com
若第一步私钥有密码则需要输入私钥加密的密码,没有则无需输入

查看申请文件

openssl req -in test.csr -noout -text

3.ca颁发证书

创建ca_ext.txt文件输入以下内容:

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

[alt_names]
DNS.1=*.riventest.com
DNS.2=www.riventest.com
DNS.3=*.riventest2.com

执行命令颁发证书

openssl ca -days 365 -in test.csr -out test.crt -cert /etc/pki/CA/cacert.pem -keyfile /etc/pki/CA/private/cakey.pem -policy=policy_anything -extfile=ca_ext.txt

policy使用policy_anything表示-subj指定的内容任意字段都无需相同,默认是国家、省份和组织三个字段必须一致。

ca_ext.txt文件指定了subjectAltName,若不指定可能证书认证有有问题,如chrome浏览器会报错NET::ERR_CERT_COMMON_NAME_INVALID。

对于多域名证书,在subject的CN字段可以放一个最常用的域名,并将所有域名填到subjectAltName扩展属性中。

4.查看颁发的证书信息

openssl x509 -in test.crt -noout -text

上一篇:linux命令行计算器 bc命令用法


下一篇:密码学之apache部署https