我正在尝试在金库中设置基于证书的身份验证。对于测试,我刚刚创建了一个干净的库设置。下面的保险库配置:
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"
}
我已经开始并取消密封库和启用的证书身份验证:
[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告诉我证书是无效的(至少这是我从这里阅读来源的理解。虽然我得到的答案说完全没有提供证书:
[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 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
在跟踪模式下运行的保险库服务器在此交互期间不提供任何日志。但是,如果我要使用不同证书中的键试图故意打破TL,我会在保险库中看到一条错误消息,指示。
任何想法此设置可能是什么问题?
在有关tls客户端验证的提交后,我终于有了一个工作的库实例。
用于设置的客户端证书验证任何向Vault TCP侦听器请求,您必须配置两个值:
-
tls_client_ca_file = "/my/intermediate/ca/intermediate.cert.pem
-
tls_require_and_verify_client_cert = true
当配置这两个设置时,所有没有有效客户端证书的后端请求被阻止,然后将所有有效的客户端请求转发到保险库实例。
在我理解这只是一个未经授权访问的"过滤器"。
所以让我们从TLS CERT身份验证设置开始:
首先,我们必须设置保险库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
然后,我们必须为秘密引擎创建一个策略文件(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>
和以下保险库客户端配置(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]},leaseawarevaultPropertySource {name ='myorganization/dev/application'}]}
或提供无效的证书:
org.springframework.web.client.ResourceAccessException:i/o错误 发布" https://my.vault.app.com:8200/v1/auth/cert/login"的请求: 收到致命警报:bad_certificate;嵌套异常是 javax.net.ssl.sslhandshakeexception:收到致命警报: bad_certificate
我今天有相同的问题..花了半天的时间试图找出错误...事实证明,在Vault Config" Tls_disable_client_certs = false(中在听众部分中,实际上会禁用认证身份验证。
所以希望其他人可能会偶然发现这个问题得到一些线索...删除该行,证书验证应有效。
这是文档链接,不确定我如何将其解释为使这意味着浏览器,而其他客户将忽略自我签名证书,情况并非如此。
https://www.vaultproject.io/docs/configuration/listener/tcp.html#tls_disable_client_certs
tls_disable_client_certs(字符串:" false"( - 关闭客户端 该听众的身份验证。默认行为(这是 false(是要在可用的情况下向金库请求客户证书。
尽管我回答迟到。但是我能够配置Spring Cloud Config Server通过证书使用CERT身份验证的Vault作为后端。
这是我的教程:https://medium.com/@java.developer.raman/enable-spring-config-server-config-server-to-use-cert-cert-authentication-with-vault-vault-as-back-end-ff84e1ef77?SK = 45A26D7F1277437D91A5CFF3D5997287
和github存储库:https://github.com/java-developer-raman/config-server-vault-backend