Parece realmente extraño que OpenSSL deje esto al código de llamada.
Sí, es una omisión muy problemática en la práctica porque muchas aplicaciones no se dan cuenta de que deben realizar el cheque manualmente.
OpenSSL 1.1.0 incluirá la verificación de nombre de host (en HEAD
ahora (a partir de SEPT 2013)). De acuerdo con los registros de cambios, hay una opción -verify_name
y apps.c
responde al interruptor -verify_hostname
. Pero s_client
no responde a ninguno de los conmutadores, por lo que no está claro cómo se implementará o invocará la verificación del nombre de host para un cliente.
Si el campo de la extensión subjectAlternativeName
dnsName
está presente, establecer el nombre a ese valor.
Puede haber varios nombres alternativos del sujeto (SAN), así que prepárese para más de uno.
De lo contrario, establezca el nombre en el campo CN del asunto.
Creo que también necesita comprobarlo para encontrar una coincidencia.
Compare nombre contra el nombre de host solicitado, permitiendo que cada asterisco para que coincida con [A-Za-z0-9 _] +, pero no 'punto' (.).
Es mucho más doloroso. También debe asegurarse de no coincidir con un gTLD o ccTLD. Por ejemplo, no desea hacer coincidir un certificado emitido con el gTLD *.com
. Ese certificado probablemente fue emitido por un tipo malo;)
ccTLDs son como * .eu, * .us o இலங்கை (nic.lk). Hay aproximadamente 5000 de ellos y Mozilla ofrece una lista al http://publicsuffix.org/. La lista sin formato está en https://mxr.mozilla.org/mozilla-central/source/netwerk/dns/effective_tld_names.dat?raw=1.
Me parece que debe haber un montón de código dando vueltas a hacer esto, pero no he encontrado ninguna.
Además de la sugerencia de van Gulik, también puedes probar Curl. Estoy bastante seguro de que Curl contiene código de coincidencia de nombre de host.
Incluso puede verificar que los certificados estén bien formados. El grupo responsable en el contexto de la Web son los foros CA/Browser. Tienen requisitos básicos y ampliados para la creación de certificados:
En los documentos de referencia, se encuentra, por ejemplo, un IP listado como el Nombre común (CN) también se debe enumerar en los Nombres alternativos del sujeto (SAN).
En los documentos extendidos, encontrará que las direcciones IP reservadas (RFC 1918) no pueden estar presentes en un certificado de validación extendida (EV); y los certificados EV no pueden contener comodines.
En lugar de "establecer" el valor en función de lo que encuentre en el certificado, debe hacerlo al revés: verifique si lo que espera tiene una entrada SAN DNS coincidente. Esto se debe a que puede haber múltiples entradas DNS en la extensión SAN. (Hay reglas más precisas sobre la coincidencia de comodines en RFC 6125 ahora, por cierto). – Bruno