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 27KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133
  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. int 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. char *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. char 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. RSPAMD_LOG_FUNC, \
  67. __VA_ARGS__)
  68. static void rspamd_ssl_event_handler(int 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 != (int) 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 != (int) strlen(common_name)) {
  263. goto out;
  264. }
  265. if (inet_pton(AF_INET, name, &addrbuf) == 1 || inet_pton(AF_INET6, name, &addrbuf) == 1) {
  266. /*
  267. * We don't want to attempt wildcard matching against IP
  268. * addresses, so perform a simple comparison here.
  269. */
  270. if (strcmp(common_name, name) == 0) {
  271. ret = TRUE;
  272. }
  273. else {
  274. ret = FALSE;
  275. }
  276. goto out;
  277. }
  278. if (rspamd_tls_match_name(common_name, name)) {
  279. ret = TRUE;
  280. }
  281. out:
  282. g_free(common_name);
  283. return ret;
  284. }
  285. static gboolean
  286. rspamd_tls_check_name(X509 *cert, const char *name)
  287. {
  288. gboolean ret;
  289. ret = rspamd_tls_check_subject_altname(cert, name);
  290. if (ret) {
  291. return ret;
  292. }
  293. return rspamd_tls_check_common_name(cert, name);
  294. }
  295. static gboolean
  296. rspamd_ssl_peer_verify(struct rspamd_ssl_connection *c)
  297. {
  298. X509 *server_cert;
  299. glong ver_err;
  300. GError *err = NULL;
  301. ver_err = SSL_get_verify_result(c->ssl);
  302. if (ver_err != X509_V_OK) {
  303. g_set_error(&err, rspamd_ssl_quark(), 400, "certificate validation "
  304. "failed: %s",
  305. 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",
  323. c->hostname);
  324. c->err_handler(c->handler_data, err);
  325. g_error_free(err);
  326. return FALSE;
  327. }
  328. }
  329. X509_free(server_cert);
  330. return TRUE;
  331. }
  332. static void
  333. rspamd_tls_set_error(int retcode, const char *stage, GError **err)
  334. {
  335. GString *reason;
  336. char buf[120];
  337. int err_code = 0;
  338. reason = g_string_sized_new(sizeof(buf));
  339. if (retcode == SSL_ERROR_SYSCALL) {
  340. rspamd_printf_gstring(reason, "syscall fail: %s", strerror(errno));
  341. err_code = 500;
  342. }
  343. else {
  344. while ((err_code = ERR_get_error()) != 0) {
  345. ERR_error_string(err_code, buf);
  346. rspamd_printf_gstring(reason, "ssl error: %s,", buf);
  347. }
  348. err_code = 400;
  349. if (reason->len > 0 && reason->str[reason->len - 1] == ',') {
  350. reason->str[reason->len - 1] = '\0';
  351. reason->len--;
  352. }
  353. }
  354. g_set_error(err, rspamd_ssl_quark(), err_code,
  355. "ssl %s error: %s", stage, reason->str);
  356. g_string_free(reason, TRUE);
  357. }
  358. static void
  359. rspamd_ssl_connection_dtor(struct rspamd_ssl_connection *conn)
  360. {
  361. msg_debug_ssl("closing SSL connection %p; %d sessions in the cache",
  362. conn->ssl, rspamd_lru_hash_size(conn->ssl_ctx->sessions));
  363. SSL_free(conn->ssl);
  364. if (conn->hostname) {
  365. g_free(conn->hostname);
  366. }
  367. /*
  368. * Try to workaround for the race between timeout and ssl error
  369. */
  370. if (conn->shut_ev != conn->ev && ev_can_stop(&conn->ev->tm)) {
  371. rspamd_ev_watcher_stop(conn->event_loop, conn->ev);
  372. }
  373. if (conn->shut_ev) {
  374. rspamd_ev_watcher_stop(conn->event_loop, conn->shut_ev);
  375. g_free(conn->shut_ev);
  376. }
  377. close(conn->fd);
  378. g_free(conn);
  379. }
  380. static void
  381. rspamd_ssl_shutdown(struct rspamd_ssl_connection *conn)
  382. {
  383. int ret = 0, nret, retries;
  384. static const int max_retries = 5;
  385. /*
  386. * Fucking openssl...
  387. * From the manual, 0 means: "The shutdown is not yet finished.
  388. * Call SSL_shutdown() for a second time,
  389. * if a bidirectional shutdown shall be performed.
  390. * The output of SSL_get_error(3) may be misleading,
  391. * as an erroneous SSL_ERROR_SYSCALL may be flagged
  392. * even though no error occurred."
  393. *
  394. * What is `second`, what if `second` also returns 0?
  395. * What a retarded behaviour!
  396. */
  397. for (retries = 0; retries < max_retries; retries++) {
  398. ret = SSL_shutdown(conn->ssl);
  399. if (ret != 0) {
  400. break;
  401. }
  402. }
  403. if (ret == 1) {
  404. /* All done */
  405. msg_debug_ssl("ssl shutdown: all done");
  406. rspamd_ssl_connection_dtor(conn);
  407. }
  408. else if (ret < 0) {
  409. short what;
  410. nret = SSL_get_error(conn->ssl, ret);
  411. conn->state = ssl_next_shutdown;
  412. if (nret == SSL_ERROR_WANT_READ) {
  413. msg_debug_ssl("ssl shutdown: need read");
  414. what = EV_READ;
  415. }
  416. else if (nret == SSL_ERROR_WANT_WRITE) {
  417. msg_debug_ssl("ssl shutdown: need write");
  418. what = EV_WRITE;
  419. }
  420. else {
  421. /* Cannot do anything else, fatal error */
  422. GError *err = NULL;
  423. rspamd_tls_set_error(nret, "final shutdown", &err);
  424. msg_debug_ssl("ssl shutdown: fatal error: %e; retries=%d; ret=%d",
  425. err, retries, ret);
  426. g_error_free(err);
  427. rspamd_ssl_connection_dtor(conn);
  428. return;
  429. }
  430. /* As we own fd, we can try to perform shutdown one more time */
  431. /* BUGON: but we DO NOT own conn->ev, and it's a big issue */
  432. static const ev_tstamp shutdown_time = 5.0;
  433. if (conn->shut_ev == NULL) {
  434. rspamd_ev_watcher_stop(conn->event_loop, conn->ev);
  435. conn->shut_ev = g_malloc0(sizeof(*conn->shut_ev));
  436. rspamd_ev_watcher_init(conn->shut_ev, conn->fd, what,
  437. rspamd_ssl_event_handler, conn);
  438. rspamd_ev_watcher_start(conn->event_loop, conn->shut_ev, shutdown_time);
  439. /* XXX: can it be done safely ? */
  440. conn->ev = conn->shut_ev;
  441. }
  442. else {
  443. rspamd_ev_watcher_reschedule(conn->event_loop, conn->shut_ev, what);
  444. }
  445. conn->state = ssl_next_shutdown;
  446. }
  447. else if (ret == 0) {
  448. /* What can we do here?? */
  449. msg_debug_ssl("ssl shutdown: openssl failed to initiate shutdown after "
  450. "%d attempts!",
  451. max_retries);
  452. rspamd_ssl_connection_dtor(conn);
  453. }
  454. }
  455. static void
  456. rspamd_ssl_event_handler(int fd, short what, gpointer ud)
  457. {
  458. struct rspamd_ssl_connection *conn = ud;
  459. int ret;
  460. GError *err = NULL;
  461. if (what == EV_TIMER) {
  462. if (conn->state == ssl_next_shutdown) {
  463. /* No way to restore, just terminate */
  464. rspamd_ssl_connection_dtor(conn);
  465. }
  466. else {
  467. conn->shut = ssl_shut_unclean;
  468. rspamd_ev_watcher_stop(conn->event_loop, conn->ev);
  469. g_set_error(&err, rspamd_ssl_quark(), 408,
  470. "ssl connection timed out");
  471. conn->err_handler(conn->handler_data, err);
  472. g_error_free(err);
  473. }
  474. return;
  475. }
  476. msg_debug_ssl("ssl event; what=%d; c->state=%d", (int) what,
  477. (int) conn->state);
  478. switch (conn->state) {
  479. case ssl_conn_init:
  480. /* Continue connection */
  481. ret = SSL_connect(conn->ssl);
  482. if (ret == 1) {
  483. rspamd_ev_watcher_stop(conn->event_loop, conn->ev);
  484. /* Verify certificate */
  485. if ((!conn->verify_peer) || rspamd_ssl_peer_verify(conn)) {
  486. msg_debug_ssl("ssl connect: connected");
  487. conn->state = ssl_conn_connected;
  488. conn->handler(fd, EV_WRITE, conn->handler_data);
  489. }
  490. else {
  491. return;
  492. }
  493. }
  494. else {
  495. ret = SSL_get_error(conn->ssl, ret);
  496. if (ret == SSL_ERROR_WANT_READ) {
  497. msg_debug_ssl("ssl connect: need read");
  498. what = EV_READ;
  499. }
  500. else if (ret == SSL_ERROR_WANT_WRITE) {
  501. msg_debug_ssl("ssl connect: need write");
  502. what = EV_WRITE;
  503. }
  504. else {
  505. rspamd_ev_watcher_stop(conn->event_loop, conn->ev);
  506. rspamd_tls_set_error(ret, "connect", &err);
  507. conn->err_handler(conn->handler_data, err);
  508. g_error_free(err);
  509. return;
  510. }
  511. rspamd_ev_watcher_reschedule(conn->event_loop, conn->ev, what);
  512. }
  513. break;
  514. case ssl_next_read:
  515. rspamd_ev_watcher_reschedule(conn->event_loop, conn->ev, EV_READ);
  516. conn->state = ssl_conn_connected;
  517. conn->handler(fd, EV_READ, conn->handler_data);
  518. break;
  519. case ssl_next_write:
  520. rspamd_ev_watcher_reschedule(conn->event_loop, conn->ev, EV_WRITE);
  521. conn->state = ssl_conn_connected;
  522. conn->handler(fd, EV_WRITE, conn->handler_data);
  523. break;
  524. case ssl_conn_connected:
  525. rspamd_ev_watcher_reschedule(conn->event_loop, conn->ev, what);
  526. conn->state = ssl_conn_connected;
  527. conn->handler(fd, what, conn->handler_data);
  528. break;
  529. case ssl_next_shutdown:
  530. rspamd_ssl_shutdown(conn);
  531. break;
  532. default:
  533. rspamd_ev_watcher_stop(conn->event_loop, conn->ev);
  534. g_set_error(&err, rspamd_ssl_quark(), 500,
  535. "ssl bad state error: %d", conn->state);
  536. conn->err_handler(conn->handler_data, err);
  537. g_error_free(err);
  538. break;
  539. }
  540. }
  541. struct rspamd_ssl_connection *
  542. rspamd_ssl_connection_new(gpointer ssl_ctx, struct ev_loop *ev_base,
  543. gboolean verify_peer, const char *log_tag)
  544. {
  545. struct rspamd_ssl_connection *conn;
  546. struct rspamd_ssl_ctx *ctx = (struct rspamd_ssl_ctx *) ssl_ctx;
  547. g_assert(ssl_ctx != NULL);
  548. conn = g_malloc0(sizeof(*conn));
  549. conn->ssl_ctx = ctx;
  550. conn->event_loop = ev_base;
  551. conn->verify_peer = verify_peer;
  552. if (log_tag) {
  553. rspamd_strlcpy(conn->log_tag, log_tag, sizeof(conn->log_tag));
  554. }
  555. else {
  556. rspamd_random_hex(conn->log_tag, sizeof(log_tag) - 1);
  557. conn->log_tag[sizeof(log_tag) - 1] = '\0';
  558. }
  559. return conn;
  560. }
  561. gboolean
  562. rspamd_ssl_connect_fd(struct rspamd_ssl_connection *conn, int fd,
  563. const char *hostname, struct rspamd_io_ev *ev, ev_tstamp timeout,
  564. rspamd_ssl_handler_t handler, rspamd_ssl_error_handler_t err_handler,
  565. gpointer handler_data)
  566. {
  567. int ret;
  568. SSL_SESSION *session = NULL;
  569. g_assert(conn != NULL);
  570. /* Ensure that we start from the empty SSL errors stack */
  571. ERR_clear_error();
  572. conn->ssl = SSL_new(conn->ssl_ctx->s);
  573. if (hostname) {
  574. session = rspamd_lru_hash_lookup(conn->ssl_ctx->sessions, hostname,
  575. ev_now(conn->event_loop));
  576. }
  577. if (session) {
  578. SSL_set_session(conn->ssl, session);
  579. }
  580. SSL_set_app_data(conn->ssl, conn);
  581. msg_debug_ssl("new ssl connection %p; session reused=%s",
  582. conn->ssl, SSL_session_reused(conn->ssl) ? "true" : "false");
  583. if (conn->state != ssl_conn_reset) {
  584. return FALSE;
  585. }
  586. /* We dup fd to allow graceful closing */
  587. int nfd = dup(fd);
  588. if (nfd == -1) {
  589. return FALSE;
  590. }
  591. conn->fd = nfd;
  592. conn->ev = ev;
  593. conn->handler = handler;
  594. conn->err_handler = err_handler;
  595. conn->handler_data = handler_data;
  596. if (SSL_set_fd(conn->ssl, conn->fd) != 1) {
  597. close(conn->fd);
  598. return FALSE;
  599. }
  600. if (hostname) {
  601. conn->hostname = g_strdup(hostname);
  602. #ifdef HAVE_SSL_TLSEXT_HOSTNAME
  603. SSL_set_tlsext_host_name(conn->ssl, conn->hostname);
  604. #endif
  605. }
  606. conn->state = ssl_conn_init;
  607. ret = SSL_connect(conn->ssl);
  608. if (ret == 1) {
  609. conn->state = ssl_conn_connected;
  610. msg_debug_ssl("connected, start write event");
  611. rspamd_ev_watcher_stop(conn->event_loop, ev);
  612. rspamd_ev_watcher_init(ev, nfd, EV_WRITE, rspamd_ssl_event_handler, conn);
  613. rspamd_ev_watcher_start(conn->event_loop, ev, timeout);
  614. }
  615. else {
  616. ret = SSL_get_error(conn->ssl, ret);
  617. if (ret == SSL_ERROR_WANT_READ) {
  618. msg_debug_ssl("not connected, want read");
  619. }
  620. else if (ret == SSL_ERROR_WANT_WRITE) {
  621. msg_debug_ssl("not connected, want write");
  622. }
  623. else {
  624. GError *err = NULL;
  625. conn->shut = ssl_shut_unclean;
  626. rspamd_tls_set_error(ret, "initial connect", &err);
  627. msg_debug_ssl("not connected, fatal error %e", err);
  628. g_error_free(err);
  629. return FALSE;
  630. }
  631. rspamd_ev_watcher_stop(conn->event_loop, ev);
  632. rspamd_ev_watcher_init(ev, nfd, EV_WRITE | EV_READ,
  633. rspamd_ssl_event_handler, conn);
  634. rspamd_ev_watcher_start(conn->event_loop, ev, timeout);
  635. }
  636. return TRUE;
  637. }
  638. void rspamd_ssl_connection_restore_handlers(struct rspamd_ssl_connection *conn,
  639. rspamd_ssl_handler_t handler,
  640. rspamd_ssl_error_handler_t err_handler,
  641. gpointer handler_data,
  642. short ev_what)
  643. {
  644. conn->handler = handler;
  645. conn->err_handler = err_handler;
  646. conn->handler_data = handler_data;
  647. rspamd_ev_watcher_stop(conn->event_loop, conn->ev);
  648. rspamd_ev_watcher_init(conn->ev, conn->fd, ev_what, rspamd_ssl_event_handler, conn);
  649. rspamd_ev_watcher_start(conn->event_loop, conn->ev, conn->ev->timeout);
  650. }
  651. gssize
  652. rspamd_ssl_read(struct rspamd_ssl_connection *conn, gpointer buf,
  653. gsize buflen)
  654. {
  655. int ret;
  656. short what;
  657. GError *err = NULL;
  658. g_assert(conn != NULL);
  659. if (conn->state != ssl_conn_connected && conn->state != ssl_next_read) {
  660. errno = EINVAL;
  661. g_set_error(&err, rspamd_ssl_quark(), 400,
  662. "ssl state error: cannot read data");
  663. conn->shut = ssl_shut_unclean;
  664. conn->err_handler(conn->handler_data, err);
  665. g_error_free(err);
  666. return -1;
  667. }
  668. ret = SSL_read(conn->ssl, buf, buflen);
  669. msg_debug_ssl("ssl read: %d", ret);
  670. if (ret > 0) {
  671. conn->state = ssl_conn_connected;
  672. return ret;
  673. }
  674. else if (ret == 0) {
  675. ret = SSL_get_error(conn->ssl, ret);
  676. if (ret == SSL_ERROR_ZERO_RETURN || ret == SSL_ERROR_SYSCALL) {
  677. conn->state = ssl_conn_reset;
  678. return 0;
  679. }
  680. else {
  681. conn->shut = ssl_shut_unclean;
  682. rspamd_tls_set_error(ret, "read", &err);
  683. conn->err_handler(conn->handler_data, err);
  684. g_error_free(err);
  685. errno = EINVAL;
  686. return -1;
  687. }
  688. }
  689. else {
  690. ret = SSL_get_error(conn->ssl, ret);
  691. conn->state = ssl_next_read;
  692. what = 0;
  693. if (ret == SSL_ERROR_WANT_READ) {
  694. msg_debug_ssl("ssl read: need read");
  695. what |= EV_READ;
  696. }
  697. else if (ret == SSL_ERROR_WANT_WRITE) {
  698. msg_debug_ssl("ssl read: need write");
  699. what |= EV_WRITE;
  700. }
  701. else {
  702. conn->shut = ssl_shut_unclean;
  703. rspamd_tls_set_error(ret, "read", &err);
  704. conn->err_handler(conn->handler_data, err);
  705. g_error_free(err);
  706. errno = EINVAL;
  707. return -1;
  708. }
  709. rspamd_ev_watcher_reschedule(conn->event_loop, conn->ev, what);
  710. errno = EAGAIN;
  711. }
  712. return -1;
  713. }
  714. gssize
  715. rspamd_ssl_write(struct rspamd_ssl_connection *conn, gconstpointer buf,
  716. gsize buflen)
  717. {
  718. int ret;
  719. short what;
  720. GError *err = NULL;
  721. g_assert(conn != NULL);
  722. if (conn->state != ssl_conn_connected && conn->state != ssl_next_write) {
  723. errno = EINVAL;
  724. return -1;
  725. }
  726. ret = SSL_write(conn->ssl, buf, buflen);
  727. msg_debug_ssl("ssl write: ret=%d, buflen=%z", ret, buflen);
  728. if (ret > 0) {
  729. conn->state = ssl_conn_connected;
  730. return ret;
  731. }
  732. else if (ret == 0) {
  733. ret = SSL_get_error(conn->ssl, ret);
  734. if (ret == SSL_ERROR_ZERO_RETURN) {
  735. rspamd_tls_set_error(ret, "write", &err);
  736. conn->err_handler(conn->handler_data, err);
  737. g_error_free(err);
  738. errno = ECONNRESET;
  739. conn->state = ssl_conn_reset;
  740. return -1;
  741. }
  742. else {
  743. conn->shut = ssl_shut_unclean;
  744. rspamd_tls_set_error(ret, "write", &err);
  745. conn->err_handler(conn->handler_data, err);
  746. g_error_free(err);
  747. errno = EINVAL;
  748. return -1;
  749. }
  750. }
  751. else {
  752. ret = SSL_get_error(conn->ssl, ret);
  753. conn->state = ssl_next_write;
  754. if (ret == SSL_ERROR_WANT_READ) {
  755. msg_debug_ssl("ssl write: need read");
  756. what = EV_READ;
  757. }
  758. else if (ret == SSL_ERROR_WANT_WRITE) {
  759. msg_debug_ssl("ssl write: need write");
  760. what = EV_WRITE;
  761. }
  762. else {
  763. conn->shut = ssl_shut_unclean;
  764. rspamd_tls_set_error(ret, "write", &err);
  765. conn->err_handler(conn->handler_data, err);
  766. g_error_free(err);
  767. errno = EINVAL;
  768. return -1;
  769. }
  770. rspamd_ev_watcher_reschedule(conn->event_loop, conn->ev, what);
  771. errno = EAGAIN;
  772. }
  773. return -1;
  774. }
  775. gssize
  776. rspamd_ssl_writev(struct rspamd_ssl_connection *conn, struct iovec *iov,
  777. gsize iovlen)
  778. {
  779. /*
  780. * Static is needed to avoid issue:
  781. * https://github.com/openssl/openssl/issues/6865
  782. */
  783. static unsigned char ssl_buf[16384];
  784. unsigned char *p;
  785. struct iovec *cur;
  786. gsize i, remain;
  787. remain = sizeof(ssl_buf);
  788. p = ssl_buf;
  789. for (i = 0; i < iovlen; i++) {
  790. cur = &iov[i];
  791. if (cur->iov_len > 0) {
  792. if (remain >= cur->iov_len) {
  793. memcpy(p, cur->iov_base, cur->iov_len);
  794. p += cur->iov_len;
  795. remain -= cur->iov_len;
  796. }
  797. else {
  798. memcpy(p, cur->iov_base, remain);
  799. p += remain;
  800. remain = 0;
  801. break;
  802. }
  803. }
  804. }
  805. return rspamd_ssl_write(conn, ssl_buf, p - ssl_buf);
  806. }
  807. /**
  808. * Removes connection data
  809. * @param conn
  810. */
  811. void rspamd_ssl_connection_free(struct rspamd_ssl_connection *conn)
  812. {
  813. if (conn) {
  814. if (conn->shut == ssl_shut_unclean) {
  815. /* Ignore return result and close socket */
  816. msg_debug_ssl("unclean shutdown");
  817. SSL_set_quiet_shutdown(conn->ssl, 1);
  818. (void) SSL_shutdown(conn->ssl);
  819. rspamd_ssl_connection_dtor(conn);
  820. }
  821. else {
  822. msg_debug_ssl("normal shutdown");
  823. rspamd_ssl_shutdown(conn);
  824. }
  825. }
  826. }
  827. static int
  828. rspamd_ssl_new_client_session(SSL *ssl, SSL_SESSION *sess)
  829. {
  830. struct rspamd_ssl_connection *conn;
  831. conn = SSL_get_app_data(ssl);
  832. if (conn->hostname) {
  833. rspamd_lru_hash_insert(conn->ssl_ctx->sessions,
  834. g_strdup(conn->hostname), SSL_get1_session(ssl),
  835. ev_now(conn->event_loop), SSL_CTX_get_timeout(conn->ssl_ctx->s));
  836. msg_debug_ssl("saved new session for %s: %p", conn->hostname, conn);
  837. }
  838. return 0;
  839. }
  840. static struct rspamd_ssl_ctx *
  841. rspamd_init_ssl_ctx_common(void)
  842. {
  843. struct rspamd_ssl_ctx *ret;
  844. SSL_CTX *ssl_ctx;
  845. int ssl_options;
  846. static const unsigned int client_cache_size = 1024;
  847. rspamd_openssl_maybe_init();
  848. ret = g_malloc0(sizeof(*ret));
  849. ssl_options = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
  850. ssl_ctx = SSL_CTX_new(SSLv23_method());
  851. #ifdef SSL_OP_NO_COMPRESSION
  852. ssl_options |= SSL_OP_NO_COMPRESSION;
  853. #elif OPENSSL_VERSION_NUMBER >= 0x00908000L
  854. sk_SSL_COMP_zero(SSL_COMP_get_compression_methods());
  855. #endif
  856. SSL_CTX_set_options(ssl_ctx, ssl_options);
  857. #ifdef TLS1_3_VERSION
  858. SSL_CTX_set_min_proto_version(ssl_ctx, 0);
  859. SSL_CTX_set_max_proto_version(ssl_ctx, TLS1_3_VERSION);
  860. #endif
  861. #ifdef SSL_SESS_CACHE_CLIENT
  862. SSL_CTX_set_session_cache_mode(ssl_ctx, SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL_STORE);
  863. #endif
  864. ret->s = ssl_ctx;
  865. ret->sessions = rspamd_lru_hash_new_full(client_cache_size,
  866. g_free, (GDestroyNotify) SSL_SESSION_free, rspamd_str_hash,
  867. rspamd_str_equal);
  868. SSL_CTX_set_app_data(ssl_ctx, ret);
  869. SSL_CTX_sess_set_new_cb(ssl_ctx, rspamd_ssl_new_client_session);
  870. return ret;
  871. }
  872. gpointer
  873. rspamd_init_ssl_ctx(void)
  874. {
  875. struct rspamd_ssl_ctx *ssl_ctx = rspamd_init_ssl_ctx_common();
  876. SSL_CTX_set_verify(ssl_ctx->s, SSL_VERIFY_PEER, NULL);
  877. SSL_CTX_set_verify_depth(ssl_ctx->s, 4);
  878. return ssl_ctx;
  879. }
  880. gpointer rspamd_init_ssl_ctx_noverify(void)
  881. {
  882. struct rspamd_ssl_ctx *ssl_ctx_noverify = rspamd_init_ssl_ctx_common();
  883. SSL_CTX_set_verify(ssl_ctx_noverify->s, SSL_VERIFY_NONE, NULL);
  884. return ssl_ctx_noverify;
  885. }
  886. void rspamd_openssl_maybe_init(void)
  887. {
  888. static gboolean openssl_initialized = FALSE;
  889. if (!openssl_initialized) {
  890. ERR_load_crypto_strings();
  891. SSL_load_error_strings();
  892. OpenSSL_add_all_algorithms();
  893. OpenSSL_add_all_digests();
  894. OpenSSL_add_all_ciphers();
  895. #if OPENSSL_VERSION_NUMBER >= 0x1000104fL && OPENSSL_VERSION_NUMBER < 0x30000000L && !defined(LIBRESSL_VERSION_NUMBER)
  896. ENGINE_load_builtin_engines();
  897. #endif
  898. #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
  899. SSL_library_init();
  900. #else
  901. OPENSSL_init_ssl(0, NULL);
  902. #endif
  903. #if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER)
  904. OPENSSL_config(NULL);
  905. #endif
  906. if (RAND_status() == 0) {
  907. unsigned char seed[128];
  908. /* Try to use ottery to seed rand */
  909. ottery_rand_bytes(seed, sizeof(seed));
  910. RAND_seed(seed, sizeof(seed));
  911. rspamd_explicit_memzero(seed, sizeof(seed));
  912. }
  913. openssl_initialized = TRUE;
  914. }
  915. }
  916. void rspamd_ssl_ctx_config(struct rspamd_config *cfg, gpointer ssl_ctx)
  917. {
  918. struct rspamd_ssl_ctx *ctx = (struct rspamd_ssl_ctx *) ssl_ctx;
  919. static const char default_secure_ciphers[] = "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4";
  920. if (cfg->ssl_ca_path) {
  921. if (SSL_CTX_load_verify_locations(ctx->s, cfg->ssl_ca_path,
  922. NULL) != 1) {
  923. msg_err_config("cannot load CA certs from %s: %s",
  924. cfg->ssl_ca_path,
  925. ERR_error_string(ERR_get_error(), NULL));
  926. }
  927. }
  928. else {
  929. msg_debug_config("ssl_ca_path is not set, using default CA path");
  930. SSL_CTX_set_default_verify_paths(ctx->s);
  931. }
  932. if (cfg->ssl_ciphers) {
  933. if (SSL_CTX_set_cipher_list(ctx->s, cfg->ssl_ciphers) != 1) {
  934. msg_err_config(
  935. "cannot set ciphers set to %s: %s; fallback to %s",
  936. cfg->ssl_ciphers,
  937. ERR_error_string(ERR_get_error(), NULL),
  938. default_secure_ciphers);
  939. /* Default settings */
  940. SSL_CTX_set_cipher_list(ctx->s, default_secure_ciphers);
  941. }
  942. }
  943. }
  944. void rspamd_ssl_ctx_free(gpointer ssl_ctx)
  945. {
  946. struct rspamd_ssl_ctx *ctx = (struct rspamd_ssl_ctx *) ssl_ctx;
  947. rspamd_lru_hash_destroy(ctx->sessions);
  948. SSL_CTX_free(ctx->s);
  949. g_free(ssl_ctx);
  950. }