我正试图设置一个春季启动程序,通过TLS与Vault服务器对话。我想使用相互证书认证。我可以用TLS设置Vault服务器,并且我可以使用CLI使用客户证书登录它。然而,spring boot应用程序无法向Vault服务器提交其客户端证书 - 每次我运行我的应用程序时,Vault服务器都会打印。
http: TLS handshake error from 127.0.0.1:33288: tls: client didn't provide a certificate
客户端(我的spring boot应用程序)打印。
org.springframework.vault.authentication.VaultLoginException:
Cannot login using org.springframework.web.client.ResourceAccessException:
I/O error on POST request for "https://localhost:8200/v1/auth/cert/login":
Received fatal alert: bad_certificate;
nested exception is javax.net.ssl.SSLHandshakeException:
Received fatal alert: bad_certificate
... (a stack trace for VaultLoginException)
这是我的 bootstrap.yml
:
spring:
application.name: vault-demo
cloud.vault:
host: localhost
port: 8200
scheme: https
uri: https://localhost:8200
connection-timeout: 5000
read-timeout: 15000
config.order: -10
authentication: CERT
ssl:
trust-store: classpath:keystore.jks
trust-store-password: changeit
key-store: classpath:client-cert.jks
key-store-password: changeit
cert-auth-path: cert
我找不到任何关于需要配置的各种属性的文件。spring.cloud.vault.*
.
我的 client-cert.jks
存储有客户端证书和密钥。启用SSL verbose日志,我可以看到这个。
*** ServerHelloDone
Warning: no suitable certificate found - continuing without client authentication
*** Certificate chain
这表明客户端在其信任存储中找到了服务器的证书 但它并没有将客户端的证书发送给服务器。
此外,如果我使用 curl
来发送一个登录请求,它是成功的。
curl -k --request POST \
--cert work/ca/certs/client.cert.pem \
--key work/ca/private/client.decrypted.key.pem \
--data @payload.json \
https://localhost:8200/v1/auth/cert/login
# gives me back a JSON with newly issued token.
我还试着使用一个config类,并通过了 javax.net.ssl.keyStore
及相关属性为 JAVA_OPTS
但完全没有区别--vault一直说客户端没有发送证书。
@Configuration
public class AppConfig extends AbstractVaultConfiguration {
@Value("${vault.uri}")
URI vaultUri;
@Override
public VaultEndpoint vaultEndpoint() {
return VaultEndpoint.from(vaultUri);
}
@Override
public ClientAuthentication clientAuthentication() {
try {
RestTemplate restTemplate = new RestTemplate();
HttpClientBuilder httpClientBuilder = HttpClients.custom()
.setSSLContext(SSLContext.getDefault())
.useSystemProperties();
restTemplate.setRequestFactory(
new HttpComponentsClientHttpRequestFactory(
httpClientBuilder.build()));
return new ClientCertificateAuthentication(restTemplate);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}
有谁能指出我错过了什么,做错了什么?
问题是,我的Vault配置没有指定使用TLS。tls_client_ca_file
属性正确。将其设置为根CA证书,一切都正常。不需要添加一个 AppConfig
类也。