if (set->ssl_mode != IMAPC_CLIENT_SSL_MODE_NONE) {
client->set.ssl_mode = set->ssl_mode;
client->set.ssl_ca_dir = p_strdup(pool, set->ssl_ca_dir);
+ client->set.ssl_verify = set->ssl_verify;
memset(&ssl_set, 0, sizeof(ssl_set));
ssl_set.ca_dir = set->ssl_ca_dir;
- ssl_set.verify_remote_cert = TRUE;
+ ssl_set.verify_remote_cert = set->ssl_verify;
source = t_strdup_printf("%s:%u", set->host, set->port);
if (ssl_iostream_context_init_client(source, &ssl_set,
enum imapc_client_ssl_mode ssl_mode;
const char *ssl_ca_dir;
+ bool ssl_verify;
const char *rawlog_dir;
bool debug;
{
struct imapc_connection *conn = context;
- if (!ssl_iostream_has_valid_client_cert(conn->ssl_iostream)) {
+ if (!conn->client->set.ssl_verify) {
+ /* skip certificate checks */
+ return 0;
+ } else if (!ssl_iostream_has_valid_client_cert(conn->ssl_iostream)) {
if (!ssl_iostream_has_broken_client_cert(conn->ssl_iostream)) {
i_error("imapc(%s): SSL certificate not received",
conn->name);
}
memset(&ssl_set, 0, sizeof(ssl_set));
- ssl_set.verbose_invalid_cert = TRUE;
- ssl_set.verify_remote_cert = TRUE;
- ssl_set.require_valid_cert = TRUE;
+ if (conn->client->set.ssl_verify) {
+ ssl_set.verbose_invalid_cert = TRUE;
+ ssl_set.verify_remote_cert = TRUE;
+ ssl_set.require_valid_cert = TRUE;
+ }
if (conn->client->set.debug)
i_debug("imapc(%s): Starting SSL handshake", conn->name);
DEF(SET_ENUM, imapc_ssl),
DEF(SET_STR, imapc_ssl_ca_dir),
+ DEF(SET_BOOL, imapc_ssl_verify),
DEF(SET_STR, imapc_rawlog_dir),
.imapc_ssl = "no:imaps:starttls",
.imapc_ssl_ca_dir = "",
+ .imapc_ssl_verify = TRUE,
.imapc_rawlog_dir = ""
};
const char *imapc_ssl;
const char *imapc_ssl_ca_dir;
+ bool imapc_ssl_verify;
const char *imapc_rawlog_dir;
};
set.temp_path_prefix = str_c(str);
set.ssl_ca_dir = storage->set->imapc_ssl_ca_dir;
+ set.ssl_verify = storage->set->imapc_ssl_verify;
if (strcmp(storage->set->imapc_ssl, "imaps") == 0)
set.ssl_mode = IMAPC_CLIENT_SSL_MODE_IMMEDIATE;
else if (strcmp(storage->set->imapc_ssl, "starttls") == 0)