diff --git a/src/sbbs3/ssl.c b/src/sbbs3/ssl.c
index 1eafacdd43dce000ced287717ad28aac70b33d72..e6b81825eeee3cb96702ee9d456e0c5beea5c213 100644
--- a/src/sbbs3/ssl.c
+++ b/src/sbbs3/ssl.c
@@ -558,6 +558,7 @@ int destroy_session(int (*lprintf)(int level, const char* fmt, ...), CRYPT_SESSI
 	struct cert_list *psess = NULL;
 	int ret = CRYPT_ERROR_NOTFOUND;
 
+	lock_ssl_cert();
 	pthread_mutex_lock(&ssl_cert_list_mutex);
 	sess = sess_list;
 	while (sess != NULL) {
@@ -568,16 +569,13 @@ int destroy_session(int (*lprintf)(int level, const char* fmt, ...), CRYPT_SESSI
 			else {
 				psess->next = sess->next;
 			}
-			lock_ssl_cert();
 			if (sess->epoch == cert_epoch) {
-				unlock_ssl_cert(lprintf);
 				sess->sess = -1;
 				sess->next = cert_list;
 				cert_list = sess;
 				ret = cryptDestroySession(csess);
 			}
 			else {
-				unlock_ssl_cert(lprintf);
 				// TODO: Failure here isn't logged
 				cryptDestroyContext(sess->cert);
 				free(sess);
@@ -589,6 +587,7 @@ int destroy_session(int (*lprintf)(int level, const char* fmt, ...), CRYPT_SESSI
 		sess = sess->next;
 	}
 	pthread_mutex_unlock(&ssl_cert_list_mutex);
+	unlock_ssl_cert(lprintf);
 	if (ret == CRYPT_ERROR_NOTFOUND)
 		ret = cryptDestroySession(csess);
 	return ret;