[英]Read .DER value from GCP secret manager and save it to .DER file
首先,這是我的第一篇文章 - 如果這篇文章沒有很好地描述和設計,我深表歉意。
我的問題是我需要使用 spring 引導通過 SSL 連接連接到 GCP 中的數據庫。 在 GCP 內部生成三個所需的證書(client-cert.pem、client-key.pem、server-ca.pem)。 不幸的是,spring 無法使用存儲在 pem 文件中的客戶端密鑰連接到數據庫,因此我必須保留 exmaple inside.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 的秘密管理器 (SM) 中。 SM 只能存儲值,所以我從 .DER 文件中保留二進制值
![Take a look at image](https://i.stack.imgur.com/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 和字符串值,但如果我想將此密鑰保存在 .DER 文件中,則我的 client-key.der 文件與 openssl 和 spring 生成的證書不匹配,無法使用堆棧連接到 DB:
org.postgresql.util.PSQLException:無法讀取 SSL 密鑰文件 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) ~[吶:吶] ...
由以下原因引起:java.io.IOException:java.base/sun.security.util.DerValue 處的 lenByte 無效。<init>(DerValue.java:374) ~[na:na] 位於 882132469458213246945888.security .<init>(DerValue.java:312) ~[na:na] 在 java.base/javax.crypto.EncryptedPrivateKeyInfo.<init>(EncryptedPrivateKeyInfo.java:86) ~[na:na] 在 org.88309198781538.88309198781538 .getPrivateKey(LazyKeyManager.java:236) ~[postgresql-42.3.2.jar:42.3.2]...省略73個常用幀
知道我應該如何從 GCP SM 讀取二進制文件( like.DER cert )嗎? 我讀到應該進行編碼,但直到現在我還沒有成功。
感謝提前,請保持溫柔,這是我的第一篇文章:)
根據 John 的評論,我將 encoded.DER 文件保存在秘密管理器中。 接下來我解碼了來自秘密管理器 API 的值。在這種情況下重要的是 - 將字節 [] 而不是字符串保存到文件中!
更新:您不需要在 SM 中保存 encoded.DER 值。 您可以保留二進制值,但要從 API 獲取這些值,您需要使用:
return response.getPayload().getData().toByteArray();
並保存 inside.DER 證書然后使用以下行:
試試 (FileOutputStream stream = new FileOutputStream(path)) { stream.write(Base64.getMimeDecoder().decode(Base64.getEncoder().encode(certValue))); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.