Estoy usando PHP e intento verificar que un certificado SSL pertenece al dominio SMTP / IP al que me estoy conectando.
Actualmente puedo verificar que el certificado es válido usando el siguiente código
$resource = fsockopen( "tcp://mail.example.com", 25, $errno, $errstr );
...
stream_set_blocking($resource, true);
stream_context_set_option($resource, 'ssl', 'verify_host', true);
stream_context_set_option($resource, 'ssl', 'verify_peer', true);
stream_context_set_option($resource, 'ssl', 'allow_self_signed', false);
stream_context_set_option($resource, 'ssl', 'cafile', __DIR__ . '/cacert.pem');
$secure = stream_socket_enable_crypto($resource, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);
stream_set_blocking($resource, false);
if( ! $secure)
{
die("failed to connect securely\n");
}
Según la documentación parece que debo hacer algo como esto.
stream_context_set_option($resource, 'ssl', 'SNI_enabled', true);
stream_context_set_option($resource, 'ssl', 'SNI_server_name', 'expected.example.com');
¿Cómo verifico que el servidor al que me estoy conectando también tenga un certificado válido para expected.example.com
? ¿Debo hacer un chequeo de rDNS primero? ¿Qué pasa si el DNS fue alterado por un ataque MITM?