CFSSL 生成证书

585 阅读3分钟

tls即安全传输层协议,一般用于在两个通信应用程序之间提供保密性和数据完整性,由于在工作项目中系统内部需要安全认证,google一下发现了一个好用的自签证书的开源工具cfssl。cfssl是由CoreOS提供的(用GO实现,直接使用go get就可以安装),简单安全。

cfssl用来为etcd提供tls证书,因此它支持签三种类型的证书:client证书、server证书以及peer证书(即etcd集群成员之间的tls认证)。cfssl采用使用配置文件生成证书,因此自签之前,需要生成它识别的json格式的配置文件,cfssl提供了方便的命令行生成配置文件

为了便于管理,我将配置文件都放在了单独的目录,certs用来防置证书,json文件夹用来存放配置文件:

mkdir certs && cd certs
mkdir json

一、自签CA

  • 如下为自签CA生成相应的配置文件和请求文件

    • cfssl print-defaults config > json/ca-config.json
    • cfssl print-defaults csr > json/ca-csr.json
  • 根据自己的需要自定义ca-config.json,修改为如下配置:

  • profiles:指定了不同角色的配置信息
    服务端使用server auth(TLS Web Server Authentication X509 V3 extension),客户端使用client auth(TLS Web Server Authentication X509 V3 extension)

  • expiry:指定了证书的过期时间为8760小时(即1年)

{
    "signing": {
        "default": {
            "expiry": "8760h"
        },
        "profiles": {
            "server": {
                "expiry": "8760h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth"
                ]
            },
            "client": {
                "expiry": "8760h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            },
            "peer": {
                "expiry": "8760h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}

自定义ca-csr.json:

  • CN即common name,hosts可以指定多个(泛)域名以及多个IP地址
  • key:指定了加密算法,一般使用rsa(size:2048)
{
    "CN": "example.net",
    "hosts": [
        "example.net",
        "www.example.net"
    ],
    "key": {
        "algo": "ecdsa",
        "size": 256
    },
    "names": [
        {
            "C": "US",
            "L": "CA",
            "ST": "San Francisco"
        }
    ]
}
  • 接下来,就可以根据ca-csr.json来自签CA了,通过gencert -initca来生成私钥和公钥,然后使用cfssljson命令将它们分别保存:

    • cfssl gencert -initca json/ca-csr.json | cfssljson -bare self-ca -
  • 会得到如下三个文件:私钥self-ca-key.pem、证书请求self-ca.csr、公钥self-ca.pem

二、生成服务器和客户端证书

同样,首先生成默认配置文件:cfssl print-defaults csr > json/server.json

  • 主要修改如下部分:
"CN": "test.coreos.com",
"hosts": [
	"server.coreos.org",
	"*.coreos.org"
],
  • cfssl支持SAN(Subject Alternative Name),它是X.509中定义的一个扩展,使用了SAN字段的SSL证书,可以扩展此证书支持的域名,即一个证书可以支持多个不同域名的解析。

    • 然后使用刚才生成的CA来给服务器签署证书,运行如下命令来生成服务端证书:

      • -profile指定了使用ca-config.json中的profile
      • 最后的server给定了生成的文件名,将得到如下三个文件:server.csr、server-key.pem和server.pem
  • cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=json/ca-config.json -profile=server json/server.json | cfssljson -bare server

  • 类似的,可以生成客户端证书,配置文件的hosts字段指定为空即可

    • cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=json/ca-config.json -profile=client json/client.json | cfssljson -bare client

CFSSL 工具还是很强大的,在这里只是简单介绍一下如何自签CA和相关证书。