Strictly check if the server certificate matches the TLS server identity
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
#include "tls_peer.h"
|
#include "tls_peer.h"
|
||||||
|
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
#include <credentials/certificates/x509.h>
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
@@ -152,6 +153,42 @@ static status_t process_server_hello(private_tls_peer_t *this,
|
|||||||
return NEED_MORE;
|
return NEED_MORE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a server certificate is acceptable for the given server identity
|
||||||
|
*/
|
||||||
|
static bool check_certificate(private_tls_peer_t *this, certificate_t *cert)
|
||||||
|
{
|
||||||
|
identification_t *id;
|
||||||
|
|
||||||
|
if (cert->has_subject(cert, this->server))
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
id = cert->get_subject(cert);
|
||||||
|
if (id->matches(id, this->server))
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if (cert->get_type(cert) == CERT_X509)
|
||||||
|
{
|
||||||
|
x509_t *x509 = (x509_t*)cert;
|
||||||
|
enumerator_t *enumerator;
|
||||||
|
|
||||||
|
enumerator = x509->create_subjectAltName_enumerator(x509);
|
||||||
|
while (enumerator->enumerate(enumerator, &id))
|
||||||
|
{
|
||||||
|
if (id->matches(id, this->server))
|
||||||
|
{
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
|
}
|
||||||
|
DBG1(DBG_TLS, "server certificate does not match to '%Y'", this->server);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process a Certificate message
|
* Process a Certificate message
|
||||||
*/
|
*/
|
||||||
@@ -188,6 +225,13 @@ static status_t process_certificate(private_tls_peer_t *this,
|
|||||||
{
|
{
|
||||||
if (first)
|
if (first)
|
||||||
{
|
{
|
||||||
|
if (!check_certificate(this, cert))
|
||||||
|
{
|
||||||
|
cert->destroy(cert);
|
||||||
|
certs->destroy(certs);
|
||||||
|
this->alert->add(this->alert, TLS_FATAL, TLS_ACCESS_DENIED);
|
||||||
|
return NEED_MORE;
|
||||||
|
}
|
||||||
this->server_auth->add(this->server_auth,
|
this->server_auth->add(this->server_auth,
|
||||||
AUTH_HELPER_SUBJECT_CERT, cert);
|
AUTH_HELPER_SUBJECT_CERT, cert);
|
||||||
DBG1(DBG_TLS, "received TLS server certificate '%Y'",
|
DBG1(DBG_TLS, "received TLS server certificate '%Y'",
|
||||||
|
|||||||
Reference in New Issue
Block a user