Как преобразовать строку сертификата pcks12, которая была взята из хранилища ключей azure в контейнере docker, в формат pem?

#docker #ssl #x509certificate #azure-keyvault #pkcs#12

#docker #ssl #x509certificate #azure-keyvault #pkcs #12

Вопрос:

Я использую для получения сертификата в контейнере docker через управляемую идентификацию, как описано в документах Microsoft здесь (пример 1): https://learn.microsoft.com/en-us/azure/container-instances/container-instances-managed-identity#example-1-use-a-user-assigned-identity-to-access-azure-key-vault

Когда это был сертификат в формате вывода команды в формате pem:

 curl https://mykeyvault.vault.azure.net/secrets/SampleSecret/?api-version=2016-10-01 -H "Authorization: Bearer $token"
  

Было похоже:

{«значение»:»——НАЧАТЬ ПРИВАТНЫЙ KEY——nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBkelEEzvwXiaWnX4sPt052w/5tahn6OAy lasH4Lq1xvU/G z9Ra0rBs2NGhPr7smu8iAxACfr74I5nCHENM4kvmM{ слишком много символов}KkrjDMmf5Omn——КОНЕЧНЫЙ ЗАКРЫТЫЙ КЛЮЧ ——n ——НАЧАЛЬНЫЙ СЕРТИФИКАТ —— nMIIDMDCCAhigAw {слишком много символов}4GMgUQ==n —— КОНЕЧНЫЙ СЕРТИФИКАТ —— n»,»ContentType»:»application / x-pem-file»,»id»:»myid», «управляемый»:true,»attributes»:{«enabled»:true,»nbf»:1600276258,»exp»:1631812858,»created»:1600276858,»updated»:1600276858,»recoveryLevel»:»Recoverable Purgeable»},»kid»:»https://cert_url»}

И легко преобразовать ее в файлы cert.pem и private_key.pem.

Но если это формат pcks12, вывод будет выглядеть как одна строка:

{«значение»: «miikpaibazcccfwgcsqsqsib3dqehaaccce0eggnpmiij5tccbhygcsqgsib3dqeha{только много symbols}8O3VaP5TOUaZMQ=»,»contentType»:»application/x-pkcs12″,»id»:»myid»,»managed»:true,»attributes»:{«enabled»:true,»nbf»:1600275456,»exp»:1631812056,»created»:1600276056,»updated»:1600276056,»recoveryLevel»:»Recoverable Purgeable»},»kid»:»https://cert_url»}

Поэтому я не могу преобразовать эту строку в файлы cert.pem и private_key.pem, как было описано выше.

Я ввел в файл значение cert.cer через:

 curl https://testigorcert.vault.azure.net/secrets/SampleSecret/?api-version=2016-10-01 -H "Authorization: Bearer $token" | jq '.value' > cert.cer
  

И попробовал команду типа:

 openssl pkcs12 -in cert.cer -out cert.pem -nodes
  

Ошибка:

139876006393152: ошибка: 0D0680A8: процедуры кодирования asn1:asn1_check_tlen: неверный тег: ../crypto/asn1/tasn_dec.c: 1130: 139876006393152: ошибка: 0D07803A: процедуры кодирования asn1:asn1_item_embed_d2i :вложенная ошибка asn1:../crypto/asn1/tasn_dec.c:290:Тип=PKCS12

Пробовал:

 openssl pkcs12 -in cert.cer -nocerts -nodes -out key.pem
  

Ошибка:

140021099644224: ошибка: 0D0680A8: процедуры кодирования asn1: asn1_check_tlen: неверный тег: ../crypto/asn1/tasn_dec.c: 1130: 140021099644224: ошибка: 0D07803A: процедуры кодирования asn1:asn1_item_embed_d2i :вложенная ошибка asn1:../crypto/asn1/tasn_dec.c:290:Тип=PKCS12

Пробовал:

 openssl x509 -in cert.cer -text
  

Ошибка:

139665046693184: ошибка: 0909006C: Процедуры PEM: get_name: отсутствует начальная строка: ../crypto/pem/pem_lib.c: 745: Ожидание: ДОВЕРЕННЫЙ СЕРТИФИКАТ

Итак. Как я могу преобразовать это значение формата сертификата pkcs12 в два файла cert.pem и private_key.pem?

Ответ №1:

Проблема заключалась в кодировке загруженной строки, потому что curl получает строку .pfx, НО в кодировке ascii (должна быть в base64). Поэтому я просто использую другой способ (пример 2): https://learn.microsoft.com/en-us/azure/container-instances/container-instances-managed-identity#example-2-use-a-system-assigned-identity-to-access-azure-key-vault

Где я просто загружаю certificate .pfx с помощью команды:

 az keyvault secret download --file cert.pfx --name {cert_name} --vault-name {vault_name} -e base64
  

А затем преобразовать в два необходимых файла с помощью:

 openssl pkcs12 -in cert.pfx -nocerts -out key.rsa -nodes -passin pass:
openssl pkcs12 -in cert.pfx -clcerts -nokeys -out cert.crt -passin pass:
  

Ответ №2:

Это еще один (лучший) вариант преобразования сертификата в формат base 64 с помощью соответствующей команды, например:

 token=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01amp;resource=https://vault.azure.net' -H Metadata:true | jq -r '.access_token')

curl https://myvault.vault.azure.net/secrets/mycert/?api-version=2016-10-01 -H "Authorization: Bearer $token" | 
jq -r ".value" | base64 -d | openssl pkcs12 -nocerts -out /etc/ssl/private-key.pem -nodes -passin pass:

curl https://myvault.vault.azure.net/secrets/mycert/?api-version=2016-10-01 -H "Authorization: Bearer $token" | 
jq -r ".value" | base64 -d | openssl pkcs12 -clcerts -nokeys -out /etc/ssl/cert.pem -passin pass: