Ubuntu利用cfssl搭建私有CA

1. 绪言

① 惯例唠叨
  • 目前,区块链项目已经想要开始进行分布式部署了。在进行分布式部署之前,需要添加https,用于替代之前的http以保证通信安全。
  • 之前找工作时,也专门了解过https,都是理论知识上的了解,并未实践。
  • 现在,要开始要自己去实现https了,就慌了,各种迷茫:
  1. 之前的http我都不知道清华大佬咋个实现的,拿到东西都已近有有框架了,我都是改改bug,添点肉
  2. 这个https我真的需要去买证书吗?
  3. go语言做https的例子多不多啊,跟我们的项目有相同的例子吗?
  4. … 反正就是各种不自信,迷茫啊
  • 后来,清华大佬跟我说了一下,貌似好像挺简单的。
  1. 按照他的说法,这是一个独立的系统,为了方便测试,我应该有一个私有CA。
  2. 自己最开始单纯的以为只是需要使用https,查到go中就有自带对tls的支持:Golang创建最简单的HTTP和HTTPS服务
  3. 各路大神提及的比较普遍的实现HTTPS的方法,是通过openssl去实现的:https证书互信解决方案—创建私有CA并申请证书,自己看了看貌似也不是很简单啊
② 名词解析
  • 真正实施起来,自己又傻了,各种专有名词,头晕眼花。
  • key:证书的私钥,用go语言中自带tls生成的是.pem格式
  • cert:证书,用go语言中自带tls生成的是也是.pem格式
    Ubuntu利用cfssl搭建私有CA_第1张图片
  • csr:
  1. Certificate Signing Request的英文缩写,即证书签名请求文件。
  2. 该文件有是证书申请者在申请数字证书时,CSP(加密服务提供者)在生成私钥的同时也生成CSR文件。
  3. 证书申请者只要把CSR文件提交给证书颁发机构(CA)后,CA使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书(cert)。
  4. 注意: csr有自己的格式,但是为了简化用户操作,一般只需要按照规定填写某些关键信息即可。也有一些专门帮助我们去生成csr文件的网页,生成csr文件的同时一定会生成自己的私钥,私钥应该好好保存。参考:什么是CSR,CSR文件的作用和生成
  • csr中一些关键词的解释:
  1. CN: 域名,如果是CA,这是CA生成证书的域名。
  2. C: 国家,一般都是填写国际通用的国家缩写,比如中国为CN、美国为US等。
  3. L: 城市,使用cert的组织所在城市
  4. O: 组织或公司名称,就是使用cert的组织名称
  5. OU: 具体使用cert的部门或单位,就是组织的下级名称。
  6. ST: 省份,使用cert的组织所在省份
  • 自己填写的cert的示例:
    Ubuntu利用cfssl搭建私有CA_第2张图片

2. 安装cfssl

  • 清华大佬说,openssl比较麻烦,他们以前使用的cfssl,感觉操作很简单。
  • 给我一个参考链接:如何构建私有公钥基础设施
  • 自己看了看,感觉文章写的很不错,很仔细啊。but,实操过程中发现,坑啊,咋个老是出问题呢
  • 为此,清华大佬也很疑惑,还专门加班自己跑了一遍。都晚上12点了,还在给我说他发现问题原因了,真心感谢!
  • 专门写此博客,以记录自己通过cfssl正确的搭建私有CA的过程,服务自己,也方便大家。
① 下载cfssl的源码
  • 根据cfssl的官网资料要求,需要配置go环境,而且要求go版本1.12+
  • go环境的配置,可以参考我之前的博客:ubuntu18.04安装Go语言
  • 原本按照cfssl的官网资料,安装cfssl是超级简单,只需要下面的命令就可以完成。
$ go get -u github.com/cloudflare/cfssl/cmd/cfssl
  • 可惜啊,貌似连接被kill了,所以只能只能自己老老实实的git clone代码了。
