gpt4 book ai didi

database - 从 GCP secret 管理器中读取 .DER 值并将其保存到 .DER 文件

转载 作者:行者123 更新时间:2023-12-04 22:36:54 31 4
gpt4 key购买 nike

起初,这是我的第一篇文章——如果这篇文章没有得到很好的描述和设计,我很抱歉。
我的问题是我需要使用 Spring Boot 通过 SSL 连接连接到 GCP 中的数据库。在 GCP 内部生成三个所需的证书(client-cert.pem、client-key.pem、server-ca.pem)。不幸的是,spring 无法使用存储在 pem 文件中的客户端 key 连接到 db,因此我必须将客户端 key 保留在 .DER 证书中。
要连接到数据库,我使用这段代码。

return DataSourceBuilder
.create()
.url("jdbc:postgresql://XXX:5432/XXX?" +
"ssl=true&sslmode=verify-ca&" +
"sslrootcert=server-ca.pem&" +
"sslcert=client-cert.pem&" +
"sslkey=client-key.der")
.build();
}
要从 .PEM 文件生成 .DER,我使用了以下命令:
openssl pkcs8 -topk8 -inform PEM -in client-key.pem -outform DER -nocrypt -out client-key.der
在本地工作,但我必须将证书保存在 GCP 的 secret 管理器(SM)中。 SM 只能存储值,所以我保留 .DER 文件中的二进制值
![Take a look at image](/image/dAjLU.png).
我使用 GCP java 库连接到 SM:
 private String getKey(String projectId, String secretCertName, boolean isPEM) {
try (SecretManagerServiceClient client = SecretManagerServiceClient.create()) {
SecretVersionName secretVersionName = SecretVersionName.of(projectId, secretCertName, "latest");
AccessSecretVersionResponse response = client.accessSecretVersion(secretVersionName);
return response.getPayload().getData().toStringUtf8();

} catch (IOException e) {
System.out.println("gcp cant connect !");
}
return null;
}
它使用 PEM 和字符串值,但如果我想将此 key 保存在 .DER 文件中,那么我的 client-key.der 文件与 openssl 生成的证书不匹配,并且 spring 无法使用堆栈连接到数据库:

org.postgresql.util.PSQLException: Could not read SSL key file client-key.der. at org.postgresql.ssl.LazyKeyManager.getPrivateKey(LazyKeyManager.java:284) ~[postgresql-42.3.2.jar:42.3.2] at java.base/sun.security.ssl.AbstractKeyManagerWrapper.getPrivateKey(SSLContextImpl.java:1696) ~[na:na] ...


Caused by: java.io.IOException: Invalid lenByte at java.base/sun.security.util.DerValue.<init>(DerValue.java:374) ~[na:na] at java.base/sun.security.util.DerValue.<init>(DerValue.java:312) ~[na:na] at java.base/javax.crypto.EncryptedPrivateKeyInfo.<init>(EncryptedPrivateKeyInfo.java:86) ~[na:na] at org.postgresql.ssl.LazyKeyManager.getPrivateKey(LazyKeyManager.java:236) ~[postgresql-42.3.2.jar:42.3.2] ... 73 common frames omitted


知道我应该如何从 GCP SM 读取二进制文件(如 .DER 证书)吗?我读到应该编码,但直到现在我还没有成功。
感谢您的提前,请温柔,这是我的第一篇文章:)

最佳答案

根据约翰的评论,我在 secret 管理器中保存了编码的 .DER 文件。接下来,我从 secret 管理器 API 中解码了值。在这种情况下重要的事情 - 将字节 [] 而不是字符串保存到文件中!
更新:
您无需在 SM 中保存编码的 .DER 值。您可以保留二进制值,但要从 API 获取这些值,您需要使用:

return response.getPayload().getData().toByteArray();
并保存在 .DER 证书中,然后使用以下行:

try (FileOutputStream stream = new FileOutputStream(path)) {stream.write(Base64.getMimeDecoder().decode(Base64.getEncoder().encode(certValue)));}

关于database - 从 GCP secret 管理器中读取 .DER 值并将其保存到 .DER 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71705546/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com