用Hashicorp Vault搭建自己的CA(二)——创建CA

上一片文章我们安装好了Vault,对它进行了初始化,接下来我们以此为基础,搭建自己的CA😺。不过在此之前我们先看看Vault的操作方法。

阅读之前必须先看过安装及初始化 !我这是连续剧。

C Vault的基本操作

其实无论是web界面还是Vault命令行都是与HTTP API进行交互,他们几乎都有等价的REST调用方法。

命令行

创建账号

还记得上一篇我们解封了Vault之后得到的管理员令牌么,试试吧:

1
2
export VAULT_ADDR='<Vault暴露的地址,比如我的是https://vault-dev.miyunda.com>'
vault login -no-store # 不在文件系统存令牌

日常操作总不能就用这个账号吧,虽然能用但是太不讲究了。Vault支持很多种主流身份验证,我们过家家的就创建一个用户名密码的即可:

1
2
vault auth enable userpass
vault write auth/userpass/users/<用户名> password=<密码>

创建策略

为了有权限,还得给新账号关联到“组”,Vault叫做策略(policy):

先列出现有策略:

1
vault policy list

没有合适的,先建一个,61行那里假如您的CA名字不打算用ca开头的话就自己换一下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
tee admin-policy.hcl <<EOF
# 读系统状态
path "sys/health"
{
  capabilities = ["read", "sudo"]
}

# 管理ACL策略

# 列出
path "sys/policies/acl"
{
  capabilities = ["list"]
}

# 读写
path "sys/policies/acl/*"
{
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}

# 管理验证方法

# 读写
path "auth/*"
{
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}

# 读写
path "sys/auth/*"
{
  capabilities = ["create", "update", "delete", "sudo"]
}

# 列出
path "sys/auth"
{
  capabilities = ["read"]
}

# 管理k/v数据库

# 读写
path "secret/*"
{
  capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}

# 能开启/关闭
path "sys/mounts/*" {
  capabilities = [ "create", "read", "update", "delete", "list" ]
}

# 列出
path "sys/mounts" {
  capabilities = [ "read", "list" ]
}

# 管理ca开头的pki数据库
path "ca*" {
  capabilities = [ "create", "read", "update", "delete", "list", "sudo", "patch" ]
}
EOF
vault policy write admin admin-policy.hcl

给新账号一个admin 的身份:

1
vault write auth/userpass/users/<用户名> policies=admin

用新账号登录:

1
2
rm ~/.vault-token # 删掉缓存的令牌(假如有)
vault login -method=userpass username=<用户名>

D 搭建CA

概述

我们将搭建一个根(root)CA,由它签发一个中间(intermediate)CA,中间CA负责为最终的使用者(一般为web服务器/app)签发证书。 信任链简易示意图

根CA

先准备一个路径(path):

1
2
vault secrets enable -path=ca-root-x1 pki
vault secrets tune -max-lease-ttl=525600h ca-root-x1 # 默认单位是秒

注:ca-root-x1名字可以换成自己喜欢的

在这个路径里面建立根CA:

1
2
3
4
vault write -field=certificate ca-root-x1/root/generate/internal \
     common_name="<FQDN>" \ # 我的是vault-dev.miyunda.com
     issuer_name="root-dev-x1" \
     ttl=175200h > ca-root-x1.crt # 最大不能超过上面的时间,我和这CA说不定谁把谁送走呢

提供AIA路径(可选)

1
2
3
vault write ca-root-x1/config/cluster \
   path=$VAULT_ADDR/v1/ca-root-x1 \
   aia_path=$VAULT_ADDR/v1/ca-root-x1

列出现有CA:

1
2
3
4
vault list ca-root-x1/issuers/
Keys
----
5ba025bf-b3d4-3c9e-43ea-07d31e3c7387

可以看看详细信息,没有jq 工具的自己装下:

1
2
vault read ca-root-x1/issuer/$(vault list -format=json ca-root-x1/issuers/ | jq -r '.[]') \
 | tail -n 11

给这个根CA指定角色(role):

1
vault write ca-root-x1/roles/root-servers allow_any_name=true

提供CA和CRL等路径:

1
2
3
4
5
vault write ca-root-x1/config/urls \
   issuing_certificates=$VAULT_ADDR/v1/ca-root-x1/ca \
   crl_distribution_points=$VAULT_ADDR/v1/ca-root-x1/crl \
   ocsp_servers=$VAULT_ADDR/v1/ca-root-x1/ocsp \
   enable_templating=true

注:CRL,OCSP还有再上面一点的AIA路径一般是不使用https保护的,而是直接使用http,因为它们往往也是使用自签名的证书保护的;按说是否使用https应该具体情况具体分析,但是我们过家家就无所谓,图省事就是一把梭https。

中间CA

中间CA由根CA签发,也给最终的使用者(leaf)签发证书。不嫌蛋疼您也可以多搞几层中间CA。我就只弄一个。

还是先准备一个路径:

1
2
vault secrets enable -path=ca-int-x1 pki
vault secrets tune -max-lease-ttl=87600h ca-int-x1

在这个路径创建中间CA:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
vault pki issue \
      --issuer_name=intermediate-dev-x1 \
      /ca-root-x1/issuer/default \
      /ca-int-x1/ \
      common_name="<这里和下面两行都需要自己命名>" \
      o="homelab" \
      ou="Marketing" \
      key_type="rsa" \
      key_bits="4096" \
      max_depth_len=1 \
      permitted_dns_domains="<域名>" \ # 比如我的是“miyunda.com,.local”
      ttl="87600h"

注:ca-int-x1同样可以换成自己喜欢的名字。

给它指定角色:

1
2
3
4
5
vault write ca-int-x1/roles/<起个名字> \ # 比如“cert-test”
     issuer_ref="$(vault read -field=default ca-int-x1/config/issuers)" \
     allowed_domains=<自己的域名> \ # 比如“miyunda.com,local”
     allow_subdomains=true \
     max_ttl="720h"

看下信息:

1
2
3
4
vault list ca-int-x1/issuers/
vault read ca-int-x1/issuer/default
vault list ca-int-x1/roles
vault read ca-int-x1/roles/cert-test

好了,本次我们学会了如何搭建根CA,用它签发中间CA。下一篇文章我们用中间CA签发最终服务器(leaf)证书。

0%