You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ssl_util.c 26KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114
  1. /*-
  2. * Copyright 2016 Vsevolod Stakhov
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include "config.h"
  17. #include "libutil/util.h"
  18. #include "libutil/hash.h"
  19. #include "libserver/logger.h"
  20. #include "libserver/cfg_file.h"
  21. #include "ssl_util.h"
  22. #include "unix-std.h"
  23. #include "cryptobox.h"
  24. #include "contrib/libottery/ottery.h"
  25. #include <openssl/ssl.h>
  26. #include <openssl/err.h>
  27. #include <openssl/rand.h>
  28. #include <openssl/conf.h>
  29. #include <openssl/evp.h>
  30. #include <openssl/engine.h>
  31. #include <openssl/x509v3.h>
  32. enum rspamd_ssl_state {
  33. ssl_conn_reset = 0,
  34. ssl_conn_init,
  35. ssl_conn_connected,
  36. ssl_next_read,
  37. ssl_next_write,
  38. ssl_next_shutdown,
  39. };
  40. enum rspamd_ssl_shutdown {
  41. ssl_shut_default = 0,
  42. ssl_shut_unclean,
  43. };
  44. struct rspamd_ssl_ctx {
  45. SSL_CTX *s;
  46. rspamd_lru_hash_t *sessions;
  47. };
  48. struct rspamd_ssl_connection {
  49. gint fd;
  50. enum rspamd_ssl_state state;
  51. enum rspamd_ssl_shutdown shut;
  52. gboolean verify_peer;
  53. SSL *ssl;
  54. struct rspamd_ssl_ctx *ssl_ctx;
  55. gchar *hostname;
  56. struct rspamd_io_ev *ev;
  57. struct rspamd_io_ev *shut_ev;
  58. struct ev_loop *event_loop;
  59. rspamd_ssl_handler_t handler;
  60. rspamd_ssl_error_handler_t err_handler;
  61. gpointer handler_data;
  62. gchar log_tag[8];
  63. };
  64. #define msg_debug_ssl(...) rspamd_conditional_debug_fast (NULL, NULL, \
  65. rspamd_ssl_log_id, "ssl", conn->log_tag, \
  66. G_STRFUNC, \
  67. __VA_ARGS__)
  68. static void rspamd_ssl_event_handler (gint fd, short what, gpointer ud);
  69. INIT_LOG_MODULE(ssl)
  70. static GQuark
  71. rspamd_ssl_quark (void)
  72. {
  73. return g_quark_from_static_string ("rspamd-ssl");
  74. }
  75. #if (OPENSSL_VERSION_NUMBER >= 0x10100000L) && !defined(LIBRESSL_VERSION_NUMBER)
  76. #ifndef X509_get_notBefore
  77. #define X509_get_notBefore(x) X509_get0_notBefore(x)
  78. #endif
  79. #ifndef X509_get_notAfter
  80. #define X509_get_notAfter(x) X509_get0_notAfter(x)
  81. #endif
  82. #ifndef ASN1_STRING_data
  83. #define ASN1_STRING_data(x) ASN1_STRING_get0_data(x)
  84. #endif
  85. #endif
  86. /* $OpenBSD: tls_verify.c,v 1.14 2015/09/29 10:17:04 deraadt Exp $ */
  87. /*
  88. * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org>
  89. *
  90. * Permission to use, copy, modify, and distribute this software for any
  91. * purpose with or without fee is hereby granted, provided that the above
  92. * copyright notice and this permission notice appear in all copies.
  93. *
  94. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  95. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  96. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  97. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  98. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  99. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  100. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  101. */
  102. static gboolean
  103. rspamd_tls_match_name (const char *cert_name, const char *name)
  104. {
  105. const char *cert_domain, *domain, *next_dot;
  106. if (g_ascii_strcasecmp (cert_name, name) == 0) {
  107. return TRUE;
  108. }
  109. /* Wildcard match? */
  110. if (cert_name[0] == '*') {
  111. /*
  112. * Valid wildcards:
  113. * - "*.domain.tld"
  114. * - "*.sub.domain.tld"
  115. * - etc.
  116. * Reject "*.tld".
  117. * No attempt to prevent the use of eg. "*.co.uk".
  118. */
  119. cert_domain = &cert_name[1];
  120. /* Disallow "*" */
  121. if (cert_domain[0] == '\0') {
  122. return FALSE;
  123. }
  124. /* Disallow "*foo" */
  125. if (cert_domain[0] != '.') {
  126. return FALSE;
  127. }
  128. /* Disallow "*.." */
  129. if (cert_domain[1] == '.') {
  130. return FALSE;
  131. }
  132. next_dot = strchr (&cert_domain[1], '.');
  133. /* Disallow "*.bar" */
  134. if (next_dot == NULL) {
  135. return FALSE;
  136. }
  137. /* Disallow "*.bar.." */
  138. if (next_dot[1] == '.') {
  139. return FALSE;
  140. }
  141. domain = strchr (name, '.');
  142. /* No wildcard match against a name with no host part. */
  143. if (name[0] == '.') {
  144. return FALSE;
  145. }
  146. /* No wildcard match against a name with no domain part. */
  147. if (domain == NULL || strlen (domain) == 1) {
  148. return FALSE;
  149. }
  150. if (g_ascii_strcasecmp (cert_domain, domain) == 0) {
  151. return TRUE;
  152. }
  153. }
  154. return FALSE;
  155. }
  156. /* See RFC 5280 section 4.2.1.6 for SubjectAltName details. */
  157. static gboolean
  158. rspamd_tls_check_subject_altname (X509 *cert, const char *name)
  159. {
  160. STACK_OF(GENERAL_NAME) *altname_stack = NULL;
  161. int addrlen, type;
  162. int count, i;
  163. union {
  164. struct in_addr ip4;
  165. struct in6_addr ip6;
  166. } addrbuf;
  167. gboolean ret = FALSE;
  168. altname_stack = X509_get_ext_d2i (cert, NID_subject_alt_name, NULL, NULL);
  169. if (altname_stack == NULL) {
  170. return FALSE;
  171. }
  172. if (inet_pton (AF_INET, name, &addrbuf) == 1) {
  173. type = GEN_IPADD;
  174. addrlen = 4;
  175. }
  176. else if (inet_pton (AF_INET6, name, &addrbuf) == 1) {
  177. type = GEN_IPADD;
  178. addrlen = 16;
  179. }
  180. else {
  181. type = GEN_DNS;
  182. addrlen = 0;
  183. }
  184. count = sk_GENERAL_NAME_num (altname_stack);
  185. for (i = 0; i < count; i++) {
  186. GENERAL_NAME *altname;
  187. altname = sk_GENERAL_NAME_value (altname_stack, i);
  188. if (altname->type != type) {
  189. continue;
  190. }
  191. if (type == GEN_DNS) {
  192. const char *data;
  193. int format, len;
  194. format = ASN1_STRING_type (altname->d.dNSName);
  195. if (format == V_ASN1_IA5STRING) {
  196. data = (const char *)ASN1_STRING_data (altname->d.dNSName);
  197. len = ASN1_STRING_length (altname->d.dNSName);
  198. if (len < 0 || len != (gint)strlen (data)) {
  199. ret = FALSE;
  200. break;
  201. }
  202. /*
  203. * Per RFC 5280 section 4.2.1.6:
  204. * " " is a legal domain name, but that
  205. * dNSName must be rejected.
  206. */
  207. if (strcmp (data, " ") == 0) {
  208. ret = FALSE;
  209. break;
  210. }
  211. if (rspamd_tls_match_name (data, name)) {
  212. ret = TRUE;
  213. break;
  214. }
  215. }
  216. }
  217. else if (type == GEN_IPADD) {
  218. const char *data;
  219. int datalen;
  220. datalen = ASN1_STRING_length (altname->d.iPAddress);
  221. data = (const char *)ASN1_STRING_data (altname->d.iPAddress);
  222. if (datalen < 0) {
  223. ret = FALSE;
  224. break;
  225. }
  226. /*
  227. * Per RFC 5280 section 4.2.1.6:
  228. * IPv4 must use 4 octets and IPv6 must use 16 octets.
  229. */
  230. if (datalen == addrlen && memcmp (data, &addrbuf, addrlen) == 0) {
  231. ret = TRUE;
  232. break;
  233. }
  234. }
  235. }
  236. sk_GENERAL_NAME_pop_free (altname_stack, GENERAL_NAME_free);
  237. return ret;
  238. }
  239. static gboolean
  240. rspamd_tls_check_common_name (X509 *cert, const char *name)
  241. {
  242. X509_NAME *subject_name;
  243. char *common_name = NULL;
  244. union {
  245. struct in_addr ip4;
  246. struct in6_addr ip6;
  247. } addrbuf;
  248. int common_name_len;
  249. gboolean ret = FALSE;
  250. subject_name = X509_get_subject_name (cert);
  251. if (subject_name == NULL) {
  252. goto out;
  253. }
  254. common_name_len = X509_NAME_get_text_by_NID (subject_name, NID_commonName, NULL, 0);
  255. if (common_name_len < 0) {
  256. goto out;
  257. }
  258. common_name = g_malloc0 (common_name_len + 1);
  259. X509_NAME_get_text_by_NID (subject_name, NID_commonName, common_name,
  260. common_name_len + 1);
  261. /* NUL bytes in CN? */
  262. if (common_name_len != (gint)strlen (common_name)) {
  263. goto out;
  264. }
  265. if (inet_pton (AF_INET, name, &addrbuf) == 1
  266. || inet_pton (AF_INET6, name, &addrbuf) == 1) {
  267. /*
  268. * We don't want to attempt wildcard matching against IP
  269. * addresses, so perform a simple comparison here.
  270. */
  271. if (strcmp (common_name, name) == 0) {
  272. ret = TRUE;
  273. }
  274. else {
  275. ret = FALSE;
  276. }
  277. goto out;
  278. }
  279. if (rspamd_tls_match_name (common_name, name)) {
  280. ret = TRUE;
  281. }
  282. out:
  283. g_free (common_name);
  284. return ret;
  285. }
  286. static gboolean
  287. rspamd_tls_check_name (X509 *cert, const char *name)
  288. {
  289. gboolean ret;
  290. ret = rspamd_tls_check_subject_altname (cert, name);
  291. if (ret) {
  292. return ret;
  293. }
  294. return rspamd_tls_check_common_name (cert, name);
  295. }
  296. static gboolean
  297. rspamd_ssl_peer_verify (struct rspamd_ssl_connection *c)
  298. {
  299. X509 *server_cert;
  300. glong ver_err;
  301. GError *err = NULL;
  302. ver_err = SSL_get_verify_result (c->ssl);
  303. if (ver_err != X509_V_OK) {
  304. g_set_error (&err, rspamd_ssl_quark (), 400, "certificate validation "
  305. "failed: %s", X509_verify_cert_error_string (ver_err));
  306. c->err_handler (c->handler_data, err);
  307. g_error_free (err);
  308. return FALSE;
  309. }
  310. /* Get server's certificate */
  311. server_cert = SSL_get_peer_certificate (c->ssl);
  312. if (server_cert == NULL) {
  313. g_set_error (&err, rspamd_ssl_quark (), 401, "peer certificate is absent");
  314. c->err_handler (c->handler_data, err);
  315. g_error_free (err);
  316. return FALSE;
  317. }
  318. if (c->hostname) {
  319. if (!rspamd_tls_check_name (server_cert, c->hostname)) {
  320. X509_free (server_cert);
  321. g_set_error (&err, rspamd_ssl_quark (), 403, "peer certificate fails "
  322. "hostname verification for %s", c->hostname);
  323. c->err_handler (c->handler_data, err);
  324. g_error_free (err);
  325. return FALSE;
  326. }
  327. }
  328. X509_free (server_cert);
  329. return TRUE;
  330. }
  331. static void
  332. rspamd_tls_set_error (gint retcode, const gchar *stage, GError **err)
  333. {
  334. GString *reason;
  335. gchar buf[120];
  336. gint err_code = 0;
  337. reason = g_string_sized_new (sizeof (buf));
  338. if (retcode == SSL_ERROR_SYSCALL) {
  339. rspamd_printf_gstring (reason, "syscall fail: %s", strerror (errno));
  340. err_code = 500;
  341. }
  342. else {
  343. while ((err_code = ERR_get_error()) != 0) {
  344. ERR_error_string (err_code, buf);
  345. rspamd_printf_gstring (reason, "ssl error: %s,", buf);
  346. }
  347. err_code = 400;
  348. if (reason->len > 0 && reason->str[reason->len - 1] == ',') {
  349. reason->str[reason->len - 1] = '\0';
  350. reason->len --;
  351. }
  352. }
  353. g_set_error (err, rspamd_ssl_quark (), err_code,
  354. "ssl %s error: %s", stage, reason->str);
  355. g_string_free (reason, TRUE);
  356. }
  357. static void
  358. rspamd_ssl_connection_dtor (struct rspamd_ssl_connection *conn)
  359. {
  360. msg_debug_ssl ("closing SSL connection %p; %d sessions in the cache",
  361. conn->ssl, rspamd_lru_hash_size (conn->ssl_ctx->sessions));
  362. SSL_free (conn->ssl);
  363. if (conn->hostname) {
  364. g_free (conn->hostname);
  365. }
  366. if (conn->shut_ev) {
  367. rspamd_ev_watcher_stop (conn->event_loop, conn->shut_ev);
  368. g_free (conn->shut_ev);
  369. }
  370. close (conn->fd);
  371. g_free (conn);
  372. }
  373. static void
  374. rspamd_ssl_shutdown (struct rspamd_ssl_connection *conn)
  375. {
  376. gint ret = 0, nret, retries;
  377. static const gint max_retries = 5;
  378. /*
  379. * Fucking openssl...
  380. * From the manual, 0 means: "The shutdown is not yet finished.
  381. * Call SSL_shutdown() for a second time,
  382. * if a bidirectional shutdown shall be performed.
  383. * The output of SSL_get_error(3) may be misleading,
  384. * as an erroneous SSL_ERROR_SYSCALL may be flagged
  385. * even though no error occurred."
  386. *
  387. * What is `second`, what if `second` also returns 0?
  388. * What a retarded behaviour!
  389. */
  390. for (retries = 0; retries < max_retries; retries ++) {
  391. ret = SSL_shutdown (conn->ssl);
  392. if (ret != 0) {
  393. break;
  394. }
  395. }
  396. if (ret == 1) {
  397. /* All done */
  398. msg_debug_ssl ("ssl shutdown: all done");
  399. rspamd_ssl_connection_dtor (conn);
  400. }
  401. else if (ret < 0) {
  402. short what;
  403. nret = SSL_get_error (conn->ssl, ret);
  404. conn->state = ssl_next_shutdown;
  405. if (nret == SSL_ERROR_WANT_READ) {
  406. msg_debug_ssl ("ssl shutdown: need read");
  407. what = EV_READ;
  408. }
  409. else if (nret == SSL_ERROR_WANT_WRITE) {
  410. msg_debug_ssl ("ssl shutdown: need write");
  411. what = EV_WRITE;
  412. }
  413. else {
  414. /* Cannot do anything else, fatal error */
  415. GError *err = NULL;
  416. rspamd_tls_set_error (nret, "final shutdown", &err);
  417. msg_debug_ssl ("ssl shutdown: fatal error: %e; retries=%d; ret=%d",
  418. err, retries, ret);
  419. g_error_free (err);
  420. rspamd_ssl_connection_dtor (conn);
  421. return;
  422. }
  423. /* As we own fd, we can try to perform shutdown one more time */
  424. /* BUGON: but we DO NOT own conn->ev, and it's a big issue */
  425. static const ev_tstamp shutdown_time = 5.0;
  426. if (conn->shut_ev == NULL) {
  427. rspamd_ev_watcher_stop (conn->event_loop, conn->ev);
  428. conn->shut_ev = g_malloc0 (sizeof (*conn->shut_ev));
  429. rspamd_ev_watcher_init (conn->shut_ev, conn->fd, what,
  430. rspamd_ssl_event_handler, conn);
  431. rspamd_ev_watcher_start (conn->event_loop, conn->shut_ev, shutdown_time);
  432. /* XXX: can it be done safely ? */
  433. conn->ev = conn->shut_ev;
  434. }
  435. else {
  436. rspamd_ev_watcher_reschedule (conn->event_loop, conn->shut_ev, what);
  437. }
  438. conn->state = ssl_next_shutdown;
  439. }
  440. else if (ret == 0) {
  441. /* What can we do here?? */
  442. msg_debug_ssl ("ssl shutdown: openssl failed to initiate shutdown after "
  443. "%d attempts!", max_retries);
  444. rspamd_ssl_connection_dtor (conn);
  445. }
  446. }
  447. static void
  448. rspamd_ssl_event_handler (gint fd, short what, gpointer ud)
  449. {
  450. struct rspamd_ssl_connection *conn = ud;
  451. gint ret;
  452. GError *err = NULL;
  453. if (what == EV_TIMER) {
  454. if (conn->state == ssl_next_shutdown) {
  455. /* No way to restore, just terminate */
  456. rspamd_ssl_connection_dtor (conn);
  457. }
  458. else {
  459. conn->shut = ssl_shut_unclean;
  460. rspamd_ev_watcher_stop (conn->event_loop, conn->ev);
  461. g_set_error (&err, rspamd_ssl_quark (), 408,
  462. "ssl connection timed out");
  463. conn->err_handler (conn->handler_data, err);
  464. g_error_free (err);
  465. }
  466. return;
  467. }
  468. msg_debug_ssl ("ssl event; what=%d; c->state=%d", (int)what,
  469. (int)conn->state);
  470. switch (conn->state) {
  471. case ssl_conn_init:
  472. /* Continue connection */
  473. ret = SSL_connect (conn->ssl);
  474. if (ret == 1) {
  475. rspamd_ev_watcher_stop (conn->event_loop, conn->ev);
  476. /* Verify certificate */
  477. if ((!conn->verify_peer) || rspamd_ssl_peer_verify (conn)) {
  478. msg_debug_ssl ("ssl connect: connected");
  479. conn->state = ssl_conn_connected;
  480. conn->handler (fd, EV_WRITE, conn->handler_data);
  481. }
  482. else {
  483. return;
  484. }
  485. }
  486. else {
  487. ret = SSL_get_error (conn->ssl, ret);
  488. if (ret == SSL_ERROR_WANT_READ) {
  489. msg_debug_ssl ("ssl connect: need read");
  490. what = EV_READ;
  491. }
  492. else if (ret == SSL_ERROR_WANT_WRITE) {
  493. msg_debug_ssl ("ssl connect: need write");
  494. what = EV_WRITE;
  495. }
  496. else {
  497. rspamd_ev_watcher_stop (conn->event_loop, conn->ev);
  498. rspamd_tls_set_error (ret, "connect", &err);
  499. conn->err_handler (conn->handler_data, err);
  500. g_error_free (err);
  501. return;
  502. }
  503. rspamd_ev_watcher_reschedule (conn->event_loop, conn->ev, what);
  504. }
  505. break;
  506. case ssl_next_read:
  507. rspamd_ev_watcher_reschedule (conn->event_loop, conn->ev, EV_READ);
  508. conn->state = ssl_conn_connected;
  509. conn->handler (fd, EV_READ, conn->handler_data);
  510. break;
  511. case ssl_next_write:
  512. rspamd_ev_watcher_reschedule (conn->event_loop, conn->ev, EV_WRITE);
  513. conn->state = ssl_conn_connected;
  514. conn->handler (fd, EV_WRITE, conn->handler_data);
  515. break;
  516. case ssl_conn_connected:
  517. rspamd_ev_watcher_reschedule (conn->event_loop, conn->ev, what);
  518. conn->state = ssl_conn_connected;
  519. conn->handler (fd, what, conn->handler_data);
  520. break;
  521. case ssl_next_shutdown:
  522. rspamd_ssl_shutdown (conn);
  523. break;
  524. default:
  525. rspamd_ev_watcher_stop (conn->event_loop, conn->ev);
  526. g_set_error (&err, rspamd_ssl_quark (), 500,
  527. "ssl bad state error: %d", conn->state);
  528. conn->err_handler (conn->handler_data, err);
  529. g_error_free (err);
  530. break;
  531. }
  532. }
  533. struct rspamd_ssl_connection *
  534. rspamd_ssl_connection_new (gpointer ssl_ctx, struct ev_loop *ev_base,
  535. gboolean verify_peer, const gchar *log_tag)
  536. {
  537. struct rspamd_ssl_connection *conn;
  538. struct rspamd_ssl_ctx *ctx = (struct rspamd_ssl_ctx *)ssl_ctx;
  539. g_assert (ssl_ctx != NULL);
  540. conn = g_malloc0 (sizeof (*conn));
  541. conn->ssl_ctx = ctx;
  542. conn->event_loop = ev_base;
  543. conn->verify_peer = verify_peer;
  544. if (log_tag) {
  545. rspamd_strlcpy (conn->log_tag, log_tag, sizeof (log_tag));
  546. }
  547. else {
  548. rspamd_random_hex (conn->log_tag, sizeof (log_tag) - 1);
  549. conn->log_tag[sizeof (log_tag) - 1] = '\0';
  550. }
  551. return conn;
  552. }
  553. gboolean
  554. rspamd_ssl_connect_fd (struct rspamd_ssl_connection *conn, gint fd,
  555. const gchar *hostname, struct rspamd_io_ev *ev, ev_tstamp timeout,
  556. rspamd_ssl_handler_t handler, rspamd_ssl_error_handler_t err_handler,
  557. gpointer handler_data)
  558. {
  559. gint ret;
  560. SSL_SESSION *session = NULL;
  561. g_assert (conn != NULL);
  562. conn->ssl = SSL_new (conn->ssl_ctx->s);
  563. if (hostname) {
  564. session = rspamd_lru_hash_lookup (conn->ssl_ctx->sessions, hostname,
  565. ev_now (conn->event_loop));
  566. }
  567. if (session) {
  568. SSL_set_session (conn->ssl, session);
  569. }
  570. SSL_set_app_data (conn->ssl, conn);
  571. msg_debug_ssl ("new ssl connection %p; session reused=%s",
  572. conn->ssl, SSL_session_reused (conn->ssl) ? "true" : "false");
  573. if (conn->state != ssl_conn_reset) {
  574. return FALSE;
  575. }
  576. /* We dup fd to allow graceful closing */
  577. gint nfd = dup (fd);
  578. if (nfd == -1) {
  579. return FALSE;
  580. }
  581. conn->fd = nfd;
  582. conn->ev = ev;
  583. conn->handler = handler;
  584. conn->err_handler = err_handler;
  585. conn->handler_data = handler_data;
  586. if (SSL_set_fd (conn->ssl, conn->fd) != 1) {
  587. close (conn->fd);
  588. return FALSE;
  589. }
  590. if (hostname) {
  591. conn->hostname = g_strdup (hostname);
  592. #ifdef HAVE_SSL_TLSEXT_HOSTNAME
  593. SSL_set_tlsext_host_name (conn->ssl, conn->hostname);
  594. #endif
  595. }
  596. conn->state = ssl_conn_init;
  597. ret = SSL_connect (conn->ssl);
  598. if (ret == 1) {
  599. conn->state = ssl_conn_connected;
  600. msg_debug_ssl ("connected, start write event");
  601. rspamd_ev_watcher_stop (conn->event_loop, ev);
  602. rspamd_ev_watcher_init (ev, nfd, EV_WRITE, rspamd_ssl_event_handler, conn);
  603. rspamd_ev_watcher_start (conn->event_loop, ev, timeout);
  604. }
  605. else {
  606. ret = SSL_get_error (conn->ssl, ret);
  607. if (ret == SSL_ERROR_WANT_READ) {
  608. msg_debug_ssl ("not connected, want read");
  609. }
  610. else if (ret == SSL_ERROR_WANT_WRITE) {
  611. msg_debug_ssl ("not connected, want write");
  612. }
  613. else {
  614. GError *err = NULL;
  615. conn->shut = ssl_shut_unclean;
  616. rspamd_tls_set_error (ret, "initial connect", &err);
  617. msg_debug_ssl ("not connected, fatal error %e", err);
  618. g_error_free (err);
  619. return FALSE;
  620. }
  621. rspamd_ev_watcher_stop (conn->event_loop, ev);
  622. rspamd_ev_watcher_init (ev, nfd, EV_WRITE|EV_READ,
  623. rspamd_ssl_event_handler, conn);
  624. rspamd_ev_watcher_start (conn->event_loop, ev, timeout);
  625. }
  626. return TRUE;
  627. }
  628. gssize
  629. rspamd_ssl_read (struct rspamd_ssl_connection *conn, gpointer buf,
  630. gsize buflen)
  631. {
  632. gint ret;
  633. short what;
  634. GError *err = NULL;
  635. g_assert (conn != NULL);
  636. if (conn->state != ssl_conn_connected && conn->state != ssl_next_read) {
  637. errno = EINVAL;
  638. g_set_error (&err, rspamd_ssl_quark (), 400,
  639. "ssl state error: cannot read data");
  640. conn->shut = ssl_shut_unclean;
  641. conn->err_handler (conn->handler_data, err);
  642. g_error_free (err);
  643. return -1;
  644. }
  645. ret = SSL_read (conn->ssl, buf, buflen);
  646. msg_debug_ssl ("ssl read: %d", ret);
  647. if (ret > 0) {
  648. conn->state = ssl_conn_connected;
  649. return ret;
  650. }
  651. else if (ret == 0) {
  652. ret = SSL_get_error (conn->ssl, ret);
  653. if (ret == SSL_ERROR_ZERO_RETURN || ret == SSL_ERROR_SYSCALL) {
  654. conn->state = ssl_conn_reset;
  655. return 0;
  656. }
  657. else {
  658. conn->shut = ssl_shut_unclean;
  659. rspamd_tls_set_error (ret, "read", &err);
  660. conn->err_handler (conn->handler_data, err);
  661. g_error_free (err);
  662. errno = EINVAL;
  663. return -1;
  664. }
  665. }
  666. else {
  667. ret = SSL_get_error (conn->ssl, ret);
  668. conn->state = ssl_next_read;
  669. what = 0;
  670. if (ret == SSL_ERROR_WANT_READ) {
  671. msg_debug_ssl ("ssl read: need read");
  672. what |= EV_READ;
  673. }
  674. else if (ret == SSL_ERROR_WANT_WRITE) {
  675. msg_debug_ssl ("ssl read: need write");
  676. what |= EV_WRITE;
  677. }
  678. else {
  679. conn->shut = ssl_shut_unclean;
  680. rspamd_tls_set_error (ret, "read", &err);
  681. conn->err_handler (conn->handler_data, err);
  682. g_error_free (err);
  683. errno = EINVAL;
  684. return -1;
  685. }
  686. rspamd_ev_watcher_reschedule (conn->event_loop, conn->ev, what);
  687. errno = EAGAIN;
  688. }
  689. return -1;
  690. }
  691. gssize
  692. rspamd_ssl_write (struct rspamd_ssl_connection *conn, gconstpointer buf,
  693. gsize buflen)
  694. {
  695. gint ret;
  696. short what;
  697. GError *err = NULL;
  698. g_assert (conn != NULL);
  699. if (conn->state != ssl_conn_connected && conn->state != ssl_next_write) {
  700. errno = EINVAL;
  701. return -1;
  702. }
  703. ret = SSL_write (conn->ssl, buf, buflen);
  704. msg_debug_ssl ("ssl write: ret=%d, buflen=%z", ret, buflen);
  705. if (ret > 0) {
  706. conn->state = ssl_conn_connected;
  707. return ret;
  708. }
  709. else if (ret == 0) {
  710. ret = SSL_get_error (conn->ssl, ret);
  711. if (ret == SSL_ERROR_ZERO_RETURN) {
  712. rspamd_tls_set_error (ret, "write", &err);
  713. conn->err_handler (conn->handler_data, err);
  714. g_error_free (err);
  715. errno = ECONNRESET;
  716. conn->state = ssl_conn_reset;
  717. return -1;
  718. }
  719. else {
  720. conn->shut = ssl_shut_unclean;
  721. rspamd_tls_set_error (ret, "write", &err);
  722. conn->err_handler (conn->handler_data, err);
  723. g_error_free (err);
  724. errno = EINVAL;
  725. return -1;
  726. }
  727. }
  728. else {
  729. ret = SSL_get_error (conn->ssl, ret);
  730. conn->state = ssl_next_write;
  731. if (ret == SSL_ERROR_WANT_READ) {
  732. msg_debug_ssl ("ssl write: need read");
  733. what = EV_READ;
  734. }
  735. else if (ret == SSL_ERROR_WANT_WRITE) {
  736. msg_debug_ssl ("ssl write: need write");
  737. what = EV_WRITE;
  738. }
  739. else {
  740. conn->shut = ssl_shut_unclean;
  741. rspamd_tls_set_error (ret, "write", &err);
  742. conn->err_handler (conn->handler_data, err);
  743. g_error_free (err);
  744. errno = EINVAL;
  745. return -1;
  746. }
  747. rspamd_ev_watcher_reschedule (conn->event_loop, conn->ev, what);
  748. errno = EAGAIN;
  749. }
  750. return -1;
  751. }
  752. gssize
  753. rspamd_ssl_writev (struct rspamd_ssl_connection *conn, struct iovec *iov,
  754. gsize iovlen)
  755. {
  756. /*
  757. * Static is needed to avoid issue:
  758. * https://github.com/openssl/openssl/issues/6865
  759. */
  760. static guchar ssl_buf[16384];
  761. guchar *p;
  762. struct iovec *cur;
  763. gsize i, remain;
  764. remain = sizeof (ssl_buf);
  765. p = ssl_buf;
  766. for (i = 0; i < iovlen; i ++) {
  767. cur = &iov[i];
  768. if (cur->iov_len > 0) {
  769. if (remain >= cur->iov_len) {
  770. memcpy (p, cur->iov_base, cur->iov_len);
  771. p += cur->iov_len;
  772. remain -= cur->iov_len;
  773. }
  774. else {
  775. memcpy (p, cur->iov_base, remain);
  776. p += remain;
  777. remain = 0;
  778. break;
  779. }
  780. }
  781. }
  782. return rspamd_ssl_write (conn, ssl_buf, p - ssl_buf);
  783. }
  784. /**
  785. * Removes connection data
  786. * @param conn
  787. */
  788. void
  789. rspamd_ssl_connection_free (struct rspamd_ssl_connection *conn)
  790. {
  791. if (conn) {
  792. if (conn->shut == ssl_shut_unclean) {
  793. /* Ignore return result and close socket */
  794. msg_debug_ssl ("unclean shutdown");
  795. SSL_set_quiet_shutdown (conn->ssl, 1);
  796. (void)SSL_shutdown (conn->ssl);
  797. rspamd_ssl_connection_dtor (conn);
  798. }
  799. else {
  800. msg_debug_ssl ("normal shutdown");
  801. rspamd_ssl_shutdown (conn);
  802. }
  803. }
  804. }
  805. static int
  806. rspamd_ssl_new_client_session (SSL *ssl, SSL_SESSION *sess)
  807. {
  808. struct rspamd_ssl_connection *conn;
  809. conn = SSL_get_app_data (ssl);
  810. if (conn->hostname) {
  811. rspamd_lru_hash_insert (conn->ssl_ctx->sessions,
  812. g_strdup (conn->hostname), SSL_get1_session (ssl),
  813. ev_now (conn->event_loop), SSL_CTX_get_timeout (conn->ssl_ctx->s));
  814. msg_debug_ssl ("saved new session for %s: %p", conn->hostname, conn);
  815. }
  816. return 0;
  817. }
  818. static struct rspamd_ssl_ctx *
  819. rspamd_init_ssl_ctx_common (void)
  820. {
  821. struct rspamd_ssl_ctx *ret;
  822. SSL_CTX *ssl_ctx;
  823. gint ssl_options;
  824. static const guint client_cache_size = 1024;
  825. rspamd_openssl_maybe_init ();
  826. ret = g_malloc0 (sizeof (*ret));
  827. ssl_options = SSL_OP_NO_SSLv2|SSL_OP_NO_SSLv3;
  828. ssl_ctx = SSL_CTX_new (SSLv23_method ());
  829. #ifdef SSL_OP_NO_COMPRESSION
  830. ssl_options |= SSL_OP_NO_COMPRESSION;
  831. #elif OPENSSL_VERSION_NUMBER >= 0x00908000L
  832. sk_SSL_COMP_zero (SSL_COMP_get_compression_methods ());
  833. #endif
  834. SSL_CTX_set_options (ssl_ctx, ssl_options);
  835. #ifdef TLS1_3_VERSION
  836. SSL_CTX_set_min_proto_version (ssl_ctx, 0);
  837. SSL_CTX_set_max_proto_version (ssl_ctx, TLS1_3_VERSION);
  838. #endif
  839. #ifdef SSL_SESS_CACHE_CLIENT
  840. SSL_CTX_set_session_cache_mode (ssl_ctx, SSL_SESS_CACHE_CLIENT
  841. | SSL_SESS_CACHE_NO_INTERNAL_STORE);
  842. #endif
  843. ret->s = ssl_ctx;
  844. ret->sessions = rspamd_lru_hash_new_full (client_cache_size,
  845. g_free, (GDestroyNotify)SSL_SESSION_free, rspamd_str_hash,
  846. rspamd_str_equal);
  847. SSL_CTX_set_app_data (ssl_ctx, ret);
  848. SSL_CTX_sess_set_new_cb (ssl_ctx, rspamd_ssl_new_client_session);
  849. return ret;
  850. }
  851. gpointer
  852. rspamd_init_ssl_ctx (void)
  853. {
  854. struct rspamd_ssl_ctx *ssl_ctx = rspamd_init_ssl_ctx_common ();
  855. SSL_CTX_set_verify (ssl_ctx->s, SSL_VERIFY_PEER, NULL);
  856. SSL_CTX_set_verify_depth (ssl_ctx->s, 4);
  857. return ssl_ctx;
  858. }
  859. gpointer rspamd_init_ssl_ctx_noverify (void)
  860. {
  861. struct rspamd_ssl_ctx *ssl_ctx_noverify = rspamd_init_ssl_ctx_common ();
  862. SSL_CTX_set_verify (ssl_ctx_noverify->s, SSL_VERIFY_NONE, NULL);
  863. return ssl_ctx_noverify;
  864. }
  865. void
  866. rspamd_openssl_maybe_init (void)
  867. {
  868. static gboolean openssl_initialized = FALSE;
  869. if (!openssl_initialized) {
  870. ERR_load_crypto_strings ();
  871. SSL_load_error_strings ();
  872. OpenSSL_add_all_algorithms ();
  873. OpenSSL_add_all_digests ();
  874. OpenSSL_add_all_ciphers ();
  875. #if OPENSSL_VERSION_NUMBER >= 0x1000104fL && !defined(LIBRESSL_VERSION_NUMBER)
  876. ENGINE_load_builtin_engines ();
  877. #endif
  878. #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
  879. SSL_library_init ();
  880. #else
  881. OPENSSL_init_ssl (0, NULL);
  882. #endif
  883. #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
  884. OPENSSL_config (NULL);
  885. #endif
  886. if (RAND_status () == 0) {
  887. guchar seed[128];
  888. /* Try to use ottery to seed rand */
  889. ottery_rand_bytes (seed, sizeof (seed));
  890. RAND_seed (seed, sizeof (seed));
  891. rspamd_explicit_memzero (seed, sizeof (seed));
  892. }
  893. openssl_initialized = TRUE;
  894. }
  895. }
  896. void
  897. rspamd_ssl_ctx_config (struct rspamd_config *cfg, gpointer ssl_ctx)
  898. {
  899. struct rspamd_ssl_ctx *ctx = (struct rspamd_ssl_ctx *)ssl_ctx;
  900. static const char default_secure_ciphers[] = "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4";
  901. if (cfg->ssl_ca_path) {
  902. if (SSL_CTX_load_verify_locations (ctx->s, cfg->ssl_ca_path,
  903. NULL) != 1) {
  904. msg_err_config ("cannot load CA certs from %s: %s",
  905. cfg->ssl_ca_path,
  906. ERR_error_string (ERR_get_error (), NULL));
  907. }
  908. }
  909. else {
  910. msg_debug_config ("ssl_ca_path is not set, using default CA path");
  911. SSL_CTX_set_default_verify_paths (ctx->s);
  912. }
  913. if (cfg->ssl_ciphers) {
  914. if (SSL_CTX_set_cipher_list (ctx->s, cfg->ssl_ciphers) != 1) {
  915. msg_err_config (
  916. "cannot set ciphers set to %s: %s; fallback to %s",
  917. cfg->ssl_ciphers,
  918. ERR_error_string (ERR_get_error (), NULL),
  919. default_secure_ciphers);
  920. /* Default settings */
  921. SSL_CTX_set_cipher_list (ctx->s, default_secure_ciphers);
  922. }
  923. }
  924. }
  925. void
  926. rspamd_ssl_ctx_free (gpointer ssl_ctx)
  927. {
  928. struct rspamd_ssl_ctx *ctx = (struct rspamd_ssl_ctx *)ssl_ctx;
  929. rspamd_lru_hash_destroy (ctx->sessions);
  930. SSL_CTX_free (ctx->s);
  931. g_free (ssl_ctx);
  932. }