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"
}