git clone https://github.com/hashicorp/vault
cd $GOPATH/src/github.com/hashicorp/vault/
make dev
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
这里建议直接使用预编译的二进制包安装,简单快捷。
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 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
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服务就启动了
使用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"]
在创建根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
}
#使用openssl校验证书
openssl verify -CAfile ca.crt server.crt
server.crt: OK
综上,一个完整的使用Vault签发CA证书的流程就完成了。