0%

使用 OpenSSL 生成私钥和签名并自己做 CA 签名

本篇记录如何使用openssl自签 CA 证书,以及相关概念流程

概念

首先要有一个 CA 根证书,然后用 CA 根证书来签发用户证书。
用户进行证书申请:一般先生成一个私钥,然后用私钥生成证书请求(证书请求里应含有公钥信息),再利用证书服务器的 CA 根证书来签发证书。

  1. 自签名证书(一般用于顶级证书、根证书): 证书的名称和认证机构的名称相同
  2. 根证书:根证书是 CA 认证中心给自己颁发的证书,是信任链的起始点。任何安装 CA 根证书的服务器都意味着对这个 CA 认证中心是信任的
  3. 数字证书则是由证书认证机构(CA)对证书申请者真实身份验证之后,用 CA 的根证书对申请人的一些基本信息以及申请人的公钥进行签名(相当于加盖发证书机构的公章)后形成的一个数字文件。数字证书包含证书中所标识的实体的公钥(就是说你的证书里有你的公钥),由于证书将公钥与特定的个人匹配,并且该证书的真实性由颁发机构保证(就是说可以让大家相信你的证书是真的),因此,数字证书为如何找到用户的公钥并知道它是否有效这一问题提供了解决方案

x509 证书

X.509 一般会用到三类文件,keycsrcrt

  • key私钥,openssl格式,通常是rsa算法
  • csr(Certificate Signing Request)是证书请求文件,用于申请证书,含有公钥信息。在申请的时候,必须使用自己的私钥来签署申请,还可以设定一个密钥
  • crt证书文件,是签署人用自己的 key 给你签署的凭证。可以自签署
  • pem是以上三种文件的编码方式之一,另外一种是DER。Base64 编码后的文本格式。可以单独存放证书或密钥,也可以同时存放证书和密钥
  • crl证书吊销列表,Certificate Revocation List 的缩写

openssl 使用

# get Standard commands
$ openssl -h
$ man openssl
Standard commands
asn1parse         ca                ciphers           cms
crl               crl2pkcs7         dgst              dh
dhparam           dsa               dsaparam          ec
ecparam           enc               engine            errstr
gendh             gendsa            genpkey           genrsa
nseq              ocsp              passwd            pkcs12
pkcs7             pkcs8             pkey              pkeyparam
pkeyutl           prime             rand              req
rsa               rsautl            s_client          s_server
s_time            sess_id           smime             speed
spkac             srp               ts                verify
version           x509

# get openssl x509
$ man x509

证书生成

当然,如果我们要弄 ssl,又没有钱请 CA 给我们签署的时候(他们的验证费都好贵的),可以考虑自己给自己签署。生成一份 key,生成一个 req,然后用自己的 key 签署自己的 req。当你使用这份证书做 ssl 的时候,就会产生不受信任的证书警报。你可以在客户那里安装这张证书为根证书,就不会弹出这个警告了。当然,考究的人,签署用证书和服务器身份认证证书要分开。先做一个自签署证书作为根证书,然后用这个根证书签署一个服务器证书。这样在客户那里安装根证书后,服务器证书就会自动信任。这样的好处是,一本证书只能颁发给一个特定域名。如果你有多个域名,就要反复在客户这里安装证书。然而如果采用根证书签名,那么只要安装一张根证书,其他都是自动的。不过如果事情只要干一次,就不用讲究这么多了。

可以得到两种处理方式

  1. 不需要根证书,直接生成用户证书
  2. 首先需要自签署根证书,然后再签发服务器身份认证证书

CA 根证书的生成

生成 CA 私钥key–>生成 CA 证书请求csr–>自签名得到根证书crt(CA 给自已颁发的证书)

# Generate CA private key
openssl genrsa -out ca.key 2048
# Generate CSR
openssl req -new -key ca.key -out ca.csr
# Generate Self Signed certificate
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

或者

# Generate CA private key
openssl genrsa -out ca.key 2048
# Generate Self Signed certificate
openssl req -new -x509 -key ca.key -out ca.crt -days 365
  • genrsa - generate an RSA private key
  • req - PKCS#10 certificate request and certificate generating utility
  • x509 - Certificate display and signing utility
  • -days 证书有效期
  • -x509req中直接生成crt代替csr

这是生成的ca.crt可以直接作为用户证书使用,也可以作为根证书,接下来继续使用ca.crt来签署服务器证书

用户证书

根证书只需要生成一次,而每个用户都需要使用根证书签署自己的证书

  1. 生成私钥
    openssl genrsa -out mydomain.com.key 2048
  2. 检查私钥
    openssl rsa -in mydomain.com.key -noout -text
  3. 生成CSR,注意Common Name指向服务器地址或域名,有互动、命令行和配置文件三种方式来生成
    1. 互动方式,openssl要求填入一下信息用于生成CSR
      openssl req -new -key mydomain.com.key -out mydomain.com.csr
    2. 命令行,直接填入信息生成CSR
      openssl req -new -sha256 -key mydomain.com.key -subj "/C=US/ST=CA/O=MyOrg, Inc./CN=mydomain.com" -out mydomain.com.csr
    3. 配置文件
      openssl req -new -out mydomain.com.csr -config oats.conf
  4. 检验CSR,可选项
    openssl req -in mydomain.com.csr -noout -text
  5. 由根证书签发用户证书
    openssl x509 -req -in mydomain.com.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out mydomain.com.crt -days 500 -sha256
  6. 检验用户证书,可选项
    openssl x509 -in mydomain.com.crt -text -noout

流程

serverSSL/TLS握手的过程中会下发自己的证书,而这个证书是经过 CA 签名的。CA 签名的时候使用的是 CA 自己的私钥,而ca.crt则包含了 CA 的公钥,可以用于检验这一签名,以确认是否是自己签的名。

  1. 服务端需要使用的文件是:server 私钥 (key), server 证书。
  2. 客户端需要使用的文件是:CA file(ca 的证书,用以验证 server 下发的证书)

生成证书脚本:openssl_2way_auth.sh
源码:Two-way SSL authentication example in C

Ref

  1. self-signed-certificate-with-custom-ca.md
  2. How to setup your own CA with OpenSSL
  3. openssl 生成 SSL 证书的流程
  4. 用 openssl 生成 SSL 使用的私钥和证书,并自己做 CA 签名
  5. openssl 基本原理 + 生成证书 + 使用实例
  6. 使用 openssl 生成证书
  7. SSL 编程
  8. 说说 x509 证书链
  9. SSL 中,公钥、私钥、证书的后缀名都是些啥?