起初,這是我的第一篇文章——如果這篇文章沒有得到很好的描述和設計,我很抱歉。
我的問題是我需要使用 Spring Boot 通過 SSL 連接連接到 GCP 中的資料庫。在 GCP 內部生成三個所需的證書(client-cert.pem、client-key.pem、server-ca.pem)。不幸的是,spring 無法使用存盤在 pem 檔案中的客戶端密鑰連接到 db,因此我必須將客戶端密鑰保留在 .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 檔案中的二進制值
.
我使用 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 無法使用堆疊連接到資料庫:
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
Any idea how I should read binary files ( like .DER cert ) from GCP SM ? I read that should be encoded, but i have had no success until now.
Thanks for advance and please be gentle, its my first post :)
uj5u.com熱心網友回復:
根據約翰的評論,我在秘密管理器中保存了編碼的 .DER 檔案。接下來,我從秘密管理器 API 中解碼了值。在這種情況下重要的事情 - 將位元組 [] 而不是字串保存到檔案中!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457763.html
標籤:database spring-boot ssl google-cloud-platform