$ git clone https://github.com/cloudflare/cfssl.git
  • 然后将代码放置到$GOPATH/src/github.com/cloudflare/下,我的完整路径如下:
    Ubuntu利用cfssl搭建私有CA_第3张图片
② 安装cfssl
  • 进入对应目录,执行命令完成cfssl的安装。这是我自己的完整目录,注意更改成自己的home目录。
$ cd /home/zebra/GOPATH/src/github.com/cloudflare/cfssl/cmd 
$ go install /home/zebra/GOPATH/src/github.com/cloudflare/cfssl/cmd/cfssl
  • 可以发现,在$GOPATH的bin目录下,已经存在cfssl这个命令了。
    Ubuntu利用cfssl搭建私有CA_第4张图片
  • 同时,还可以安装cfssljson,后面会使用到:
$ go install /home/zebra/GOPATH/src/github.com/cloudflare/cfssl/cmd/cfssljson
③ 验证安装是否成功
  • 在终端中输入以下命令,可以查看cfssl的版本。同时,也可以验证cfssl安装是否成功。
$ cfssl version

在这里插入图片描述

  • 查看cfsslde所有命令,部分命令截图如下:
$ cfssl

Ubuntu利用cfssl搭建私有CA_第5张图片

3. 搭建自己的私有CA

① 生成 CA 证书和私钥
  • 之前我们提到,原本的csr文件是比较复杂的,为了减轻我们的负担,一般的工具会提供一些接口,我们只需要填写必要信息。
  • 通过填写的这些必要信息,我们可以获得私钥和csr文件。
  • 不同的是,cfssl直接通过我们填写的csr配置信息,帮我们生成了私钥、csr文件和CA证书。
  • 配置csr的json文件,名称为csr_ca.json,内容如下:
{
  "CN": "MadledgerCA",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
    "names": [
       {
         "C": "CN",
         "L": "Chengdu",
         "O": "Madledger",
         "OU": "CA Services",
         "ST": "Sichuan"
       }
    ]
}
  • 通过如下命令生成对应的私钥ca-key.pem、csr文件ca.csr和CA证书ca.pem
$ cfssl gencert -initca csr_ca.json | cfssljson -bare ca
  • 其中,CA证书的内容查看如下:
    Ubuntu利用cfssl搭建私有CA_第6张图片
② 配置证书生成策略,并启动 CA 服务
  • 配置证书生成策略,让 CA 软件知道颁发什么样的证书。
  • 配置文件叫config_ca.json,内容如下:
{
  "signing": {
    "default": {
      "expiry": "8760h",
      "usages": [
         "signing",
         "key encipherment",
         "server auth"
       ]
     }
  },
  "auth_keys": {
    "key1": {
      "key": "1f27569ae7ec9e3178e965f7dc9ccedc",
      "type": "standard"
    }
  }
}
  • 该策略指定了证书有效期(1 年)、用途(服务器验证等)以及一个随机生成的私有验证密钥,该密钥可以防止未经授权的机构请求证书。
  • 注意:
  1. 原参考文章的default中有"auth_key": "key1"这个内容,我之前之所不成功就是因为这个原因。感谢清华大佬帮我找出了原因。
  2. 这里的key是一个通过的16 byte16进制字符串,自己可以在如下网站去生成:Random Byte Generator。这个key相当于是一个暗号,后面通过私有CA申请其他的cert时,都需要使用这个key。
  • 执行下面的命令,启动 CA 服务:
$ cfssl serve -ca-key ca-key.pem -ca ca.pem -config config_ca.json
  • 可以发现执行的输出信息如下,虽然有一些warning,但是最终貌似并没有影响使用。而且,可以看出CA服务的url为127.0.0.1:8888
