共计 14246 个字符,预计需要花费 36 分钟才能阅读完成。
什么是 CA
CA,Catificate Authority, 通俗的理解就是一种认证机制。它的作用就是提供证书(也就是服务端证书,由域名,公司信息,序列号,签名信息等等组成)来加强客户端与服务器端访问信息的安全性,同时提供证书的发放等相关工作。国内的大部分互联网公司都在国际 CA 机构申请了 CA 证书,并且在用户进行访问的时候,对用户的信息加密,保障了用户的信息安全。理论上来说,任何组织或者个人都可以扮演 CA 的角色,只不过,难以得到客户端的信任,不能推而广之,最典型应用莫过于 12306 网站,这个网站就是自己给自己颁发的根证书。
目前能够让浏览器默认支持的 CA 大厂有很多,Windows 操作系统在安装之初,也默认安装了很多受信任的根证书。可以通过控制面板–Internet 选项来进行查看。
SSL/TLS
SSL/TLS 是网络通信过程中非常重要的两个协议。互联网的通信安全就建立在 SSL/TLS 协议基础之上。他们通过一系列的加密行为保障了通信的安全,是如今互联网通信最主要的应用之一。
SSL/TLS 是一个很大的互联网应用,关于他们的介绍互联网上有很多,我们暂时不做详细的介绍。关于 SSL/TLS 通信的过程大致可以用下面的这张图来进行描述。
OpenSSL
OpenSSL 是一套开源软件,在 Linux 中可以很容易的安装。它能够很容易的完成密钥生成以及证书管理。我们接下来就利用 OpenSSL 搭建 CA 证书,并实现证书的申请与分发。
OpenSSL 实现 CA 证书的搭建
实验环境的准备
CA 的配置介绍
创建所需要的文件
CA 自签名证书
颁发证书
查看证书状态
证书吊销
实验环境的准备
首先我们应该准备三个虚拟机,他们分别用来表示根 CA 证书机构,以及子 CA 证书机构,和证书申请用户。那么问题来了,用户向子 CA 证书机构申请证书,子 CA 机构向根 CA 机构申请授权,根 CA 是如何取得证书的呢?答案是根 CA 自己给自己颁发的证书。实验环境的拓扑结构如下图所示。
CA 配置介绍
要手动创建 CA 证书,就必须首先了解,OpenSSL 中关于 CA 的配置,配置文件位于下面的 /etc/pki/tls/openssl.cnf
####################################################################
[ca]
default_ca= CA_default #默认 CA
####################################################################
[CA_default]
dir=/etc/pki/CA # CA 的工作目录这里其实是定义了一个变量
certs= $dir/certs # 证书存储路径
crl_dir= $dir/crl # 证书吊销列表
database= $dir/index.txt # 证书数据库列表
new_certs_dir= $dir/newcerts #新的证书路径
certificate= $dir/cacert.pem # CA 自己的证书
serial= $dir/serial #下一个证书的编号,十六进制,默认 00
crlnumber= $dir/crlnumber #下一个要被吊销的证书编号,十六进制,默认 00
crl= $dir/crl.pem # The current CRL
private_key= $dir/private/cakey.pem # CA 的私钥
RANDFILE= $dir/private/.rand # private random number file
x509_extensions = usr_cert # The extentions to add to the cert
# Comment out the following two lines for the "traditional"
# (and highly broken) format.
name_opt = ca_default # 命名方式
cert_opt = ca_default # CA 的选项
# 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 # 默认证书的有效期限
default_crl_days= 30 # how long before next CRL
default_md= default # use public key default MD
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 #策略
#这里记录的是 将来 CA 在搭建的时候,以及客户端申请证书的时候,需要提交的信息的匹配程度。# For the CA policy
[policy_match] # match 意味着 CA 以及子 CA 必须一致
countryName = match # 国家
stateOrProvinceName= match # 州或者省
organizationName= match #组织公司
organizationalUnitName = optional
commonName= supplied
emailAddress= optional
# 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
创建所需要的文件
这里有一点需要注意,我们的实验环境中包含了三个主机,其中两个的角色是作为 CA 认证机构存在的,所以创建所需要的文件的时候,主机 A 和主机 B 都需要创建。如果不提前创建这两个文件,那么在生成证书的过程中会出现错误。我们将文件创建在配置文件中指定的路径下面。
生成证书索引数据库文件
touch /etc/pki/CA/index.txt
指定第一个颁发证书的序列号
echo 01 > /etc/pki/CA/serial
CA 自签名证书 (构造根 CA)
首先构造根 CA 的证书。因为没有任何机构能够给根 CA 颁发证书,所以只能根 CA 自己给自己颁发证书。
首先生成私钥文件
私钥文件是非常重要的文件,除了自己本身以外,其他任何人都不能取得。所以在生成私钥文件的同时最好修改该文件的权限,并且采用加密的形式进行生成。
# 执行命令生成私钥文件。# 采用了 des3 的方式对私钥文件进行了加密
# 同时临时指定了 umask,使得生成的私钥文件只对自己具有读写权限。[root@localhost ~]#(umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem -des3 2048)
Generating RSA private key, 2048 bit long modulus
...............+++
.......................................+++
e is 65537 (0x10001)
Enter pass phrase for /etc/pki/CA/private/cakey.pem: #这里需要输入密码
Verifying - Enter pass phrase for /etc/pki/CA/private/cakey.pem: #这里确认密码
# 查看一个生成的私钥文件,就会发现已经被加密了
[root@localhost ~]#cat /etc/pki/CA/private/cakey.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,A4FB61EACD1544F2
9JrKVEPhnWhx1W+W1V4PdIvVHNDwb8mb0JYILvXZKc07gvNcYKIlvUoTxjtihbpk
wYQcVm0Z6b2+fjZBXVVR9igFB2OOE74BnSNMsbfPTs5W/SwWLxv0R6x0SbiZ8v/7
D6Qh3u/rXmOQWWTvQnLzh6JaT00c8zgUnn48vMev17Xyg32oJqKqJVL5RNBGmJur
6CaWX8mB5q+HYiBUXzNLQp9T3HNGcnmDNyk0gylEvjeJo3Hq+IOAkjfJE4sYO9ER
tQtsLViFUc5jXX7p0nIO0ANwE7zdjBt9I4aXknZiC4rFYJJtNSa1Wrhoo/MhuwWH
zjc4UyoB1C71sbq2LMgeElHhXN/TfqWGfXFqhkyBJwgrmzQibOJSFeWHZNurILof
UwgNLlABmazvIL5Ps6LgZtyrO2ODSDTzPiCO7kQ0S3mTHYk9+WEeEyMb4uum6oAx
oCofADL0wea+5mHVUA2s6KwRBFr01HiQ00fiul6LFvXdCwt9IL62blIJYn2veQHl
oPvC5cTnPVqJ28GJWbPvJjiOLB8Hh+4DPwxaRA1eYf2R9SR0R1SYJIBTI6NNqNwW
Lq+pD89bGCbFdYID+kAZfG27FonmmLvvhTn3jQKVPpwQBROHQ9gpwMLnpmpJWwNK
byUSit+Vt+mvbzOLjuTdsTzklwZEOkNpaE/jTqusWuhXS33D4bqA+Ws+xNVDnx6e
rbrGcbX9skXyti21oEIYem0H37ZS2fV9z+/CM/55maOX5xNVQ4aDxWuiMyyUd03D
nhhM5A4mcDvIZLpWDbHzjtkl2H9Pnb9fvGzOIOm7lVQrX8BdidpWjwGTLYG/zUX5
i9NimSnoiqgkhEYl8KXzbnMfD4hX69BXI7le5HAaS38wDKPsmRRW/dgGfRNKzfTZ
qmBimscMsllz21QnG9eqineFDdexGZw1oEQsHp2CivtEwaIKTqOZfNiwHJvm1cbz
M0NOgs+r2qze0czV9dTqM5pVND1Iac1DXYflYZ9g54riQNre/sHp1qpdNQHRRMTP
yTFnGsEfWmI4V4HiSrdQpyHIrnFUryse9kJmRKDfQK7icUf5/KrOD4FOS5zsHrep
/cE14w7s0Zqko9upkYQNBys5TbBmAK8yVJ/Zq7jU3qjDxkYNddpOt8k33vl9CG53
OeWxcWOzJCHIOjakJlLnS+XitsSY4hzUlfEO0/Ffi99zyHXybNPws5Og4KNfgcqW
ReG943oKc5qplfST2tr0K10ipD3WoV+lMbLugrwhfmVOyHGypfJhUMU0oKEjYPP3
JjHSiW0hrnNvrPQ4/mqSps3LyWYZWvH40N88U6dbxgbUgamXLHWtzJdyfBNii8uH
obtye7oeYpAzx0hNurXhpSoswFbxwU5u80eL0/YkfkzkL1P9vtMvDUw/TVNbwHVg
kTS9WEQA52XLMBtanzRzLGJVIXX6ODGgXt2Gql3KO1p43OyZq4Ksvyj8NuvdmBdO
y9SrMvv+cdOMmTkj4nmGBjqSDeFmrSSQf0HoUbfXXXw/RIW/gkcm4qPmNJXUolYp
WBOg5jT78pcJ2sRwb6YQDgC5HleBwuZujixUlKgdZxF1DEpJNBFnNDxq8yKadEzB
-----END RSA PRIVATE KEY-----
生成自签名证书
私钥文件是非常重要的文件,除了自己本身以外,其他任何人都不能取得。所以在生成私钥文件的同时最好修改该文件的权限,并且采用加密的形式进行生成。
# 调用命令生成一个签名证书
# 生成证书的过程中需要输入之前设定的私钥的密码
# -new: 生成新证书签署请求
# -x509: 专用于 CA 生成自签证书
# -key: 生成请求时用到的私钥文件
# -days n:证书的有效期限
# -out /PATH/TO/SOMECERTFILE: 证书的保存路径
[root@localhost ~]#openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 7300 -out /etc/pki/CA/cacert.pem
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shandong
Locality Name (eg, city) [Default City]:qingdao
Organization Name (eg, company) [Default Company Ltd]:pojun.tech
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:ca.pojun.tech
Email Address []:
颁发证书
颁发证书这里我们将分成两个环节介绍,分别是 子 CA 证书机构向根 CA 证书机构申请证书以及普通用户向子 CA 证书机构申请证书。
子 CA 证书机构向根 CA 申请证书
A 在需要使用证书的主机上生成证书请求
首先在 B 主机上生成私钥,这一个过程与前面根 CA 机构生成私钥的过程是一致的。
# 这次我们修改了私钥的长度
# 并且没有采用加密的方式生成
# 因为主机 B 是要作为子 CA 机构的形式存在,他也是一个 CA,所以生成私钥的时候,就应该按照配置文件中指定的内容,生成 cakey.pem
[root@CentOS6 pki]$(umask 066; openssl genrsa -out /etc/pki/CA/private/cakey.pem 1024)
Generating RSA private key, 1024 bit long modulus
......++++++
..............++++++
e is 65537 (0x10001)
# 查看私钥文件可以发现,没有了加密的标识
# 同时因为生成时指定了 1024 的长度,私钥的长度明显的变短了。[root@centos6 ~]$cat /etc/pki/CA/private/cakey.pem
-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQCxLyAKQCkysisrsuou6oJFJHs/Gk9L406x6sON1a2JX3516FJ2
·····中间省略······
R1ogCVEZq36sgNYUwaT55gLKk5Ik5T6YQimy0bsvo5oQuw==
-----END RSA PRIVATE KEY-----
利用私钥文件,生成证书申请文件。
# 其实这里的时间是没有必要指定的。# 因为证书的时间,是由颁发机构指定的,因此申请机构填写了时间也没用
# 其中有些信息必须要与根证书的内容相同因为在根证书的 openssl.cnf 文件中已经指定。[root@centos6 tls]$openssl req -new -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/tls/subca.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:shandong
Locality Name (eg, city) [Default City]:qingdao
Organization Name (eg, company) [Default Company Ltd]:pojun.tech
Organizational Unit Name (eg, section) []:opt
Common Name (eg, your name or your server's hostname) []:subca.pojun.tech
Email Address []:
# 这里的两步 默认也可以不用填
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:123456
An optional company name []:magedu.com
B 将证书的申请文件,传递给根 CA
将前一步生成的证书的申请文件,传递给根 CA 机构
# 最好将申请文件,传输到指定的目录下,这样便于管理
[root@centos6 tls]$scp /etc/pki/tls/subca.csr 172.18.253.127:/etc/pki/CA
C CA 颁发证书
此时切换到根 CA 主机,生成证书
# 这里的时间必须要进行指定。这时证书颁发机构指定的证书的有效期。# [root@localhost CA]#openssl ca -in /etc/pki/CA/subca.csr -out /etc/pki/CA/certs/subca.crt -days 3650
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Sep 11 14:38:13 2017 GMT
Not After : Sep 11 14:38:14 2018 GMT
Subject:
countryName = CN
stateOrProvinceName = shandong
organizationName = pojun.tech
organizationalUnitName = opt
commonName = subca.pojun.tech
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
DB:3E:9C:F4:F4:E9:42:15:00:E7:35:52:FE:04:9A:48:8C:BD:1A:1B
X509v3 Authority Key Identifier:
keyid:01:17:F1:CB:91:4B:20:AD:C7:DF:13:05:A4:D8:83:B2:AB:75:D1:05
Certificate is to be certified until Sep 11 14:38:14 2018 GMT (3650 days)Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
#此时查看 index.txt 文件中,会看到增加了一条新的记录。[root@localhost CA]#cat index.txt
V 180911143814Z 01 unknown /C=CN/ST=shandong/O=pojun.tech/OU=opt/CN=subca.pojun.tech
D 将根 CA 生成的证书颁发给请求者
# 主机 B 是作为子 CA 机构存在的,所以证书文件,必须是 cacert.pem,否则,子 CA 将不能够给其他用户颁发证书。[root@localhost CA]#scp /etc/pki/CA/certs/subca.crt 172.18.250.114:/etc/pki/CA/cacert.pem
普通用户向子 CA 机构,申请证书
这一个过程,与子 CA 向根 CA 申请证书的过程是类似的。我们将命令的记录如下
# 生成私钥文件
# 因为是普通用户,所以生成的私钥文件应该与之前的 cacert.pem 有所区别
[root@localhost ~]# (umask 066; openssl genrsa -out /etc/pki/tls/private/app.key 1024)
#利用私钥文件,生成证书申请文件
[root@localhost ~]# openssl req -new -key /etc/pki/tls/private/app.key -out /etc/pki/tls/app.csr
# 将证书申请文件发送给 子 CA 证书颁发机构
[root@localhost ~]# scp /etc/pki/tls/app.csr 172.18.250.114:/etc/pki/CA
# 切换到子 CA 证书颁发机构
# 子 CA 证书颁发机构颁发证书
[root@centos6 CA]$openssl ca -in /etc/pki/CA/app.csr -out /etc/pki/CA/certs/app.crt -days 365
#将生成的证书传递给申请者
[root@centos6 CA]$scp /etc/pki/CA/certs/app.crt 172.18.253.58:/etc/pki/CA/certs/
这样,正常的证书颁发流程就算是完成了。将我们生成的根证书,子 CA 证书以及普通用户证书导出到 Windows 系统中,并安装,然后我们就可以看到,整个证书路径了。如下图所示。
查看证书状态
查看证书状态,使用下面这条命令,可以查看证书的内容以及颁发者的多种信息。
openssl x509 -in /etc/pki/CA/cacert.pem -noout -text|issuer|subject|serial|dates
-text 证书的内容
-issuer 证书颁发者的信息
-subject 证书主体的信息
-serial 证书的序列号信息
-dates 查看证书的时间
# 证书颁发者的信息
[root@localhost ~]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -issuer
issuer= /C=CN/ST=shandong/L=qingdao/O=pojun.tech/OU=opt/CN=ca.pojun.tech
#
[root@localhost ~]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -subject
subject= /C=CN/ST=shandong/L=qingdao/O=pojun.tech/OU=opt/CN=ca.pojun.tech
# 证书的有效时间
[root@localhost ~]#openssl x509 -in /etc/pki/CA/cacert.pem -noout -dates
notBefore=Sep 11 13:43:42 2017 GMT
notAfter=Sep 6 13:43:42 2037 GMT
#也可以根据 index.txt 文件中的证书编号,进行查看状态
[root@localhost ~]#openssl ca -status 01
Using configuration from /etc/pki/tls/openssl.cnf01=Valid (V)
吊销证书
这里我们将子 CA 的证书吊销掉。
A 首先在子 CA 主机上获取到要吊销的证书的 serial
前面的例子中,我们的子 CA 证书的存放路径是
/etc/pki/CA/certs/subca.crt
[root@centos6 CA]$openssl x509 -in /etc/pki/CA/certs/subca.crt -noout -serial -subject
serial=01
subject= /C=CN/ST=shandong/O=pojun.tech/OU=opt/CN=subca.pojun.tech
B 在根 CA 上根据客户提交的 serial 与 subject 信息,对比检验是否与 index.txt 文件中的信息一致,然后吊销证书
# 进入到 CA 的路径下,查看文件目录
[root@localhost CA]#pwd
/etc/pki/CA
[root@localhost CA]#tree
.
├── cacert.pem
├── certs
│ └── subca.crt # 这是直接颁发给子 CA 的证书文件├── crl
├── index.txt
├── index.txt.attr
├── index.txt.old
├── newcerts
│ └── 01.pem #这个就是与子 CA 证书一致的 Serial 文件├── private
│ └── cakey.pem
├── serial
├── serial.old
└── subca.csr
# 吊销子 CA 的证书 使用 revoke 命令
[root@localhost CA]#openssl ca -revoke /etc/pki/CA/newcerts/01.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Revoking Certificate 01.
Data Base Updated
C 指定第一个吊销证书的编号
指定吊销证书的编号,只有在更新证书吊销列表之前,才需要操作
# 这条命令与生成证书时指定证书 serial 号码的作用是一致的。# 就是说,指定下一个证书吊销时的编号。[root@localhost ~]#echo 01 > /etc/pki/CA/crlnumber
[root@localhost ~]#cat /etc/pki/CA/crlnumber
01
D 更新证书吊销列表
前面指定了证书吊销列表编号之后,就可以来更新证书吊销列表了。
[root@localhost ~]#openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem: #这里提示输入密码
查看证书吊销列表的文件
[root@localhost ~]#openssl crl -in /etc/pki/CA/crl/crl.pem -noout -text
Certificate Revocation List (CRL): #证书吊销列表
Version 2 (0x1)
Signature Algorithm: sha256WithRSAEncryption
Issuer: /C=CN/ST=shandong/L=qingdao/O=pojun.tech/OU=opt/CN=ca.pojun.tech
Last Update: Sep 12 11:58:17 2017 GMT
Next Update: Oct 12 11:58:17 2017 GMT
CRL extensions:
X509v3 CRL Number:
1
Revoked Certificates: #这里的标识显示,证书已经被吊销了
Serial Number: 01 #吊销的序列号
Revocation Date: Sep 12 11:52:47 2017 GMT
Signature Algorithm: sha256WithRSAEncryption
b4:6e:f2:73:21:ed:c4:38:39:06:29:76:61:ac:d6:ee:a4:5d:
e8:cb:7c:8b:f8:01:21:ba:bd:b2:46:fa:ea:bf:de:fa:6e:f6:
85:d6:93:7c:81:b4:2d:d5:eb:c2:94:a3:6f:13:6d:f3:3f:48:
56:85:72:96:cf:e0:ea:a9:0e:07:43:6d:62:2d:4d:e2:2e:b5:
02:6a:27:7a:31:76:eb:4e:b1:d6:83:8b:d7:39:10:14:d6:94:
77:4b:10:d8:24:46:95:1b:48:87:16:77:ce:8c:1b:54:2c:4d:
ee:2f:24:13:10:62:30:32:74:9e:84:49:c9:dc:a9:fc:31:60:
57:b5:43:7a:a3:09:75:60:1e:6a:f2:26:e9:54:37:2d:ce:0b:
ac:b2:41:c2:d9:02:99:fc:a3:99:15:9c:10:a7:f4:be:08:83:
23:ee:ef:74:83:ea:fd:f7:c9:e1:87:6f:9b:1d:c3:df:88:2d:
79:2b:71:4b:9e:6f:ae:f9:08:d9:66:d4:f1:49:df:7e:89:99:
06:a3:86:72:37:02:78:0f:16:e8:87:8a:61:5b:a3:ac:e2:46:
38:ce:86:29:c9:c6:e5:8c:f8:25:2f:7e:d1:62:13:57:a3:a6:
10:42:13:b9:e4:0b:fa:9f:f4:d0:95:9b:5d:9b:2d:38:7f:8d:
ac:c0:e6:3f
在实际的使用过程中,有很多这样的实例。例如我们经常使用的淘宝,在使用浏览器访问淘宝的时候,就可以查看淘宝的证书吊销列表。如下图所示。
至此,关于自己搭建 CA 的过程基本上就完成了。熟悉了上面的操作之后,就可以自己动手简单的搭建一个证书了,然后也可以体验一下整个流程。
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-10/147349.htm