使用cfssl生成自签证书

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来给服务器签署证书,运行如下命令来生成服务端证书:
    cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=json/ca-config.json -profile=server json/server.json | cfssljson -bare server
    • -profile指定了使用ca-config.json中的profile
    • 最后的server给定了生成的文件名,将得到如下三个文件:server.csr、server-key.pem和server.pem
  • 类似的,可以生成客户端证书,配置文件的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和相关证书,以后有时间会仔细研究下SSL

你可能感兴趣的:(使用cfssl生成自签证书)