CA(Certificate Authority)是数字证书认证中心的简称,是指发放、管理、废除数字证书的机构。CA的作用是检查证书持有者身份的合法性,并签发证书(在证书上签字),以防证书被伪造或篡改,以及对证书和密钥进行管理。使用OpenSSL可以创建CA,签证和吊销证书
#################################################################### [ CA_default ] dir = /etc/pki/CA # Where everything is kept <==默认工作目录,变量形式 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的自签证书 serial = $dir/serial # The current serial number <==当前证书序列号,第一次要指定 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 <==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 # Subject Name options 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 <==证书的默认有效期 default_crl_days= 30 # how long before next CRL <==默认声明有效期 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 # For the CA policy <==CA策略相关属性 [ policy_match ] countryName = match <==country name(国家名)必须匹配CA证书 stateOrProvinceName = match <==stateOrProvinceName(州或省名)必须匹配CA证书 organizationName = match <==organizationName(组织机构名称,例如公司名)必须匹配CA证书 organizationalUnitName = optional <==organizationalUnitName(组织单位,例如公司部门)可选 commonName = supplied <==commonName(通用名字,例如域名)必须提供 emailAddress = optional <==emailAddress(邮件地址)可选 # For the 'anything' policy # At this point in time, you must list all acceptable 'object' # types. [ policy_anything ] countryName = optional stateOrProvinceName = optional localityName = optional <==localityName(地区名,例如城市) 可选 organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional ####################################################################
[root@server ~]# mkdir -pv /etc/pki/CA/{certs,crl,newcerts,private} [root@server ~]# touch /etc/pki/CA/{serial,index.txt} [root@server ~]# echo 01 > /etc/pki/CA/serial <==将序列号写入此文件
根据openssl.cnf文件中定义的按需创建
[root@server ~]# (umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096) Generating RSA private key, 4096 bit long modulus .....................................++ ...........................................++ e is 65537 (0x10001)
[root@server ~]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -days 3650 -out /etc/pki/CA/cacert.pem
其中选项含义如下:
-new: 生成新证书签署请求;
-x509: 生成请生成自签格式,专用于CA生成自签证书
-key: 证书求时用到的私钥文件
-days :证书的有效期限,单位是天
-out /PATH/TO/SOMECERTFILE: 证书的保存路径
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 <==两个字符表示的国家代码,CN为中国 State or Province Name (full name) []:GuangDong <==省或洲的完整名称 Locality Name (eg, city) [Default City]:ShenZhen <==所在位置的名称(默认为城市) Organization Name (eg, company) [Default Company Ltd]:example <==组织机构名称(默认为公司) Organizational Unit Name (eg, section) []:Ops <==组织机构单元名称(eg.部门) Common Name (eg, your name or your server's hostname) []:ca.example.com <==CA持有者名或者所在服务器主机名(即域名) Email Address []:caadmin@example.com <==CA管理员邮件地址,可以省略
在需要使用证书的主机上生成证书请求,以 httpd 服务(yum安装)为例,其中CA签署机构放置于172.16.8.10主机上,httpd服务器放置于172.16.8.11主机上
[root@localhost ~]# (umask 077;openssl genrsa -out /etc/httpd/ssl/httpd.key 4096) Generating RSA private key, 4096 bit long modulus .........................................................++ .................++ e is 65537 (0x10001)
[root@localhost ~]# openssl req -new -key /etc/httpd/ssl/httpd.key -days 365 -out /etc/httpd/ssl/httpd.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) []:GuangDong Locality Name (eg, city) [Default City]:ShenZhen Organization Name (eg, company) [Default Company Ltd]:example Organizational Unit Name (eg, section) []:Ops Common Name (eg, your name or your server's hostname) []:www.example.com <==httpd所在服务器主机名(即域名) Email Address []:admin@example.com <==httpd管理员邮件地址,可以省略 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
[root@localhost ~]# scp /etc/httpd/ssl/httpd.csr root@172.16.8.10:/tmp/
[root@server ~]# openssl ca -in /tmp/httpd.csr -days 365 -out /etc/pki/CA/certs/httpd.crt Using configuration from /etc/pki/tls/openssl.cnf Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Nov 18 15:06:39 2017 GMT Not After : Nov 18 15:06:39 2018 GMT Subject: countryName = CN stateOrProvinceName = GuangDong organizationName = example organizationalUnitName = Ops commonName = www.example.com emailAddress = admin@example.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 0C:C9:67:94:91:F3:17:6C:67:50:35:96:DB:B6:08:3B:11:01:06:98 X509v3 Authority Key Identifier: keyid:AB:A2:16:C4:E9:A9:A4:BB:33:59:7E:29:25:14:B8:1D:AF:4F:76:D9 Certificate is to be certified until Nov 18 15:06:39 2018 GMT (365 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
在生成证书/etc/pki/CA/crets/*.crt后,会生成以对应证书命名的文件/etc/pki/CA/newcrets/SERIAL.pem(此处为httpd.crt和01.pem)
[root@server ~]# scp /etc/pki/CA/certs/httpd.crt root@172.16.8.11:/etc/httpd/ssl
查看所签署的证书主机信息
[root@localhost ~]# openssl x509 -in /etc/pki/CA/certs/httpd.crt -noout -subject <==CA主机和httpd主机均可查看 subject= /C=CN/ST=GuangDong/O=example/OU=Ops/CN=www.example.com/emailAddress=admin@example.com
或者
[root@server ~]# cat /etc/pki/CA/index.txt <==仅CA主机能查看 V 181118150639Z 01 unknown /C=CN/ST=GuangDong/O=example/OU=Ops/CN=www.example.com/emailAddress=admin@example.com
其中V表示已经签署的证书,01表示证书序列号
[root@server ~]# rm -rf /tmp/httpd.csr <==CA主机 [root@localhost ~]# rm -rf /etc/httpd/ssl/httpd.csr <==httpd主机
[root@localhost ~]# openssl x509 -in /etc/httpd/ssl/httpd.crt -noout -serial -subject serial=01 subject= /C=CN/ST=GuangDong/O=example/OU=Ops/CN=www.example.com/emailAddress=admin@example.com
根据客户端提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致
[root@server ~]# cat /etc/pki/CA/index.txt V 181118150639Z 01 unknown /C=CN/ST=GuangDong/O=example/OU=Ops/CN=www.example.com/emailAddress=admin@example.com
一致的话则可以进行证书吊销
吊销证书:
[root@server ~]# openssl ca -revoke /etc/pki/CA/newcerts/01.pem Using configuration from /etc/pki/tls/openssl.cnf Revoking Certificate 01. Data Base Updated
吊销之后再查看index.txt文件
[root@server ~]# cat /etc/pki/CA/index.txt R 181118150639Z 171118155958Z 01 unknown /C=CN/ST=GuangDong/O=example/OU=Ops/CN=www.example.com/emailAddress=admin@example.com
其中R表示证书已失效
[root@server ~]# echo 01 > /etc/pki/CA/crlnumber
[root@server ~]# openssl ca -gencrl -out /etc/pki/CA/crl/ca.crl Using configuration from /etc/pki/tls/openssl.cnf
查看crl文件
[root@server ~]# openssl crl -in /etc/pki/CA/crl/ca.crl -noout -text
“The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time.” – Tom Cargill
标 题:OpenSSL创建私有CA,签证和吊销证书