Hashicorp Vault tls cert身份验证不读取证书

时间:2018-02-14 16:24:20

标签: ssl hashicorp-vault

我正在尝试在Vault中设置基于证书的身份验证。对于测试,我刚刚创建了一个干净的Vault设置。下面的保险柜配置:

listener "tcp" {
  address                  = "192.168.33.10:8200"
  tls_cert_file            = "/etc/vault/vault_cert.pem"
  tls_key_file             = "/etc/vault/vault_key.pem"
  tls_disable_client_certs = false
  tls_disable              = false
}

listener "tcp" {
  address                  = "127.0.0.1:8200"
  tls_disable              = true
}

storage "file" {
  path = "/etc/vault/data"
}

我已启动并启用了Vault并启用了身份验证身份验证:

[vagrant@localhost ~]$ ./vault status
Key             Value
---             -----
Seal Type       shamir
Sealed          false
Total Shares    5
Threshold       3
Version         0.9.3
Cluster Name    vault-cluster-37dffb3b
Cluster ID      1ddd4712-99f6-3691-a066-d476fbc6d7c6
HA Enabled      false
[vagrant@localhost ~]$ ./vault auth list
Path      Type     Description
----      ----     -----------
cert/     cert     n/a
token/    token    token based credentials

现在我已经生成了尚未添加到Vault的ssl密钥/证书对,所以我希望Vault告诉我证书无效(至少这是我对阅读来源的理解here。虽然答案是答案我得知说根本没有提供证书:

[vagrant@localhost ~]$ VAULT_ADDR='https://192.168.33.10:8200' ./vault login -method cert -tls-skip-verify -client-cert=./client_cert.pem -client-key=./client_key.pem
Error authenticating: Error making API request.

URL: PUT https://192.168.33.10:8200/v1/auth/cert/login
Code: 400. Errors:

* client certificate must be supplied

根据我在sources中找到的内容,只有在根本没有提供给Vault的证书时才会返回此错误消息。为了确保Vault cli客户端不是问题,我尝试用curl做同样的事情,但得到了相同的结果:

[vagrant@localhost ~]$ curl -iv -k -X POST --cert ./client_cert.pem --key ./client_key.pem https://192.168.33.10:8200/v1/auth/cert/login
* About to connect() to 192.168.33.10 port 8200 (#0)
*   Trying 192.168.33.10...
* Connected to 192.168.33.10 (192.168.33.10) port 8200 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
* skipping SSL peer certificate verification
* SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
* Server certificate:
*   subject: CN=Vault,E=vault@example.com,O=Exmaple,L=Berlin,ST=BERLIN,C=DE
*   start date: Feb 14 15:59:37 2018 GMT
*   expire date: Feb 12 15:59:37 2028 GMT
*   common name: Vault
*   issuer: CN=Vault,E=vault@example.com,O=Exmaple,L=Berlin,ST=BERLIN,C=DE
> POST /v1/auth/cert/login HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 192.168.33.10:8200
> Accept: */*
>
< HTTP/1.1 400 Bad Request
HTTP/1.1 400 Bad Request
< Cache-Control: no-store
Cache-Control: no-store
< Content-Type: application/json
Content-Type: application/json
< Date: Wed, 14 Feb 2018 16:20:57 GMT
Date: Wed, 14 Feb 2018 16:20:57 GMT
< Content-Length: 51
Content-Length: 51

<
{"errors":["client certificate must be supplied"]}
* Connection #0 to host 192.168.33.10 left intact

以跟踪模式运行的Vault服务器在此交互期间不提供任何日志。但是,如果我将使用来自不同证书的密钥试图故意破坏TLS,我会在Vault中看到一条错误消息,表明这一点。

知道这个设置可能出现什么问题吗?

3 个答案:

答案 0 :(得分:1)

在深入了解commits关于Vault的TLS客户端验证之后,我终于有了一个有效的Vault实例。

要为向Vault TCP侦听器的任何请求设置客户端证书验证,必须配置两个值:

  • tls_client_ca_file = "/my/intermediate/ca/intermediate.cert.pem
  • tls_require_and_verify_client_cert = true

配置这两个设置后,将阻止所有没有有效客户端证书的后端请求,然后将所有有效客户端请求转发到Vault实例。

据我了解,这只是未经授权访问的“过滤器”。

因此,我们从TLS证书身份验证设置开始:

首先,我们必须设置Vault CLI为执行的每个请求提供一个客户端证书:

export VAULT_CLIENT_CERT="/my/cert/path/vault-client.cert.pem"
export VAULT_CLIENT_KEY="/my/cert/path/vault-client.key.pem"

export VAULT_ADDR="https://my.vault.app.com:8200"

使用此命令,我们可以遍历TCP侦听器的“过滤器”。

最后执行启用客户端证书身份验证的命令

vault auth enable cert

要授予对特定客户端的访问权限,必须将证书链接到一个策略,该策略本身描述对特定秘密引擎的访问:

让我们为myorganization/dev创建一个简单的KV秘密引擎:

vault secrets enable -path=myorganization/dev kv

然后,我们必须为Secrets Engine创建策略文件(HCL语法):

path "myorganization/dev/myapp" {
     capabilities = ["read"]
}

创建策略文件后,我们可以将其上传到保管库的策略存储中:

vault policy write myapp-read-access myapp-read-access.hcl

最后,我们必须通过将.cert.pem文件上传到证书存储并将其映射到此策略,来为该策略分配应用或客户端证书*:

vault write auth/cert/certs/myapp display_name="My Vault Test App" policies=myapp-read-access certificate=myapp.cert.pem ttl=3600

*这可以与export指令中的内容或其他证书(当然是相同的CA)相同

配置完成后,您可以使用CLI客户端:

vault login -method=cert

或者,您可以使用以下方式为登录指定其他证书:

vault login -method=cert -client-cert=myapp.cert.pem -client-key=myapp.key.pem

在我的情况下,我使用Java客户端,并使用以下Maven POM进行依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-vault-dependencies</artifactId>
    <version>2.0.2.BUILD-SNAPSHOT</version>
    <scope>import</scope>
    <type>pom</type>
</dependency>

以及以下Vault客户端配置(bootstrap.yml):

spring.application.name: myapp
spring.cloud.vault:
  host: my.vault.app.com
  port: 8200
  scheme: https
  generic.backend: myorganization/dev
  authentication: CERT
  ssl:
    key-store: classpath:myapp.jks
    key-store-password: <MYKEYSTOREPW>
    cert-auth-path: cert

Etvoilà:

  

2018-09-19 14:02:18.114信息51832 --- [main] bcPropertySourceBootstrapConfiguration:定位的属性源:CompositePropertySource {name ='vault',propertySources = [LeaseAwareVaultPropertySource {name ='myorganization / dev / myapp' },LeaseAwareVaultPropertySource {name ='myorganization / dev / application'}]}

或者如果提供的证书无效:

  

org.springframework.web.client.ResourceAccessException:I / O错误发生在   POST请求“ https://my.vault.app.com:8200/v1/auth/cert/login”:   收到致命警报:bad_certificate;嵌套异常为   javax.net.ssl.SSLHandshakeException:收到致命警报:   bad_certificate

答案 1 :(得分:0)

我今天也遇到了同样的问题..花了半天的时间来找出问题所在...事实证明,在侦听器部分的Vault配置“ tls_disable_client_certs = false”中,实际上禁用了证书身份验证..

因此希望其他人可能会偶然发现此问题以获取一些线索...删除该行,然后证书身份验证应该起作用。

这是文档链接,不确定我如何解释为启用此功能,这意味着浏览器和其他客户端将忽略自签名证书,情况并非如此。

https://www.vaultproject.io/docs/configuration/listener/tcp.html#tls_disable_client_certs

  

tls_disable_client_certs(字符串:“ false”)–关闭客户端   此侦听器的身份验证。默认行为(这是   false)是指保管箱在可用时请求客户端证书。

答案 2 :(得分:0)

尽管我迟到了。但是我能够配置Spring Cloud Config Server,以将Vault用作通过证书进行CERT身份验证的后端。

这是我的教程:https://medium.com/@java.developer.raman/enable-spring-config-server-to-use-cert-authentication-with-vault-as-back-end-ff84e1ef2de7?sk=45a26d7f1277437d91a5cff3d5997287

和GitHub存储库:https://github.com/java-developer-raman/config-server-vault-backend