es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Teniendo un problema convirtiendo PFX a Pem.

Estoy intentando convertir un archivo PFX a PEM sin éxito debido a este error:

pkcs12: error leyendo datos P12: error de sintaxis: se encontró longitud indefinida (no DER)

Al buscar en línea, se indica que se debe codificar BER a DER y luego ToPEM no arrojará este error molesto. No pude encontrar ninguna solución en absoluto.

El archivo pfx está codificado con base64 y decodificado a []byte, lo cual no debería afectar el error en ningún caso.

No tengo ninguna opción para cambiar el archivo pfx que se inserta en esta variable config.ClusterCertificate.

El código:

blocks, err := pkcs12.ToPEM(config.ClusterCertificate, "")
    if err != nil {
        return nil, err
    }
    var pemData []byte
    for _, b := range blocks {
        pemData = append(pemData, pem.EncodeToMemory(b)...)
    }

    // luego use los datos PEM para construir el certificado TLS:
    cert, err := tls.X509KeyPair(pemData, pemData)
    if err != nil {
        return nil, err
    }

    config := &tls.Config{
        Certificates: []tls.Certificate{cert},
    }

    _ = config

    x509cert, err := x509.ParseCertificate(cert.Certificate[0])
    if err != nil {
        return nil, err
    }
    store.TrustStore = x509cert
    store.Certificate = &cert

pfx

certutil dump

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para convertir PFX a PEM

    El error de asn1: error de sintaxis: se encontró longitud indefinida (no DER) al convertir PFX a PEM se puede resolver codificando BER a DER antes de convertirlo a PEM.

    El siguiente código se puede utilizar para convertir el archivo PFX a PEM sin el error anterior.

    pfxData, err := ioutil.ReadFile("archivo.pfx")
    if err != nil {
        log.Fatal(err)
    }
    
    blocks, err := pkcs12.ToPEM(pfxData, "")
    if err != nil {
        // Verificar si el error se debe a que se encontró una longitud indefinida (no DER) y tratar de codificar BER a DER
        if strings.Contains(err.Error(), "asn1: error de sintaxis: se encontró longitud indefinida (no DER)") {
            p12Encoded, err := base64.StdEncoding.DecodeString(string(pfxData))
            if err != nil {
                log.Fatal(err)
            }
            p12, err := pkcs12.Parse(p12Encoded, "")
            if err != nil {
                log.Fatal(err)
            }
            // Codificar BER a DER
            pfxData, err = pkcs12.Encode(p12.PKCS12, p12.Certificates, p12.PrivateKey, "")
            if err != nil {
                log.Fatal(err)
            }
            blocks, err = pkcs12.ToPEM(pfxData, "")
            if err != nil {
                log.Fatal(err)
            }
        } else {
            log.Fatal(err)
        }
    }
    
    var pemData []byte
    for _, b := range blocks {
        pemData = append(pemData, pem.EncodeToMemory(b)...)
    }
    
    // Usar los datos PEM para construir el certificado TLS:
    cert, err := tls.X509KeyPair(pemData, pemData)
    if err != nil {
        log.Fatal(err)
    }
    
    x509cert, err := x509.ParseCertificate(cert.Certificate[0])
    if err != nil {
        log.Fatal(err)
    }
    
    store.TrustStore = x509cert
    store.Certificate = &cert
    

    En el código anterior, primero intentamos convertir el archivo PFX a PEM utilizando pkcs12.ToPEM. Si falla con el error anterior, luego decodificamos el archivo PFX de base64 y lo analizamos utilizando pkcs12.Parse. Luego codificamos BER a DER utilizando pkcs12.Encode e intentamos convertirlo a PEM nuevamente utilizando pkcs12.ToPEM.

    Si hay algún otro error durante la conversión a PEM, registramos el error y salimos.

    Por último, analizamos el certificado utilizando x509.ParseCertificate y establecemos las variables TrustStore y Certificate.

Comments are closed.