El paquete crypto/x509 de Go rechaza como 'certificado firmado por una autoridad desconocida' ciertos certificados raíz X.509 que OpenSSL acepta sin objeciones, aunque ambos produzcan la misma representación textual y solo se diferencien en dos bytes del binario DER. La causa es una sutileza del formato ASN.1, el lenguaje en el que se definen los certificados X.509 y que se codifica en binario mediante las reglas DER.
En ASN.1, cada dato lleva un byte de etiqueta (tag) que identifica su tipo. Los certificados X.509 utilizan UTF8String para nombres como el 'Common Name' del emisor y del sujeto. Go exige que esa etiqueta sea la específica 0x0c (UTF8String). En cambio, la etiqueta 0x13 corresponde a PrintableString, otro tipo ASN.1 de cadenas, que también es válido según la propia especificación X.509. En los certificados analizados, el nombre 'Root CA' se codifica con 0x13 en la CA que Go rechaza y con 0x0c en la que verifica con éxito. OpenSSL, al igual que la mayoría de las librerías, trata ambas codificaciones como equivalentes.
La diferencia se manifiesta en dos puntos de la codificación ASN.1: el emisor y el sujeto. La representación textual en OpenSSL es idéntica porque muestra el valor decodificado, pero la huella binaria difiere en esos dos bytes de etiqueta. El autor concluye que se trata de una peculiaridad del verificador de Go, no de un certificado mal formado.
