使用Azure Key Vault中PFX证书通过Azure CLI创建K8s TLS Secret失败排查
问题:Azure Key Vault下载PFX证书后OpenSSL转换报ASN1编码错误,无法创建K8s TLS Secret
我尝试通过Azure CLI从Azure Key Vault获取PFX证书,以此创建包含证书和密钥的K8s TLS Secret,但操作失败。执行脚本时OpenSSL转换PFX文件出现ASN1编码错误,报错信息如下:
139728379422608:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1239: 139728379422608:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:405:Type=PKCS12
我的脚本如下:
cert_key=cert.key cert_pem=cert.pem cert_pfx=cert.pfx keyvault_name=akv_name cert_name=akv_cert_name secret_name=cert_pw_secret #Get the password of the pfx certificate secret_value=$(az keyvault secret show --name $secret_name --vault-name $keyvault_name -o tsv --query value) #Download the secret az keyvault secret download --file $cert_key --name $cert_name --vault-name $keyvault_name #Download the public part of the certificate az keyvault certificate download --file $cert_pfx --name $cert_name --vault-name $keyvault_name #Convert pfx to pem using openssl #This will return an error: #139728379422608:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1239: #139728379422608:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:405:Type=PKCS12 openssl pkcs12 -in $cert_pfx -clcerts -nokeys -out $cert_pem -password pass:$secret_value #Convert pfx to key using openssl #This will return an error: #140546015532944:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1239: #140546015532944:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:405:Type=PKCS12 openssl pkcs12 -in $cert_pfx -nocerts -out $cert_key -password pass:$secret_value #Create the k8s secret kubectl create secret tls secret-ssl --cert=$cert_pem --key=$cert_key
问题原因
- 错误的PFX文件来源:你使用
az keyvault certificate download下载的并不是完整的PFX证书,这个命令默认仅下载证书的公钥部分(PEM格式),但你将其保存为.pfx后缀,导致OpenSSL错误地将PEM格式文件当作PKCS12格式解析,从而触发ASN1编码错误。 - 冗余且冲突的步骤:你先通过
az keyvault secret download将密钥保存到cert.key,后续又用OpenSSL转换命令覆盖了这个文件,同时完全没用到完整的PFX证书(包含公钥+私钥)。
修正后的脚本
Azure Key Vault中,包含公钥和私钥的完整PFX证书是以Secret形式存储的,正确的获取方式是通过az keyvault secret download下载:
cert_key=cert.key cert_pem=cert.pem cert_pfx=cert.pfx keyvault_name=akv_name cert_name=akv_cert_name secret_name=cert_pw_secret # 获取PFX证书的密码 secret_value=$(az keyvault secret show --name $secret_name --vault-name $keyvault_name -o tsv --query value) # 下载完整的PFX证书(包含公钥+私钥,从Secret中获取,指定base64解码) az keyvault secret download --file $cert_pfx --name $cert_name --vault-name $keyvault_name --encoding base64 # 从PFX提取公钥PEM openssl pkcs12 -in $cert_pfx -clcerts -nokeys -out $cert_pem -password pass:$secret_value # 从PFX提取私钥PEM(-nodes参数避免私钥被额外加密,确保K8s可直接使用) openssl pkcs12 -in $cert_pfx -nocerts -out $cert_key -password pass:$secret_value -nodes # 创建K8s TLS Secret kubectl create secret tls secret-ssl --cert=$cert_pem --key=$cert_key
内容的提问来源于stack exchange,提问作者mangawy
相关产品推荐
相关产品推荐

