我不明白如何将 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 签名库一起使用?
我怀疑您无法直接使用 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 签名实现此目的,您将:
asymmetricSign
方法对摘要进行签名。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 的远程调用:根据您的使用案例,性能可能会受到影响。