2019/11/15 18:08:13 [INFO] Initializing signer
2019/11/15 18:08:13 [WARNING] couldn't initialize ocsp signer: open : no such file or directory
2019/11/15 18:08:13 [INFO] endpoint '/api/v1/cfssl/scan' is enabled
2019/11/15 18:08:13 [WARNING] endpoint 'revoke' is disabled: cert db not configured (missing -db-config)
2019/11/15 18:08:13 [INFO] endpoint '/api/v1/cfssl/health' is enabled
2019/11/15 18:08:13 [INFO] endpoint '/api/v1/cfssl/info' is enabled
2019/11/15 18:08:13 [INFO] endpoint '/api/v1/cfssl/gencrl' is enabled
2019/11/15 18:08:13 [INFO] setting up key / CSR generator
2019/11/15 18:08:13 [INFO] endpoint '/api/v1/cfssl/newkey' is enabled
2019/11/15 18:08:13 [INFO] bundler API ready
2019/11/15 18:08:13 [INFO] endpoint '/api/v1/cfssl/bundle' is enabled
2019/11/15 18:08:13 [INFO] endpoint '/api/v1/cfssl/scaninfo' is enabled
2019/11/15 18:08:13 [WARNING] endpoint 'ocspsign' is disabled: signer not initialized
2019/11/15 18:08:13 [INFO] endpoint '/' is enabled
2019/11/15 18:08:13 [INFO] endpoint '/api/v1/cfssl/sign' is enabled
2019/11/15 18:08:13 [WARNING] endpoint 'authsign' is disabled: {"code":5200,"message":"Invalid or unknown policy"}
2019/11/15 18:08:13 [WARNING] endpoint 'crl' is disabled: cert db not configured (missing -db-config)
2019/11/15 18:08:13 [INFO] endpoint '/api/v1/cfssl/newcert' is enabled
2019/11/15 18:08:13 [INFO] endpoint '/api/v1/cfssl/init_ca' is enabled
2019/11/15 18:08:13 [INFO] endpoint '/api/v1/cfssl/certinfo' is enabled
2019/11/15 18:08:13 [INFO] Handler set up complete.
2019/11/15 18:08:13 [INFO] Now listening on 127.0.0.1:8888
③ 证书生成与签名
  • 截止目前,基于 cfssl 的 CA 已经配置完成,他运行在127.0.0.1:8888上。
  • 该 CA 如何颁发证书呢?CFSSL 提供了两个命令:gencertsign
  1. gencert命令将自动处理整个证书生成过程。该过程需要两个文件,一个告诉 cfssl 本地客户端 CA 的位置以及如何验证请求的配置文件,另一个为 CSR 配置信息,用于填充 CSR。
  2. sign命令可以对已经生成的csr文件进行签名,生成对应的私钥和证书。
  • 下面是为一个为数据库服务localhost创建证书的例子:
  1. 首先配置于cfssl服务器有关的信息,文件名config_client.json
{
  "signing": {
    "default": {
      "remote": "caserver"
    }
  },
  "auth_keys": {
    "key1": {
    "key": "1f27569ae7ec9e3178e965f7dc9ccedc",
    "type": "standard"
    }
  },
  "remotes": {
    "caserver": "http://127.0.0.1:8888"
  }
}
  1. 配置csr文件,文件名csr_client.json
{
  "hosts": [
        "localhost" 
  ],
  "CN": "MadledgerDB",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "Chengdu",
      "O": "Madledger",
      "OU": "Data Services",
      "ST": "Sichuan"
    }
  ]
}
  • 通过gencert命令生成对应的私钥db-key.pem、csr文件db.csr和证书文件db.pem
$ cfssl gencert -config config_client.json csr_client.json | cfssljson -bare db
  • 其中,证书文件查部分内容如下:
    Ubuntu利用cfssl搭建私有CA_第7张图片
  • 同时,还可以通过sign命令对csr文件重新签名,生成新的私钥和证书。
$ cfssl sign -config config_client.json db.csr | cfssljson -bare db-new
  • 自己发现,所谓的重新签名,就像是你把私钥和证书搞丢了,我重新帮你在生成一次就行了。但内容是没有发生变化的。
    Ubuntu利用cfssl搭建私有CA_第8张图片
    Ubuntu利用cfssl搭建私有CA_第9张图片

你可能感兴趣的:(区块链)