上一片文章我们安装好了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):
先列出现有策略:
没有合适的,先建一个,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)证书。