Sto utilizzando PHP e sto provando a verificare che un certificato SSL appartenga al dominio / IP SMTP a cui mi sto collegando.
Attualmente posso verificare che il certificato sia valido utilizzando il seguente codice
$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");
}
In base alla documentazione sembra che devo fare qualcosa di simile.
stream_context_set_option($resource, 'ssl', 'SNI_enabled', true);
stream_context_set_option($resource, 'ssl', 'SNI_server_name', 'expected.example.com');
Come faccio a verificare che il server che sto collegando abbia un certificato valido per expected.example.com
? Devo prima fare un controllo rDNS? Cosa succede se il DNS è stato alterato da un attacco MITM?