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

Ssl Hashicorp Vault tls证书身份验证不读取证书,ssl,hashicorp-vault,Ssl,Hashicorp Vault,我正在尝试在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_disab

我正在尝试在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
现在我已经生成了ssl密钥/证书对,但尚未添加到Vault中,因此我希望Vault会告诉我证书无效(至少我从阅读资料中了解到了这一点。尽管我得到的答案是根本没有提供证书:

[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
根据我在中找到的信息,只有在根本没有向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
[vagrant@localhost~]$curl-iv-k-X POST--cert./client\u cert.pem--key./client\u key.pemhttps://192.168.33.10:8200/v1/auth/cert/login
*即将连接()到192.168.33.10端口8200(#0)
*正在尝试192.168.33.10。。。
*连接到192.168.33.10(192.168.33.10)端口8200(#0)
*使用certpath:sql:/etc/pki/nssdb初始化NSS
*跳过SSL对等证书验证
*使用TLS\u ECDHE\u RSA\u和\u AES\u 256\u GCM\u SHA384的SSL连接
*服务器证书:
*主题:CN=保险库,E=vault@example.com,O=Exmaple,L=Berlin,ST=Berlin,C=DE
*开始日期:2018年2月14日15:59:37 GMT
*过期日期:2月12日15:59:37格林尼治标准时间2028
*通用名称:Vault
*发行人:CN=Vault,E=vault@example.com,O=Exmaple,L=Berlin,ST=Berlin,C=DE
>POST/v1/auth/cert/login HTTP/1.1
>用户代理:curl/7.29.0
>主持人:192.168.33.10:8200
>接受:*/*
>
在跟踪模式下运行的Vault server在此交互过程中不提供任何日志。但是,如果我将使用来自不同证书的密钥试图故意破坏TLS,我会在Vault中看到一条错误消息,指出这一点


知道这个设置有什么问题吗?

我今天也遇到了同样的问题。我花了半天的时间试图找出问题所在…结果是在侦听器部分的vault配置“tls\u disable\u client\u certs=false”中,实际上禁用了证书身份验证

所以,希望其他人可能会偶然发现这个问题得到一些线索…删除该行和证书认证应该工作

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

tls_禁用_客户端_证书(字符串:“false”)–关闭客户端 此侦听器的身份验证。默认行为(当 false)用于Vault在可用时请求客户端证书

在深入研究了Vault的TLS客户端验证之后,我终于有了一个工作的Vault实例

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

  • tls\u client\u ca\u file=“/my/intermediate/ca/intermediate.cert.pem
  • tls\u require\u和\u verify\u client\u 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
为了授予对特定客户端的访问权限,证书必须链接到一个策略,该策略本身描述了对特定机密引擎的访问:

path "myorganization/dev/myapp" {
     capabilities = ["read"]
}
让我们为
myorganization/dev
创建一个简单的引擎:

vault secrets enable -path=myorganization/dev kv
然后,我们必须为机密引擎创建策略文件(语法):

path "myorganization/dev/myapp" {
     capabilities = ["read"]
}
创建策略文件后,我们可以将其上载到vault的策略存储:

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
*这可以与
导出
指令或某些其他证书中的内容相同(当然是相同的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>

org.springframework.cloud
":
收到致命警报:证书错误;嵌套异常为
javax.net.ssl.SSLHandshakeException:收到致命警报:
坏证书


虽然我的回答很晚。但我能够配置SpringCloudConfigServer,将Vault用作后端,并通过证书进行证书身份验证

以下是我的教程:


和GitHub repository:

谢谢你的回答。不幸的是,这不是我的情况,我启用了tls身份验证。虽然这有点奇怪……但我希望是相反的:设置
tls\u disable\u client\u certs=true
会禁用客户端证书。就像
disable=true
一样……你解决了这个问题吗?我是currently有相同的问题。不幸的是,没有。我曾经使用不同的身份验证方法解决过这个问题,最近没有研究过。非常感谢@jAC!+记录我将添加树内容。1)证书必须具有clien的扩展密钥用法