Как преобразовать p12 в кодировке base64 в tls.Certificate

У меня есть сгенерированный файл base64 .p12 для аутентификации в службе, и мой беспокойный клиент ожидает получить tls.Certificate.

Однако pkcs12.Decode всегда терпит неудачу с «: asn1: синтаксическая ошибка: найдена неопределенная длина (не DER)»

Означает ли это, что мне нужно преобразовать файл .p12 в кодировке base64 в файл в формате der? Или что еще я должен сделать, чтобы отправить сертификат на сервер?

data, _ := ioutil.ReadFile("/PathTo/certificate.p12")

privateKey, certificate, _ := pkcs12.Decode(data, "abc123")//password=abc123

tlsCertificate := tls.Certificate{
    Certificate: [][]byte{cert.Raw},
    PrivateKey:  privateKey,
    Leaf:        cert,
}
//...
resty.SetCertificates(tlsCertificate)

person Sammy    schedule 06.03.2019    source источник
comment
Вы убедились, что файл действительно является контейнером PKCS # 12, а не, скажем, его кодировкой base64 или чем-то еще? Вы можете начать, скажем, с openssl pkcs12 -in yourfile.p12 -noout -info   -  person kostix    schedule 06.03.2019


Ответы (1)


PKCS#12 (также известный как PFX) закодирован в ASN.1 (нотация абстрактного синтаксиса) и использует DER (отличающиеся правила кодирования). ASN.1 записывается как TLV (тип, длина и значение). Значение может быть определенным или как в вашем случае неопределенным, что просто означает, что длина явно не указана. Многие кодировщики и декодеры НЕ поддерживают неопределенные длины. Например, до Windows 10 неопределенная длина не поддерживалась Microsoft Crypto API.

Что делать? Есть несколько вариантов: - Преобразовать PFX (возможно, с помощью openSSL), чтобы получить PKCS#12 с определенной длиной - Попробуйте другую библиотеку для чтения PKCS#12, которая поддерживает неопределенные длины.

person Daniel Fisher lennybacon    schedule 12.05.2019