我在本地安装了 Vault。根据这个官方教程https://learn.hashicorp.com/vault/ ,我能够启动本地开发服务器并将一些秘密写入/读取到 Vault kv
然后我想创建一些非常基本的 Java/Spring Boot 演示客户端,它可以连接到我的本地 Vault 开发服务器以写入/读取机密。我阅读了 Baeldung 教程以获取灵感https://www.baeldung.com/spring-vault。
这是我的 Vault-config.properties:
vault.uri= http://127.0.0.1:8200
vault.token=s.EXg6MQwUuB63Z7Xra4zybOut(最近一次启动服务器后生成的token)
然后服务类:
@Service
public class CredentialsService {
@Autowired
private VaultTemplate vaultTemplate;
public void secureCredentials(Credentials credentials) throws URISyntaxException {
vaultTemplate.write("credentials/myapp", credentials);
}
public Credentials accessCredentials() throws URISyntaxException {
VaultResponseSupport<Credentials> response = vaultTemplate.read("credentials/myapp", Credentials.class);
return response.getData();
}
}
配置类:
@Configuration
public class VaultConfig extends AbstractVaultConfiguration {
@Override
public ClientAuthentication clientAuthentication() {
return new TokenAuthentication("s.EXg6MQwUuB63Z7Xra4zybOut");
}
@Override
public VaultEndpoint vaultEndpoint() {
return VaultEndpoint.create("host", 8200);
}
}
和这个:
@Configuration
@PropertySource(value = { "vault-config.properties" })
@Import(value = EnvironmentVaultConfiguration.class)
public class VaultEnvironmentConfig {
}
一个域对象:
public class Credentials {
private String username;
private String password;
public Credentials() {
}
public Credentials(String username, String password) {
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
@Override
public String toString() {
return "Credential [username=" + username + ", password=" + password + "]";
}
}
最后是我的主要 Spring Boot 类:
@RestController
@ComponentScan
@SpringBootApplication
public class SpringVaultTutorial {
@Autowired
CredentialsService credentialsService;
@RequestMapping("/")
String home() throws URISyntaxException {
Credentials credentials = new Credentials("oliver","exxeta123");
credentialsService.secureCredentials(credentials);
return credentialsService.accessCredentials().getUsername().toString();
}
public static void main(String[] args) {
SpringApplication.run(SpringVaultTutorial.class, args);
}
}
主类应写入秘密,然后立即读取并打印用户名。但我收到此错误消息:
出现意外错误(类型=内部服务器错误,状态=500)。“ https://host:8200/v1/credentials/myapp的 POST 请求出现 I/O 错误:主机;嵌套异常是 java.net.UnknownHostException: host
有人知道可能出了什么问题吗?
编辑:根据 Arun 的建议,我遵循了本教程https://drissamri.be/blog/java/enable-https-in-spring-boot/
我一直在尝试这两种方法。1)修改application.properties:
server.port: 8443
server.ssl.key-store: keystore.p12
server.ssl.key-store-password: oliver
server.ssl.keyStoreType: PKCS12
server.ssl.keyAlias: tomcat
security.require-ssl=true
修改后,当我调用https://localhost:8443时,我得到 Exception: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? 在 sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:710) ~[na:1.8.0_121] 在 sun.security.ssl.InputRecord.read(InputRecord.java:527) ~[na:1.8.0_121]在 sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973) ~[na:1.8.0_121] 在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375) ~[na:1.8.0_121]在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403) ~[na:1.8.0_121] 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1387) ~[na:1.8.0_121]
2)基于教程的第二种方法是添加 ConnectorConfig 类:
@Configuration
public class ConnectorConfig {
@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat =
new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
tomcat.addAdditionalTomcatConnectors(redirectConnector());
return tomcat;
}
private Connector redirectConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setPort(8090);
connector.setSecure(false);
connector.setRedirectPort(8443);
return connector;
}
}
但是在调用 localhost:8090 将我重定向到https://localhost:8443之后,我得到了同样的错误: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? 在 sun.security.ssl.InputRecord.handleUnknownRecord(InputRecord.java:710) ~
现在的问题是:我是否还必须在 Vault 端配置一些关于证书的东西?或者您认为 Java 客户端可能存在一些证书问题?但是我觉得如果有 Java 证书问题,在启动过程中就会抛出异常。