而我们在使用一些自己的服务时,可以自己成为一个CA来签发证书用于各种内部的加密、认证环节。请注意,自己签发的证书由于CA并不是被广泛认可,不会默认内置于各个操作系统与软件,所以无法用于正规的商用;要求别人也加入根证书的行为,无异于和某些网站类似

如果不愿意掏钱,StartSSL就可以提供免费证书,直接在网站上申请即可。目前笔者的主站(https://momoka.net)与维基(https://wiki.momoka.net)使用的为StartSSL.com的免费证书,根证书为StartSSL的CA签发。

介绍

OpenSSL是自由开源的加密软件库,通过命令行工具可以提供数字证书的签发与验证,证书权威机构(Certificate Authority,CA)会给证书签名,一些知名的CA会将其根证书预置于各大主流操作系统、设备与软件中;认证证书的验证工作,便是通过证书链来工作的,如果一家CA本身胡乱签发,将会导致数字证书的信任危机

本文将会介绍

  • 模拟CA机构,生成私钥与根证书
  • 生成SSL证书
  • 利用CA的根证书,给SSL证书添加签名

以便有助于理解签名已经进行提交申请与证书认证的流程。

准备工作

作为CA机构,我们需要先创建一对私钥与根证书

注意:如果这个证书是需要使用的,请注意尽量保持在安全的环境下生成,例如root用户,权限保证其他用户无法读取,或者使用一台非多用户的主机;可能的话甚至考虑在不联网(无论是有线还是无线)的主机上操作,并保证传输机制的安全。

创建目录

我们以/root/pki/CA为例

$ mkdir -p /root/pki/CA

创建其他目录与两个文件用来跟踪签名后的证书,index.txtserial

$ cd /root/pki/CA
$ mkdir certs crl newcerts private csr
$ chmod 700 private
$ touch index.txt
$ echo 1000 > serial

创建一个OpenSSL的配置文件,内容如: http://lpaste.net/145708

并在使用命令行时,指定配置文件

$ openssl  -config /root/pki/CA/openssl.cnf ...

创建私钥

$ cd /root/pki/CA
$ openssl genrsa -aes256 -out private/ca.key.pem 4096
$ chmod 400 private/ca.key.pem

4096为证书的RSA算法密钥长度。

注意:太长的密钥(例如8192),在某些操作系统与软件中尚未支持。

创建根证书

使用前一步创建的私钥,创建一个私钥ca.key.pem

$ cd /root/pki/CA
$ openssl req -config openssl.cnf \
    -key private/ca.key.pem \
    -new -x509 -days 365 -sha256 -extension v3_ca \
    -out certs/ca.cert.pem

注意:这里的-days参数指的是有效期。

验证根证书

$ openssl x509 -noout -text -in cert/ca.cert.pem

输出将会看到

  • Signature Algorithm,签名算法
  • Validity,签发时间
  • Public-Key,公钥长度
  • Issuer,颁发者
  • Subject,颁发对象

请注意,所有根证书都是自签的,所以颁发者与颁发对象总是一样的。

至此,作为CA机构的根证书与私钥都已准备完毕,下面我们会介绍如何给其他SSL证书签名(也就是认证的步骤)

给服务端与客户端证书签名

一般而言,根证书来自被各大系统、软件行业认可的CA机构才会被大家认可。故证书的使用者更多的是在这个环节出现。

首先,作为一个证书所有者,也需要生成证书。

$ cd /root/pki/CA
$ openssl genrsa -aes256 \
    -out private/www.example.com.key.pem 2048
$ chmod 400 private/www.example.com.key.pem    

注意:在这里使用2048是因为私钥长度直接影响了SSL认证连接的握手过程复杂程度,越长需要消耗更多的计算资源;而大多数网站的证书有效期为1年,所以2048长度相对来说也以足够;不过请记住4096会比2048更安全。

创建证书

实际上在这部我们创建的是一个证书签名请求文件(Certificate Signing Request,CSR),也就是我们常见的将这个文件提交给CA机构签名,返还后的才是真正经过认证的证书。

注意:请特别留意,这里Common Name字段的内容,需与所使用的服务器地址一致,这样我们的浏览器与邮件客户端等等软件才能正确工作;organizationName必须与CA根证书里相同。

$ /root/pki/CA
$ openssl req -config openssl.cnf \
    -key private/www.example.com.key.pem \
    -new -sha256 -out csr/www.example.com/csr.pem

接下来使用CA根证书对这个请求文件进行签名认证(即各大CA证书机构的工作);如果是给服务器使用的证书,请使用server_cert扩展,如果用于用户身份验证,请使用usr_cert扩展。

$ cd /root/pki/CA
$ openssl ca -config openssl.cnf \
    -extensions server_cert -days 365 -notext -md sha256 \
    -in csr/www.example.com.csr.pem \
    -out certs/www.example.com.cert.pem
$ chmod 444 certs/www.example.com.cert.pem

检验证书

$ openssl x509 -noout -text \
    -in certs/www.example.com.cert.pem

颁发者应为生成根证书时填写的内容,而颁发对象应该为生成申请文件时的内容。

部署证书

我们这里使用的是CA机构直签的证书,直接将private/www.example.com.key.pemcerts/www.example.com.cert.pem通过安全手段放到需要的服务器上即可使用。

中间CA

实际上我们接触的更多是中间CA(Intermediate certificate authorities),而根CA机构是将他们的根证书先签名验证,然后允许中间CA签发SSL证书。这种情景下我们需要将中间CA的根证书串联起来使用,即证书链。

参考资料

__END__