自签名证书 – CA根证书

作者: harde 分类: 计算机 发布时间: 2013-11-19 13:16

最近在捣腾自签名证书,就把自己的相关经验给大家分享一下。
预计使用4篇文章来完成真个过程,包括本文的自签名CA根证书、二级证书、以及给邮件、域名、代码签名以及证书的各种格式。

首先进入本文主要内容,CA根证书的制作。
概念什么的我想就不需要普及了。直接进入正文。

首先说下相关名词:
CA Certificate Authority 数字证书认证机构
CRL Certificate Revocation List 吊销证书列表
bundle 证书链
DN Distinct Name

首先跟我一起来制作一个实验版本的CA根证书。
我是在Linux(CentOS)系统下使用openssl(OpenSSL 1.0.0-fips 29 Mar 2010)完整整个工作的。
通常*nix系统都自带了。

首先找个位置作为工作目录
我建立了/home/data/cert/目录作为工作目录。下文中如果没有特别说明,都是在这个目录下做的操作。

首先建立工作目录

# mkdir -p /home/data/cert/

建立相关目录

# cd /home/data/cert/
# mkdir -p ca/test-ca/private ca/test-ca/db crl certs conf

这样会产生如下的文件夹结构
ca
–test-ca
—-private
—-db
crl
certs
conf
在下文中我会慢慢介绍各个文件夹的作用。

更改文件夹权限

# chmod 700 ca/test-ca/private

让ca/test-ca/private文件夹,只有当前用户可以读写。

创建所需的证书数据库与序列号文件

# cp /dev/null ca/test-ca/db/test-ca.db
# cp /dev/null ca/test-ca/db/test-ca.db.attr
# echo 01 > ca/test-ca/db/test-ca.crt.srl
# echo 01 > ca/test-ca/db/test-ca.crl.srl

下面,准备一下CA根证书的配置文件。

# vim conf/test-ca.conf
# Harde Test Root CA

# [default]节点包括了整个配置文件可以使用的全局常量以及和配置有关的设置。
[ default ]
ca                      = test-ca               # 证书的文件名
dir                     = .                     # 证书根路径

# [ req ]节点用来做证书申请
# 这里定义了CA根证书的一些东西
[ req ]
default_bits            = 2048                  # RSA 密钥大小
encrypt_key             = yes                   # 加密密钥
default_md              = sha1                  # Message Digest签名用的哈希算法
utf8                    = yes                   # 输入为UTF-8
string_mask             = utf8only              # 强制字符的输入采用UTF-8的编码格式
prompt                  = no                    # Don't prompt for DN
distinguished_name      = ca_dn                 # DN节点名
req_extensions          = ca_reqext             # Desired extensions

[ ca_dn ]
0.domainComponent       = "org"                 # 根域名
1.domainComponent       = "harde"               # 域名
organizationName        = "Harde.org Inc"       # 组织
organizationalUnitName  = "Test CA"             # 组织单元(可选)
commonName              = "Harde Root CA"       # 通用名

[ ca_reqext ]
keyUsage                = critical,keyCertSign,cRLSign
basicConstraints        = critical,CA:true
subjectKeyIdentifier    = hash

# 下面的部分是openssl的相关配置
# CA节点定义了CA有关信息,以及申请策略

[ ca ]
default_ca              = root_ca               # CA节点的名字

[ root_ca ]
certificate             = $dir/ca/$ca.crt             # CA根证书
private_key             = $dir/ca/$ca/private/$ca.key # CA根证书私钥
new_certs_dir           = $dir/ca/$ca                 # 证书存档
serial                  = $dir/ca/$ca/db/$ca.crt.srl  # 证书序列号文件
crlnumber               = $dir/ca/$ca/db/$ca.crl.srl  # 吊销证书序列号文件
database                = $dir/ca/$ca/db/$ca.db       # 索引数据库
unique_subject          = no                    # Require unique subject
default_days            = 10958                 # 有效期限 单位:天
default_md              = sha1                  # MD to use
policy                  = match_pol             # Default naming policy
email_in_dn             = no                    # Add email to cert DN
preserve                = no                    # Keep passed DN ordering
name_opt                = ca_default            # Subject DN display options
cert_opt                = ca_default            # Certificate display options
copy_extensions         = none                  # Copy extensions from CSR
x509_extensions         = signing_ca_ext        # Default cert extensions
default_crl_days        = 365                   # How long before next CRL
crl_extensions          = crl_ext               # CRL extensions

# Naming policies control which parts of a DN end up in the certificate and
# under what circumstances certification should be denied.

[ match_pol ]
domainComponent         = match                 # Must match 'simple.org'
organizationName        = match                 # Must match 'Simple Inc'
organizationalUnitName  = optional              # Included if present
commonName              = supplied              # Must be present

[ any_pol ]
domainComponent         = optional
countryName             = optional
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = optional
emailAddress            = optional

# 证书扩展,定义可以创建什么类型的证书

[ root_ca_ext ]
keyUsage                = critical,keyCertSign,cRLSign
basicConstraints        = critical,CA:true
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always

[ signing_ca_ext ]
keyUsage                = critical,keyCertSign,cRLSign
basicConstraints        = critical,CA:true,pathlen:0
subjectKeyIdentifier    = hash
authorityKeyIdentifier  = keyid:always

[ crl_ext ]
authorityKeyIdentifier  = keyid:always

(事实上我也并不了解每一项具体能影响到的问题。
所以,我也并不能为您解答每一项的作用。)

好了,配置文件有了,我们就可以开始制作请求文件了。

# openssl req -new \
    -config conf/test-ca.conf \
    -out ca/test-ca.csr \
    -keyout ca/test-ca/private/test-ca.key

这里会提示输入一个密码,这个密码就是你CA私钥的密码,正式使用时,记得设置得复杂一点。

这里我们会就简单点,设置为testcakey

这时我们会得到两个文件
一个是
ca/private/test-ca.key 这个就是我们的私钥
ca/test-ca.csr 这个就是请求文件。

私钥是属于你自己的,保管好就行。
而csr是请求文件,是发给“权威机构”进行签名的。
当然,我们是自签名,所以继续~

继续执行

# openssl ca -selfsign \
    -config conf/test-ca.conf \
    -in ca/test-ca.csr \
    -out ca/test-ca.crt \
    -extensions root_ca_ext

(可以注意到,我们使用了selfsign参数。
如果没有这个参数,则证书必须由不同的KEY所签署。
换而言之,有了这个参数,就可以使用证书自己的私钥签署。
所谓自签就是这个意思。)

这里会提示输入KEY的密码,填入刚才我们设置的testcakey

然后会提示:(有效期限是到2043年的,签发这个证书么?)
Certificate is to be certified until Nov 13 07:21:38 2043 GMT (10958 days)
Sign the certificate? [y/n]:
输入y确认。

Sign the certificate? [y/n]:(再次确认是否要签发证书)
输入y确认。

1 out of 1 certificate requests certified, commit? [y/n](已经提交了1 / 1个证书,提交么?)
输入y确认。

看到

Write out database with 1 new entries
Data Base Updated

就说明OK了。

test-ca.crt 就是你的CA根证书了。

事实上,不使用配置文件,也是可以的。

过程类似,首先生成一个私钥

# openssl genrsa -des3 -out ca.key 1024 

然后用这个私钥生成一个证书

# openssl req -new -x509 -days 7300 -key ca.key -out ca.crt

之后会让你输入CA相关信息。
其实过程一点都没少,只不过少了配置文件。
但是这样一来,可维护性就要差很多,所以,并不推荐使用。

反复这个过程,熟练以后,从头再做一遍,修改好自己的信息。
就是一个正式的自签名CA根证书的签发过程了。
至于怎么使用这个CA根证书签发证书,我将在下一篇文章介绍。
请看继续关注我的博客。

如果你把此文的内容用在了你的生产环境。
注意:请妥善保管好你的KEY。
建议是物理隔离KEY。以及KEY与KEY的密码分开存放。

本系列文章参考 http://pki-tutorial.readthedocs.org/en/latest/simple/index.html
完成。有兴趣的可以看下英文原文。
文本引用了维基百科有关身份认证机构词条:http://zh.wikipedia.org/wiki/%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E6%9C%BA%E6%9E%84
更多有关数字证书的资料可以阅读系列内容:
维基百科《X.509》 http://en.wikipedia.org/wiki/X.509
这个词条我觉得挺奇葩的,看了下一些情况,我猜测:
首先维基百科英文版本的,被人简化并翻译到了某度百科。
然后有聪明人把简化翻译版的某度百科的又提交到了中文维基,而且竟然还没有什么修改……然后中文维基又以版权原因删除了这个简化翻译版……


第二章 : CA根证书的制作与签发 – 中间证书
https://harde.org/blog/2013/11/self-signed-certificate-ca-signing-html.html

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

2条评论
  • null

    2015-01-21 上午 11:19

    “创建所需的证书数据库与序列号文件” 代码里最后两句一样, 是错误吗?

    1. harde

      2015-01-21 上午 11:21

      你看错了,一个是crt一个是crl。

发表回复

您的电子邮箱地址不会被公开。