mirror of
https://github.com/irssi/irssi.git
synced 2025-02-02 15:08:01 -05:00
Check whether the client certificate is expired.
Right now we only warn the user, the connection keeps going. Fixes #211
This commit is contained in:
parent
228f487a69
commit
697dd19d88
@ -420,16 +420,38 @@ static GIOChannel *irssi_ssl_get_iochannel(GIOChannel *handle, int port, SERVER_
|
|||||||
|
|
||||||
if (mycert && *mycert) {
|
if (mycert && *mycert) {
|
||||||
char *scert = NULL, *spkey = NULL;
|
char *scert = NULL, *spkey = NULL;
|
||||||
|
FILE *fp;
|
||||||
scert = convert_home(mycert);
|
scert = convert_home(mycert);
|
||||||
if (mypkey && *mypkey)
|
if (mypkey && *mypkey)
|
||||||
spkey = convert_home(mypkey);
|
spkey = convert_home(mypkey);
|
||||||
|
|
||||||
|
if ((fp = fopen(scert, "r"))) {
|
||||||
|
X509 *cert;
|
||||||
|
/* Let's parse the certificate by hand instead of using
|
||||||
|
* SSL_CTX_use_certificate_file so that we can validate
|
||||||
|
* some parts of it. */
|
||||||
|
cert = PEM_read_X509(fp, NULL, get_pem_password_callback, (void *)mypass);
|
||||||
|
if (cert != NULL) {
|
||||||
|
/* Only the expiration date is checked right now */
|
||||||
|
if (X509_cmp_current_time(X509_get_notAfter(cert)) <= 0 ||
|
||||||
|
X509_cmp_current_time(X509_get_notBefore(cert)) >= 0)
|
||||||
|
g_warning("The client certificate is expired");
|
||||||
|
|
||||||
ERR_clear_error();
|
ERR_clear_error();
|
||||||
if (! SSL_CTX_use_certificate_file(ctx, scert, SSL_FILETYPE_PEM))
|
if (! SSL_CTX_use_certificate(ctx, cert))
|
||||||
g_warning("Loading of client certificate '%s' failed: %s", mycert, ERR_reason_error_string(ERR_get_error()));
|
g_warning("Loading of client certificate '%s' failed: %s", mycert, ERR_reason_error_string(ERR_get_error()));
|
||||||
else if (! SSL_CTX_use_PrivateKey_file(ctx, spkey ? spkey : scert, SSL_FILETYPE_PEM))
|
else if (! SSL_CTX_use_PrivateKey_file(ctx, spkey ? spkey : scert, SSL_FILETYPE_PEM))
|
||||||
g_warning("Loading of private key '%s' failed: %s", mypkey ? mypkey : mycert, ERR_reason_error_string(ERR_get_error()));
|
g_warning("Loading of private key '%s' failed: %s", mypkey ? mypkey : mycert, ERR_reason_error_string(ERR_get_error()));
|
||||||
else if (! SSL_CTX_check_private_key(ctx))
|
else if (! SSL_CTX_check_private_key(ctx))
|
||||||
g_warning("Private key does not match the certificate");
|
g_warning("Private key does not match the certificate");
|
||||||
|
|
||||||
|
X509_free(cert);
|
||||||
|
} else
|
||||||
|
g_warning("Loading of client certificate '%s' failed: %s", mycert, ERR_reason_error_string(ERR_get_error()));
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
} else
|
||||||
|
g_warning("Could not find client certificate '%s'", scert);
|
||||||
g_free(scert);
|
g_free(scert);
|
||||||
g_free(spkey);
|
g_free(spkey);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user