GCP中的密钥管理,用于存储客户端tls证书的私钥



我们最近决定尝试在GCP中使用KMS(密钥管理(来存储组织拥有的私钥。

当我试图将私钥和密码转移到密钥管理时,我偶然发现了一个问题,因为它们是.p12的一部分,我们在密钥存储中使用它来与外部第三方提供商通信。

val pkcs12KeyStore = KeyStore.getInstance("PKCS12")
.apply { load(ByteArrayInputStream(certificateContent), certPassword.toCharArray()) }
val pkcs12KeyManager = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm())
.apply { init(pkcs12KeyStore, certPassword.toCharArray()) }
val sslContext = SslContextBuilder
.forClient()
.keyManager(pkcs12KeyManager)
.build()

是我们在访问应用程序中的私钥和密码时所做的操作。当私钥在GCP的密钥管理中时,有没有办法实现这一点?

首先让我告诉您,除非它们是向后兼容性所必需的,否则GCP不建议使用"P12"服务帐户密钥。另一方面,你需要做的是:

1.-下载".p12"密钥(a(并转换为"pem"。

a(

$ gcloud iam service-accounts keys create svc_account.p12 
--iam-account=$SERVICE_ACCOUNT_EMAIL 
--key-file-type=p12

b(

$ openssl pkcs12 -in svc_account.p12  
-nocerts -nodes 
-passin pass:notasecret | openssl rsa -out privkey.pem`

2.-创建ImportJob。

export IMPORT_JOB=saimporter
export VERSION=1
$ gcloud beta kms import-jobs create $IMPORT_JOB 
--location $LOCATION 
--keyring $KEYRING_NAME 
--import-method rsa-oaep-3072-sha1-aes-256 
--protection-level hsm
$ gcloud kms import-jobs describe $IMPORT_JOB 
--location $LOCATION 
--keyring $KEYRING_NAME

3.-格式化".pem"键以进行导入。

$ openssl pkcs8 -topk8 -nocrypt -inform PEM 
-outform DER     -in privkey.pem  
-out formatted.pem

4.-通过importJob,将格式化的密钥导入KMS。

$ gcloud kms keys create $KEY_NAME 
--keyring=$KEYRING_NAME --purpose=asymmetric-signing 
--default-algorithm=rsa-sign-pkcs1-2048-sha256 
--skip-initial-version-creation --location=$LOCATION 
--protection-level=hsm
$ gcloud kms keys versions import   
--import-job $IMPORT_JOB   --location $LOCATION  
--keyring $KEYRING_NAME   --key $KEY_NAME   
--algorithm rsa-sign-pkcs1-2048-sha256  
--target-key-file formatted.pem

5.-然后".p12"one_answers".pem"文件应该从磁盘中删除文件。

作为参考,您可以使用以下关于您的特定情况的信息将服务帐户私钥导入KMS(SA->KMS(。此外,这个官方GCP的信息对您现在和将来创建服务帐户密钥都很有用。最后,对于Google Auth库,GCP获得的Google Auth选项以及如何处理它们Interface GoogleAuthOptions。

最新更新