簡體   English   中英

從 GCP 秘密管理器讀取.DER 值並將其保存到.DER 文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM