在 java/kotlin 中使用 google-cloud-kms 进行 xml 签名

问题描述 投票:0回答:1

我不明白如何将 java 中内置的 xml 签名库与 google kms 一起使用。我在 google kms 中有我的 pub/私钥。

我在没有谷歌公里的情况下执行以下操作:

val keyPair = getKeyPair() //get the keypair from my local file system
val dsc = DOMSignContext(keyPair.private, w3cDoc.documentElement.getElementsByTagName("MY_ELEMENT_TO_INSERT").first())
val xmlSignatureFactory = XMLSignatureFactory.getInstance("DOM")
val xmlSignature = xmlSignatureFactory.newXMLSignature(signedInfo, keyInfo)
xmlSignature.sign(dsc)

如果您注意到我必须给 DOMSignContext 一个私钥。它还需要一个按键选择器,但我们遇到了同样的问题。

我的问题是 google-cloud-kms 不允许获取私钥,似乎我只能使用 keyManagementServiceClient.asymSign 进行加密,这允许我将想要加密的数据传递给 google kms。

我是否不理解某些内容,或者是否无法将 google kms 与 xml 签名库一起使用?

java xml digital-signature private-key google-cloud-kms
1个回答
0
投票

我怀疑您无法直接使用 Google Cloud KMS 中的私钥,就像使用本地密钥对将其与 Java XML 签名库集成一样:Google Cloud KMS 旨在保留私钥... private ,不直接暴露。
相反,您可能需要通过 KMS API 执行加密操作,其中签名操作发生在云中,并且仅返回签名。

这意味着调整您的签名流程以使用 Google Cloud KMS 的

asymmetricSign
方法 进行签名步骤。

Local System                           Google Cloud KMS
     |                                      |
     |---(1) Prepare data to sign --------->|
     |                                      |
     |---(2) Request signature ------------>|
     |                                      |
     |<--(3) Receive signature--------------|
     |                                      |

要通过 XML 签名实现此目的,您将:

  • 生成您要签名的数据的摘要。
  • 使用 Google Cloud KMS 的
    asymmetricSign
    方法对摘要进行签名。
  • 将收到的签名插回到您的 XML 文档中。
import com.google.cloud.kms.v1.KeyManagementServiceClient
import com.google.cloud.kms.v1.AsymmetricSignRequest
import com.google.cloud.kms.v1.Digest
import com.google.protobuf.ByteString
import java.security.MessageDigest
// Import other necessary libraries

fun signXmlWithKms(w3cDoc: Document) {
    // Assume MY_ELEMENT_TO_INSERT contains the data you want to sign
    val dataToSign = // Extract the data from w3cDoc that needs to be signed
    
    // Convert data to sign to a digest
    val md = MessageDigest.getInstance("SHA-256")
    val digestBytes = md.digest(dataToSign.toByteArray(Charsets.UTF_8))
    
    // Prepare request for Google Cloud KMS
    val digest = Digest.newBuilder().setSha256(ByteString.copyFrom(digestBytes)).build()
    val asymmetricSignRequest = AsymmetricSignRequest.newBuilder()
        .setName("projects/[PROJECT_ID]/locations/[LOCATION]/keyRings/[KEY_RING]/cryptoKeys/[KEY]/cryptoKeyVersions/[VERSION]")
        .setDigest(digest)
        .build()

    // Use KeyManagementServiceClient to sign the digest
    KeyManagementServiceClient.create().use { client ->
        val response = client.asymmetricSign(asymmetricSignRequest)
        val signature = response.signature.toByteArray()
        
        // Insert the signature back into your XML in the appropriate place
        // That part depends on your XML structure and how you intend to include the signature
    }
}

但是:这确实会修改数据签名流程以涉及对 Google Cloud KMS 的远程调用:根据您的使用案例,性能可能会受到影响。

© www.soinside.com 2019 - 2024. All rights reserved.