#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: