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
三、浏览器信任
将CA根证书cacert.pem导入到本地“受信任的根证书颁发机构”即可。最终如下: