概述
CA英文全称Certification Authority,即数字证书认机构。从广义上来说,CA是负责发放和管理数字证书的权威机构,并作为用户数字认证中受信任的第三方,承担公钥体系(PKI)中公钥的合法性检验的责任,在互联网上,实现用户与用户、用户与企业之间的数字身份认证。
本文通过使用openssl进行搭建私有CA认证体系,从而简单地了解CA的认证过程。搭建私有CA,可以实现企业内部认证加密。
环境部署
本文环境基于 CentOS 6.8
步骤流程
具体操作
1. CA的配置文件
首先我们可以查看 /etc/pki/tls/openssl.cnf 的文件,找到以下内容了解CA的配置信息
#######################################################[ ca ]default_ca = CA_default # The default ca section#######################################################[ CA_default ]dir = /etc/pki/CA # CA的工作目录certs = $dir/certs # 证书存放位置crl_dir = $dir/crl # 吊销列表database = $dir/index.txt # 索引文件数据库,本文件自动生成#unique_subject = no # Set to 'no' to allow creation of # several ctificates with same subject.new_certs_dir = $dir/newcerts # 默认新签署证书存放目录.certificate = $dir/cacert.pem # CA自己的证书serial = $dir/serial # 当前发出去的证书的序列号crlnumber = $dir/crlnumber # 吊销的证书序列号 # must be commented out to leave a V1 CRLcrl = $dir/crl.pem # 当前正在使用的CRL (证书列表文件)private_key = $dir/private/cakey.pem# CA自己的私钥(建议限制权限600 )RANDFILE = $dir/private/.rand # 随机数种子x509_extensions = usr_cert # 用户扩展
2. 客户端配置
2.1. 在客户端生成密钥,建议保存至应用此证书的服务的配置文件目录下:
(演示假设证书应用于 httpd 服务,按建议,我们到 httpd 的配置文件目录下创建文件)
[root@IP160-C6-httpd ~]# >>mkdir /etc/httpd/ssl[root@IP160-C6-httpd ~]# >>cd /etc/httpd/ssl[root@IP160-C6-httpd ~]# >>( umask 077 ; openssl genrsa -out httpd.key 1024 ) # 建议:子shell中更改umask,新建文件权限即为600,子shell的umask不影响全局
2.2. 生成证书签署请求:
Tips: CSR是Certificate Signing Request的英文缩写,即证书请求文件,也就是证书申请者在申请数字证书时由CSP(加密服务提供者)在生成私钥的同时也生成证书请求文件,证书申请 者只要把CSR文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。
来自<http://baike.baidu.com/link?url=TD6KI4WvcgOHWfxuocHFvD54VHQIO5aAxn4B8k3cUg2a_RMmoK4CcktqsmdhRMVLj7cv4pXnjA5p8NdgBEsoyq>
生成
[root@IP160-C6-httpd ssl]# >>openssl req -new -key httpd.key -out httpd.csr #通过加载httpd.key生成一个新请求,保存为httpd.csr
创建过程中需要进行交互式填写信息:()
1). 国家:CN 两位国家代码(可以在/etc/pki/tls/openssl.cnf设置默认值)
2). 省份:beijing
3). 市: beijing
4). 公司:Client.Co
5). 部门:RD
6). 名字:www.client.com #非常重要,
7). 联系:test@client.com #测试使用
8). 密码:#将申请文件加密
2.3. 将httpd.csr发给CA服务器
[root@IP160-C6-httpd ssl]# >>scp httpd.csr root@10.10.20.200:/root/pem #测试环境中使用scp传输文件到CA服务器
3. 服务器配置
3.1. 生成自己的密钥对
CA服务器的配置目录初始环境
我们进入 /etc/pki/CA/ 目录生成私钥:(留意当前目录,与相对路径)
[root@IP200-C6-CA ~]# >>cd /etc/pki/CA/[root@IP200-C6-CA CA]# >>tree -C .[root@IP200-C6-CA CA]# >>( umask 077 ; openssl genrsa -out private/cakey.pem 2048 )
如果想查看公钥:(非必要步骤)
[root@IP200-C6-CA CA]# >>openssl rsa -in private/cakey.pem -pubout -text -noout
3.2. 生成自签证书
[root@IP200-C6-CA CA]# >>openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655 # -new 创建一个认证申请; # -x509 生成一份 X.509 证书,只有自签署时候才需要此选项,简化(申请-签署)过程; # -key 指明私钥文件; # -out 输出证书文件; # -days 签署证书有效期。
3.3. 创建所需文件,指定证书编号初始值
完成 3.2. 后,此时配置目录下的状态:
我们还需要新建部分初始文件,以保证CA服务正常运行
[root@IP200-C6-CA CA]# >>touch index.txt serial crlnumber[root@IP200-C6-CA CA]# >>echo 01 > serial #设置序号从01开始
到此,我们已经完成了搭建根CA服务器的过程。
3.4. 签署client的证书
CA服务器签署客户端证书的命令很简单:
[root@IP200-C6-CA CA]# >>openssl ca -in ~/pem/httpd.csr -out ~/pem/httpd.crt
此时我们运行会报错:↓↓↓↓↓↓↓
[root@IP200-C6-CA CA]# >>ll ~/pem/httpd.csr -rw-r--r--. 1 root root 761 Sep 21 17:49 /root/pem/httpd.csr[root@IP200-C6-CA CA]# >>openssl ca -in ~/pem/httpd.csr -out ~/pem/httpd.crtUsing configuration from /etc/pki/tls/openssl.cnfCheck that the request matches the signatureSignature okThe stateOrProvinceName field needed to be the same in theCA certificate (shanghai) and the request (beijing)
我们在查看 /etc/pki/tls/openssl.cnf 的文件,发现这一段内容:
原因是CA配置默认启用的是 policy_match ,限制客户端注册信息部分需要匹配CA服务器。
# 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# For the CA policy[ policy_match ]countryName = matchstateOrProvinceName = matchorganizationName = matchorganizationalUnitName = optionalcommonName = suppliedemailAddress = optional# For the 'anything' policy# At this point in time, you must list all acceptable 'object'# types.[ policy_anything ]countryName = optionalstateOrProvinceName = optionallocalityName = optionalorganizationName = optionalorganizationalUnitName = optionalcommonName = suppliedemailAddress = optional####################################################################
所以我们只需修改为 policy_anything:
再次运行签署证书命令:
签署过程需要交互回答两个问题
Sign the certificate? [y/n]:y #签署确认1 out of 1 certificate requests certified, commit? [y/n]y #写入证书数据库
我们看到证书已经在CA服务器上完成签署,数据库也记录在案了。
注:CA服务器吊销证书:(证书名)
openssl ca -revoke /PATH/TO/SOMEFILE.crt (证书名)
3.5. 回传已签署的证书给客户端
[root@IP200-C6-CA CA]# >>scp ~/pem/httpd.crt root@10.10.20.160:/etc/httpd/ssl
至此,我们完成了整个CA搭建,客户端证书认证的过程。