安装
源码编译安装(需要Golang和Git环境,具体步可骤参见网上)
- 源码下载到GOPATH
git clone https://github.com/hashicorp/vault
- 进入代码目录,编译(因为编译需要安装相关库,所以需要使用代理)
cd $GOPATH/src/github.com/hashicorp/vault/
make dev
预编译的Vault二进制安装
- 下载预编译二进制包
wget https://releases.hashicorp.com/Vault/1.1.3/Vault_1.1.3_linux_amd64.zip
- 解压到环境变量路径
unzip Vault_1.1.3_linux_amd64.zip -d /usr/local/bin
这里建议直接使用预编译的二进制包安装,简单快捷。
启动Vault
- 编辑配置文件
编辑配置文件vault.hcl,如下。配置中需要配置存储密钥的数据库相关信息,这里用的MySQL,官网上还支持其他数据库,具体信息参见vault官方文档
disable_mlock = true
ui = true
backend "mysql" {
address = "192.168.23.225:3306 "
username = "root"
password = "123456"
database = "vault-test"
table = "vault"
}
listener "tcp" {
address = "0.0.0.0:8200"
tls_disable = 1
}
api_addr = "http://192.168.23.225:8200"
- 启动Vault
#启动Vault服务
vault server -config=vault.hcl
#设置访问地址设置成http
export VAULT_ADDR=http://127.0.0.1:8200
- 初始化
vault operator init -key-shares=5 -key-threshold=3
# -key-shares:指定密钥的总股数,
# -key-threshold:指定需要几股可解锁
# 以上参数为默认,可不设置。
初始化的Vault会返回5个密钥,根据我们设置的启动参数,正确输入其中的3个密钥就可以解封数据库。Root Token是用作首次访问Vault使用。
Unseal Key 1: O2h1reLoykkEDPVptQ7xr4M6zpSLwexYvRxSbIsRqIRX
Unseal Key 2: xo5sQSE2MoiUbT4s/9WvmEF18K9HWy2ARwS1wW4VnX2c
Unseal Key 3: jm6BkWMnZlYGf2R5van32UJdB8nzE6uemyYz4JrsMH/2
Unseal Key 4: B6qEyjN26sookmCbmh0ZJr/B/4Ik7FdALaFmF4pylDGh
Unseal Key 5: Zw+JnaM7biiLlA094o2pAIXWrEM37sV7BF9flg8DFe8K
Initial Root Token: s.MWnxEObtfY6Knkk8tkDZs5yz
Vault initialized with 5 key shares and a key threshold of 3. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 3 of these keys to unseal it
before it can start servicing requests.
Vault does not store the generated master key. Without at least 3 key to
reconstruct the master key, Vault will remain permanently sealed!
It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See "vault operator rekey" for more information
- 解封
数据初始化的时候获取的5个密钥中的3个对Vault进行解封操作:
vault operator unseal
#分别输入5个中的3个密钥
Unseal Key (will be hidden):
Key Value
--- -----
Seal Type shamir
Initialized true
Sealed true
Total Shares 5
Threshold 3
Unseal Progress 1/3
Unseal Nonce 4bd56e46-40c1-baf9-ce13-b47386f35d78
Version 1.1.2
HA Enabled false
成功解封后,一个可用的Vault服务就启动了
创建CA签发引擎
- 登录
使用Root Token登录Vault
vault login s.MWnxEObtfY6Knkk8tkDZs5yz
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.
Key Value
--- -----
token s.MWnxEObtfY6Knkk8tkDZs5yz
token_accessor kVlLumxoJUyBH7ORZ0oNJgH7
token_duration ∞
token_renewable false
token_policies ["Root"]
identity_policies []
policies ["Root"]
- 创建Root CA
在创建根CA之前,我们需要先在Vault创建一个路径来存放Root CA
#创建存放证书路径
vault secrets enable -path=test -description="MQTT CA" -max-lease-ttl=87600h pki
Success! Enabled the pki secrets engine at: test /
#查看已经创建的引擎
vault secrets list
Vault中的每个secret引擎都需要定义路径和属性。对于用户来说,secret引擎的行为类似于虚拟文件系统,支持读、写和删除等操作,当然具体取决于使用角色分配给它们的权限。
#创建Root CA 填写相关证书信息
vault write test/Root/generate/internal \
common_name="test.com" \
ttl=87600h \
key_bits=4096
执行成功后会返回certificate就是我们的Root CA。更多的证书申请参数参见官网文档: Vault PKI证书介绍
- 创建角色
#创建role
vault write test/roles/test_server \
key_bits=2048 \
max_ttl=8750h \
allow_any_name=true
参数的test就是我们刚刚存放Root CA的路径,test_server就是我们创建角色的名称。
- 签发证书
那么就下来就用刚刚申请的角色签发一个证书。
#签发证书
vault write test/issue/test_server \
common_name="test.com" \
ttl=8660h \
format=pem
因为返回结果比较长,就不在文中贴了。执行成功后,会返回一个我们新签的CA证书,还有我们的Root CA,还有就是新颁发CA的私钥。
当然颁发证书的接口我们也可以通过HTTP接口获得:
定义请求参数 payload.json:
{
"common_name": "iot-sdk.intra.nsfocus.com",
"ttl":"8000h",
"format":"pem"
}
使用curl向Vault服务器发起POST请求,X-Vault-Token就是Vault的Root Token:
curl --header "X-Vault-Token: s.MWnxEObtfY6Knkk8tkDZs5yz" --request POST --data @payload.json http://192.168.23.225:8200/v1/test/issue/test_server
{
"auth": null,
"data": {
"certificate": "-----BEGIN CERTIFICATE-----\nMIIEXjdCzwN6h2...\n-----END CERTIFICATE-----",
"expiration": 1589711650,
"issuing_ca": "-----BEGIN CERTIFICATE-----\nMIIFLDCCAxSgAwI...\n-----END CERTIFICATE-----",
"private_key": "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAA...\n-----END RSA PRIVATE KEY-----",
"private_key_type": "rsa",
"serial_number": "76:e8:f1:49:91:58:8e:e3:6a:bc:b3:2d:ae:1c:bb:de:0c:27:a0:a6"
},
"lease_duration": 0,
"lease_id": "",
"renewable": false,
"request_id": "08d5fd69-bc93-5b10-9bc7-94ff47440b3b",
"warnings": null,
"wrap_info": null
}
- 证书校验
接下来,用Root CA验证一下我们新签发的CA证书:
- 将我们的Root CA存储到ca.crt中
- 签发CA存储到server.crt中
- 使用openssl命令进行校验,返回OK就证明申请的证书校验通过
#使用openssl校验证书
openssl verify -CAfile ca.crt server.crt
server.crt: OK
综上,一个完整的使用Vault签发CA证书的流程就完成了。