为何Terraform输出的certificate_data_base64与PFX文件base64值不同?
我通过以下Terraform代码在Azure密钥保管库中创建自签名证书:
resource "azurerm_key_vault_certificate" "kvtcert" { name = "self-signed-${var.app_name}" key_vault_id = var.vault_id certificate_policy { issuer_parameters { name = "Self" } key_properties { exportable = true key_size = 2048 key_type = "RSA" reuse_key = true } lifetime_action { action { action_type = "AutoRenew" } trigger { days_before_expiry = 30 } } secret_properties { content_type = "application/x-pkcs12" } x509_certificate_properties { extended_key_usage = [ "1.3.6.1.5.5.7.3.1", "1.3.6.1.5.5.7.3.2", ] key_usage = [ "cRLSign", "dataEncipherment", "digitalSignature", "keyAgreement", "keyCertSign", "keyEncipherment", ] subject_alternative_names { dns_names = [ var.certificate_domain ] } subject = "CN=${var.certificate_domain}" validity_in_months = 36 } } }
输出azurerm_key_vault_certificate.kvtcert.certificate_data_base64的值时,结果较短,结尾为=。
随后我从密钥保管库下载该证书的PFX文件,运行以下Terraform代码输出其Base64值:
output "XXX" { value = filebase64("${path.root}/../self_signed_certificate/self-signed.pfx") }
得到的Base64值更长,结尾为==。
请问这两个Base64值为何存在差异?
这两个Base64值的差异核心在于它们编码的原始内容完全不同,具体原因如下:
编码内容的范围不同:
certificate_data_base64输出的是仅X.509证书本身(DER二进制格式)的Base64编码,只包含公钥证书的信息;而你下载的PFX文件是PKCS#12格式的容器,里面不仅包含证书,还包含对应的私钥(因为你设置了exportable = true),部分场景下还可能包含证书链,内容体量更大,所以Base64编码后的结果自然更长。格式本身的差异:
DER是证书的原始二进制格式,结构紧凑;而PKCS#12(PFX)是用于存储加密密钥和证书的容器格式,会额外包含加密、封装的元数据,即使没有设置密码保护,其体积也会比单独的证书文件大很多。Base64填充符的差异:
结尾的=或==是Base64编码的填充符号,用于确保编码后的字符串长度是4的倍数。原始二进制数据长度除以3的余数为1时,需要1个填充符=;余数为2时,需要2个填充符==。这只是编码规则的正常表现,和内容本身的差异没有直接关联。
内容的提问来源于stack exchange,提问作者Alexey Auslender

