委托 PKI 身份验证 API编辑

实现将 *X509Certificate* 链交换为 Elasticsearch 访问令牌。

请求编辑

POST /_security/delegate_pki

先决条件编辑

  • 要调用此 API,(代理)用户必须具有 delegate_pkiall 集群权限。 kibana_system 内置角色已授予此权限。请参阅安全权限

描述编辑

此 API 实现了将 *X509Certificate* 链交换为 Elasticsearch 访问令牌。证书链根据 RFC 5280 进行验证,方法是依次考虑每个已安装的 PKI 领域的信任配置,这些领域已将 delegation.enabled 设置为 true(默认为 false)。成功受信任的客户端证书还需要根据相应领域的 username_pattern 验证主题专有名称。

此 API 由**智能**和**受信任**代理(例如 Kibana)调用,这些代理终止用户的 TLS 会话,但仍希望使用 PKI 领域对用户进行身份验证,就像用户直接连接到 Elasticsearch 一样。有关更多详细信息,请参阅连接到 Kibana 的客户端的 PKI 身份验证

**不会**验证目标证书中的主题公钥与相应私钥之间的关联。这是 TLS 身份验证过程的一部分,它被委托给调用此 API 的代理。代理被**信任**已执行 TLS 身份验证,并且此 API 将该身份验证转换为 Elasticsearch 访问令牌。

请求正文编辑

x509_certificate_chain

(必需,字符串列表)*X509Certificate* 链,表示为有序字符串数组。数组中的每个字符串都是证书 DER 编码的 base64 编码(RFC4648 的第 4 部分 - 不是 base64url 编码)。

第一个元素是目标证书,其中包含请求访问的主题专有名称。后面可以跟其他证书;每个后续证书都用于验证前一个证书。

响应正文编辑

access_token
(字符串)与客户端证书的主题专有名称关联的访问令牌。
expires_in
(时间单位)令牌过期的时间(以秒为单位)。
type
(字符串)令牌的类型。

示例编辑

以下是一个请求示例

POST /_security/delegate_pki
{
  "x509_certificate_chain": ["MIIDeDCCAmCgAwIBAgIUBzj/nGGKxP2iXawsSquHmQjCJmMwDQYJKoZIhvcNAQELBQAwUzErMCkGA1UEAxMiRWxhc3RpY3NlYXJjaCBUZXN0IEludGVybWVkaWF0ZSBDQTEWMBQGA1UECxMNRWxhc3RpY3NlYXJjaDEMMAoGA1UEChMDb3JnMB4XDTIzMDcxODE5MjkwNloXDTQzMDcxMzE5MjkwNlowSjEiMCAGA1UEAxMZRWxhc3RpY3NlYXJjaCBUZXN0IENsaWVudDEWMBQGA1UECxMNRWxhc3RpY3NlYXJjaDEMMAoGA1UEChMDb3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAllHL4pQkkfwAm/oLkxYYO+r950DEy1bjH+4viCHzNADLCTWO+lOZJVlNx7QEzJE3QGMdif9CCBBxQFMapA7oUFCLq84fPSQQu5AnvvbltVD9nwVtCs+9ZGDjMKsz98RhSLMFIkxdxi6HkQ3Lfa4ZSI4lvba4oo+T/GveazBDS+NgmKyq00EOXt3tWi1G9vEVItommzXWfv0agJWzVnLMldwkPqsw0W7zrpyT7FZS4iLbQADGceOW8fiauOGMkscu9zAnDR/SbWl/chYioQOdw6ndFLn1YIFPd37xL0WsdsldTpn0vH3YfzgLMffT/3P6YlwBegWzsx6FnM/93Ecb4wIDAQABo00wSzAJBgNVHRMEAjAAMB0GA1UdDgQWBBQKNRwjW+Ad/FN1Rpoqme/5+jrFWzAfBgNVHSMEGDAWgBRcya0c0x/PaI7MbmJVIylWgLqXNjANBgkqhkiG9w0BAQsFAAOCAQEACZ3PF7Uqu47lplXHP6YlzYL2jL0D28hpj5lGtdha4Muw1m/BjDb0Pu8l0NQ1z3AP6AVcvjNDkQq6Y5jeSz0bwQlealQpYfo7EMXjOidrft1GbqOMFmTBLpLA9SvwYGobSTXWTkJzonqVaTcf80HpMgM2uEhodwTcvz6v1WEfeT/HMjmdIsq4ImrOL9RNrcZG6nWfw0HR3JNOgrbfyEztEI471jHznZ336OEcyX7gQuvHE8tOv5+oD1d7s3Xg1yuFp+Ynh+FfOi3hPCuaHA+7F6fLmzMDLVUBAllugst1C3U+L/paD7tqIa4ka+KNPCbSfwazmJrt4XNiivPR4hwH5g=="] 
}

一个元素的证书链。

返回以下响应

{
  "access_token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
  "type" : "Bearer",
  "expires_in" : 1200,
  "authentication" : {
    "username" : "Elasticsearch Test Client",
    "roles" : [ ],
    "full_name" : null,
    "email" : null,
    "metadata" : {
      "pki_dn" : "O=org, OU=Elasticsearch, CN=Elasticsearch Test Client",
      "pki_delegated_by_user" : "test_admin",
      "pki_delegated_by_realm" : "file"
    },
    "enabled" : true,
    "authentication_realm" : {
      "name" : "pki1",
      "type" : "pki"
    },
    "lookup_realm" : {
      "name" : "pki1",
      "type" : "pki"
    },
    "authentication_type" : "realm"
  }
}