Secret Types - Reference¶
Barbican 中的每个 secret 都有一个类型。Secret 类型用于描述存储在 Barbican 中的不同类型的 secret 数据。特定 secret 的类型会列在 secret 的元数据中,作为 secret_type 属性。
可能的 secret 类型是
symmetric- 用于存储字节数组,例如适用于对称加密的密钥。public- 用于存储非对称密钥对的公钥。private- 用于存储非对称密钥对的私钥。passphrase- 用于存储纯文本密码。certificate- 用于存储加密证书,例如 X.509 证书。opaque- 用于与 API 的早期版本兼容,这些版本没有类型的 secret。鼓励新的应用程序指定其他 secret 类型之一。
对称加密¶
symmetric secret 类型用于存储敏感数据的字节数组,例如用于对称加密的密钥。与对称加密 secret 关联的 content-type 是 application/octet-stream。在使用单个 POST 请求存储对称加密 secret 时,数据必须进行编码,以便可以包含在请求的 JSON 主体中。在这种情况下,可以使用 base64 的 content 编码。
示例 1.1¶
创建一个用于 AES-256-CBC 加密的加密密钥,并将其存储在 Barbican 中。首先,我们将看到如何使用命令行中的 curl 在单个 POST 请求中完成此操作。
# Create an encryption_key file with 256 bits of random data
dd bs=32 count=1 if=/dev/urandom of=encryption_key
# Encode the contents of the encryption key using base64 encoding
KEY_BASE64=$(base64 < encryption_key)
# Send a request to store the key in Barbican
curl -vv -H "X-Auth-Token: $TOKEN" -H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"name": "AES encryption key",
"secret_type": "symmetric",
"payload": "'"$KEY_BASE64"'",
"payload_content_type": "application/octet-stream",
"payload_content_encoding": "base64",
"algorithm": "AES",
"bit_length": 256,
"mode": "CBC"}' \
https://:9311/v1/secrets | python -m json.tool
这应该返回创建的 secret 的引用 (URI)
{
"secret_ref": "https://:9311/v1/secrets/48d24158-b4b4-45b8-9669-d9f0ef793c23"
}
我们可以使用此引用来检索 secret 元数据
curl -vv -H "X-Auth-Token: $TOKEN" -H 'Accept: application/json' \
https://:9311/v1/secrets/48d24158-b4b4-45b8-9669-d9f0ef793c23 |
python -m json.tool
元数据将列出对称加密 secret 可用的 content-type
{
"algorithm": "AES",
"bit_length": 256,
"content_types": {
"default": "application/octet-stream"
},
"created": "2015-04-08T06:24:16.600393",
"creator_id": "3a7e3d2421384f56a8fb6cf082a8efab",
"expiration": null,
"mode": "CBC",
"name": "AES encryption key",
"secret_ref": "https://:9311/v1/secrets/48d24158-b4b4-45b8-9669-d9f0ef793c23",
"secret_type": "symmetric",
"status": "ACTIVE",
"updated": "2015-04-08T06:24:16.614204"
}
content_types 属性描述了可用于检索 payload 的 content-type。在本例中,只有默认 content-type application/octet-stream。我们可以使用它来检索 payload
# Retrieve the payload and save it to a file
curl -vv -H "X-Auth-Token: $TOKEN" \
-H 'Accept: application/octet-stream' \
-o retrieved_key \
https://:9311/v1/secrets/48d24158-b4b4-45b8-9669-d9f0ef793c23/payload
retrieved_key 文件现在包含我们开始的字节数组。请注意,barbican 以二进制格式返回字节数组,而不是 base64。这是因为 payload_content_encoding 仅在将 secret 提交到 barbican 时使用。
公钥¶
public secret 类型用于存储非对称密钥对的公钥。例如,可以使用 public secret 存储 RSA 密钥对的公钥。目前,public secret 仅接受一种文件格式:一个 DER 编码的 SubjectPublicKeyInfo 结构,如 X.509 RFC 5280 中定义,并使用 PEM 标头和页脚进行 Base64 编码。这是 openssl 工具默认生成的公钥类型。与 public secret 关联的 content-type 是 application/octet-stream。在使用单个 POST 请求存储 public secret 时,必须对文件内容进行编码,因为 JSON 不接受换行符。在这种情况下,文件内容必须进行 Base64 编码,并且可以使用 base64 的 content 编码。
示例 2.1¶
创建一个 RSA 密钥对,并将公钥存储在 Barbican 中。对于此示例,我们将使用仅元数据的 POST,然后是 PUT。
# Create the RSA keypair
openssl genrsa -out private.pem 2048
# Extract the public key
openssl rsa -in private.pem -out public.pem -pubout
# Submit a metadata-only POST
curl -vv -H "X-Auth-Token: $TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"name": "RSA Public Key",
"secret_type": "public",
"algorithm": "RSA"}' \
https://:9311/v1/secrets | python -m json.tool
这应该返回创建的 secret 的引用 (URI)
200 OK
{
"secret_ref": "https://:9311/v1/secrets/cd20d134-c229-417a-a753-86432ad13bad"
}
我们可以使用此引用使用 PUT 请求添加 payload
curl -vv -X PUT -H "X-Auth-Token: $TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/octet-stream' \
--data-binary @public.pem \
https://:9311/v1/secrets/cd20d134-c229-417a-a753-86432ad13bad
服务器应该以 2xx 响应响应,以指示 PUT 请求已成功处理
204 - No Content
现在我们应该能够请求元数据,并查看那里列出的新的 content-type
curl -vv -H "X-Auth-Token: $TOKEN" \
-H 'Accept: application/json' \
https://:9311/v1/secrets/cd20d134-c229-417a-a753-86432ad13bad |
python -m json.tool
{
"algorithm": "RSA",
"bit_length": null,
"content_types": {
"default": "application/octet-stream"
},
"created": "2015-04-08T21:45:59.239976",
"creator_id": "3a7e3d2421384f56a8fb6cf082a8efab",
"expiration": null,
"mode": null,
"name": "RSA Public Key",
"secret_ref": "https://:9311/v1/secrets/cd20d134-c229-417a-a753-86432ad13bad",
"secret_type": "public",
"status": "ACTIVE",
"updated": "2015-04-08T21:52:57.523969"
}
最后,我们可以使用 content_types 中列出的默认 content-type 来检索公钥
curl -vv -H "X-Auth-Token: $TOKEN" \
-H 'Accept: application/octet-stream' \
-o retrieved_public.pem \
https://:9311/v1/secrets/cd20d134-c229-417a-a753-86432ad13bad/payload
retrieved_public.pem 文件现在具有与我们开始的 public.pem 文件相同的内容。
示例 2.2¶
创建一个 RSA 密钥对,并将公钥存储在 Barbican 中。对于此示例,我们将使用单个 POST 请求。
# Create the RSA keypair
openssl genrsa -out private.pem 2048
# Extract the public key
openssl rsa -in private.pem -out public.pem -pubout
# Base64 encode the contents of the public key
PUB_BASE64=$(base64 < public.pem)
curl -vv -H "X-Auth-Token: $TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"name": "RSA Public Key",
"secret_type": "public",
"payload": "'"$PUB_BASE64"'",
"payload_content_type": "application/octet-stream",
"payload_content_encoding": "base64",
"algorithm": "RSA"}' \
https://:9311/v1/secrets | python -m json.tool
这应该返回创建的 secret 的引用 (URI)。
200 OK
{
"secret_ref": "https://:9311/v1/secrets/d553f0ac-c79d-43b4-b165-32594b612ad4"
}