一、OpenSSL:CA默认配置信息
openssl 配置文件:/etc/pki/tls/openssl.cnf
openssl.cnf部分配置信息和CA相关的配置文件,可修改
####################################################################
[ ca ]
default_ca = CA_default # The default ca section 指定默认CA是CA_default
####################################################################
[ CA_default ]
dir = /etc/pki/CA # Where everything is kept CA的公共目录 定义一个dir变量
certs = \$dir/certs # Where the issued certs are kept
crl_dir = \$dir/crl # Where the issued crl are kept 证书吊销列表
database = $dir/index.txt # database index file. 证书数据库,存放证书的状态,编号等,需要手工创建,创建的是一个空文件,数据自动生成
\#unique_subject = no # Set to 'no' to allow creation of
# several ctificates with same subject.
new_certs_dir = \$dir/newcerts # default place for new certs. 颁发的证书自动生成
certificate = \$dir/cacert.pem # The CA certificate CA自己的证书,根CA是自己给自己颁发的证书,子CA是由上级CA颁发的证书
serial = \$dir/serial # The current serial number 当前序列号,是一个16进制,数值要放在此文件夹中,但是表示的是颁发的下一个证书的编号
crlnumber = \$dir/crlnumber # the current crl number 下一个证书的吊销编号
# must be commented out to leave a V1 CRL
crl = \$dir/crl.pem # The current CRL
private_key = \$dir/private/cakey.pem# The private key 证书的私钥
RANDFILE = \$dir/private/.rand # private random number file 随机数
x509_extensions = usr_cert # The extentions to add to the cert x509
\# Comment out the following two lines for the "traditional"
\# (and highly broken) format.
name_opt = ca_default # Subject Name options 命令方式是由ca_default决定的
cert_opt = ca_default # Certificate field options
\# Extension copying option: use with caution.
\# copy_extensions = copy
\# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
\# so this is commented out by default to leave a V1 CRL.
\# crlnumber must also be commented out to leave a V1 CRL.
\# crl_extensions = crl_ext
default_days = 365 # how long to certify for 证书的有效期默认是365天,可以修改
default_crl_days= 30 # how long before next CRL crl 默认有效期是30天
default_md = sha256 # use SHA-256 by default
preserve = no # keep passed DN ordering
\# A few difference way of specifying how similar the request should look
\# For type CA, the listed attributes must be the same, and the optional
\# and supplied fields are just that :-)
policy = policy_match 策略是policy_match
\# For the CA policy
[ policy_match ] 纪录的是CA搭建的时候的以及客户端申请CA证书的时候信息匹配程度
countryName = match 国家
stateOrProvinceName = match 美国的州 我们国家应该是省
organizationName = match 公司
organizationalUnitName = optional 公司部门
commonName = supplied 通用名,主机名,给网站域名用的
emailAddress = optional 邮件地址
注意: match 必须匹配 optional 可有可无,可以不一样 supplied 必须添加,可以不一样
\# For the 'anything' policy
\# At this point in time, you must list all acceptable 'object'
\# types.
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
####################################################################
二、OpenSSL:创建私有证书签发机构CA步骤
1.生成私钥
cd /etc/pki/CA/
umask 066;openssl genrsa -out private/cakey.pem -des3 2048)
umask #指定文件的权限
genrsa #私钥加密的算法
-out private/cakey.pem #生成的私钥存放路径,这里必须是这个路径,如果要改成其他路径,需要修改配置/etc/pki/CA
-des3 #加密算法,后面跟的位数范围是 1024 到 4096 我们这里选择2048
如上图,输入口令加密私钥。
如上图查看生成的私钥文件catkey.pem
2. 利用私钥生成自签名证书
cd /etc/pki/CA
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 7300
-new:#生成新证书签署请求;
-x509:#生成自签格式证书,专用于创建私有CA时;
-key:#生成请求时用到的私有密钥文件路径;
-out:#生成的请求文件路径;如果自签操作将直接生成签署过的证书;
-days:#证书的有效时长,单位是day;
填写证书基本信息
Country Name (2 letter code) [XX]: # 两个字符表示的国家代码,CN为中国
State or Province Name (full name) []: # 省或洲的完整名称
Locality Name (eg, city) [Default City]: # 所在位置的名称(默认为城市)
Organization Name (eg, company) [Default Company Ltd]: # 组织机构名称(默认为公司)
Organizational Unit Name (eg, section) []: # 组织机构单元名称(eg.部门)
Common Name (eg, your name or your server’s hostname) []: # 持有者名或者所在服务器主机名(即域名)
Email Address []: # 管理员邮件地址,可以省略
查看自签名证书
在xshell中执行命令
sz cacert.pem
把数字证书cacert.pem 导入到Windows系统中可以看一下效果
如上图,因为我们创建的自签名证书,所以【颁发者】和【颁发给】后面跟的都是同一主机名ca.zhangym.com。时间也是我们设置的7300天,大约20年。还可以查看证书路径,详细信息等等,这里不再截图展示了。
三、OpenSSL:子CA证书申请和根CA颁发 证书给子CA
1. 子CA生成证书请求
子CA生成私钥
(umask 066;openssl genrsa -out private/cakey.pem -des3 2048)
openssl req -new -key private/cakey.key -out subca.csr
证书信息填写
将证书请求文件传输给根CA
openssl ca -in subca.csr -out certs/subca.crt #可以加上期限(-days xxxx),这里我选择配置文件默认期限
2. 根CA签署证书,并将证书颁发给请求者
cd /etc/pki/CA #注意路径,进入CA目录下操作
touch index.txt #证书数据库,存放证书的状态,编号等
openssl ca -in subca.csr -out certs/subca.crt
可以查看到/etc/pki/CA/certs/目录下生成的颁发的证书subca.crt文件
scp certs/subca.crt 172.18.24.6:/etc/pki/CA/cacert.pem
注意:这里要把subca.crt文件的后缀名改成 .pem,配置文件规定,CA要有cacert.pem文件才可以颁发证书。
自此根CA给子CA颁发的证书cacert.pem就生成了,子CA就可以在相应的服务中使用证书了。
四、OpenSSL:客户端申请证书和子CA颁发证书
1. 客户端生成私钥
进入到/etc/pki/tls目录下,这里把客户端生成的私钥存放在tls目录下的private目录中,可以自行选择存放路径,这里没有严格要求路径
cd /etc/pki/tls
(umask 066; openssl genrsa -out private/app.key -des3 2048)
如上图,openssl命令参数跟一步骤的生成私钥一样,这里不做过多的阐述。
2. 在需要使用证书的主机生成证书请求
生成私钥
openssl req -new -key private/app.key -out app.csr
#这里跟步骤一生成自签名文件一样,不过少了-x509,加上-x509表示自签名,我们这里是申请证书
生成app.csr证书请求文件
openssl req -new -key private/app.key -out app.csr
填写申请证书信息,如下图
将证书请求文件传输给子CA
2. 子CA签署证书,并将证书颁发给请求者
cd /etc/pki/CA #注意路径,进入CA目录下操作
touch index.txt #证书数据库,存放证书的状态,编号等
echo 00 > serial #数值要放在此文件夹中,但是表示的是颁发的下一个证书的编号,00表示下一个数字证书的编号是00,可以自己自己指定一个值
颁发证书
openssl ca -in app.csr -out certs/app.crt -days 100 #这里期限设置为100天
**注意:默认证书请求和子CA上的,国家、省、公司名称三项必须一致,如果填写不一致,可能会报错,需要从会客户端从新生成app.csr文件 。如果我们修改了配置,把policy-math改成policy-anything,这个时候所有的信息都可以不一样,其实那些信息一样,那些信息不一样,都是可以通过修改配置文件的策略来自定义的。我们这里选择默认,感兴趣的同学可以试试。
**
正确操作后,会有两个选择,都选择Y即可。
查看index文件和serial文件
把颁发的证书发送给客户端
证书在客户端服务里面的使用不是这里的重点,不在这里详讲。
同时我们可以修改CA端的/etc/pki/CA/目录下的index.txt.attr文件,unique_subject = yes改成unique_subject = no ,可以颁发两个相同的证书。
自此,子CA颁发给客户端的数字证书app.crt 就生成了,客户端就可以在相应的服务中使用数字证书了。
五、OpenSSL:吊销证书
1. 在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,吊销证书:
openssl ca -revoke newcerts/01.pem
吊销证书后,可以查看index.txt文件下的信息,R表示颁发的无效,说明吊销成功,如果显示V,则表示证书在生效中
2. 指定第一个吊销证书的编号
注意:第一次更新证书吊销列表前,才需要执行
echo 01 > /etc/pki/CA/crlnumber
3.更新证书吊销列表
openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem
吊销证书crl.pem就生成了