tls_rpc.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. /*
  2. * $Id$
  3. *
  4. * TLS module - management interface
  5. *
  6. * Copyright (C) 2001-2003 FhG FOKUS
  7. * Copyright (C) 2005 iptelorg GmbH
  8. *
  9. * This file is part of sip-router, a free SIP server.
  10. *
  11. * Permission to use, copy, modify, and distribute this software for any
  12. * purpose with or without fee is hereby granted, provided that the above
  13. * copyright notice and this permission notice appear in all copies.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  16. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  17. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  18. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  19. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  20. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  21. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  22. */
  23. /** tls module management interface (rpc).
  24. * @file tls_rpc.c
  25. * @ingroup tls
  26. * Module: @ref tls
  27. */
  28. #include "../../rpc.h"
  29. #include "../../tcp_conn.h"
  30. #include "../../tcp_info.h"
  31. #include "../../timer.h"
  32. #include "../../cfg/cfg.h"
  33. #include "tls_init.h"
  34. #include "tls_mod.h"
  35. #include "tls_domain.h"
  36. #include "tls_config.h"
  37. #include "tls_util.h"
  38. #include "tls_server.h"
  39. #include "tls_ct_wrq.h"
  40. #include "tls_rpc.h"
  41. #include "tls_cfg.h"
  42. static const char* tls_reload_doc[2] = {
  43. "Reload TLS configuration file",
  44. 0
  45. };
  46. static void tls_reload(rpc_t* rpc, void* ctx)
  47. {
  48. tls_domains_cfg_t* cfg;
  49. str tls_domains_cfg_file;
  50. tls_domains_cfg_file = cfg_get(tls, tls_cfg, config_file);
  51. if (!tls_domains_cfg_file.s) {
  52. rpc->fault(ctx, 500, "No TLS configuration file configured");
  53. return;
  54. }
  55. /* Try to delete old configurations first */
  56. collect_garbage();
  57. cfg = tls_load_config(&tls_domains_cfg_file);
  58. if (!cfg) {
  59. rpc->fault(ctx, 500, "Error while loading TLS configuration file"
  60. " (consult server log)");
  61. return;
  62. }
  63. if (tls_fix_domains_cfg(cfg, &srv_defaults, &cli_defaults) < 0) {
  64. rpc->fault(ctx, 500, "Error while fixing TLS configuration"
  65. " (consult server log)");
  66. goto error;
  67. }
  68. if (tls_check_sockets(cfg) < 0) {
  69. rpc->fault(ctx, 500, "No server listening socket found for one of"
  70. " TLS domains (consult server log)");
  71. goto error;
  72. }
  73. DBG("TLS configuration successfuly loaded");
  74. cfg->next = (*tls_domains_cfg);
  75. *tls_domains_cfg = cfg;
  76. return;
  77. error:
  78. tls_free_cfg(cfg);
  79. }
  80. static const char* tls_list_doc[2] = {
  81. "List currently open TLS connections",
  82. 0
  83. };
  84. extern gen_lock_t* tcpconn_lock;
  85. extern struct tcp_connection** tcpconn_id_hash;
  86. static void tls_list(rpc_t* rpc, void* c)
  87. {
  88. char buf[128];
  89. char src_ip[IP_ADDR_MAX_STR_SIZE];
  90. char dst_ip[IP_ADDR_MAX_STR_SIZE];
  91. void* handle;
  92. char* tls_info;
  93. char* state;
  94. struct tls_extra_data* tls_d;
  95. struct tcp_connection* con;
  96. int i, len, timeout;
  97. TCPCONN_LOCK;
  98. for(i = 0; i < TCP_ID_HASH_SIZE; i++) {
  99. for (con = tcpconn_id_hash[i]; con; con = con->id_next) {
  100. if (con->rcv.proto != PROTO_TLS) continue;
  101. tls_d = con->extra_data;
  102. rpc->add(c, "{", &handle);
  103. /* tcp data */
  104. if ((len = ip_addr2sbuf(&con->rcv.src_ip, src_ip, sizeof(src_ip)))
  105. == 0)
  106. BUG("failed to convert source ip");
  107. src_ip[len] = 0;
  108. if ((len = ip_addr2sbuf(&con->rcv.dst_ip, dst_ip, sizeof(dst_ip)))
  109. == 0)
  110. BUG("failed to convert destination ip");
  111. dst_ip[len] = 0;
  112. timeout = TICKS_TO_S(con->timeout - get_ticks_raw());
  113. rpc->struct_add(handle, "ddsdsd",
  114. "id", con->id,
  115. "timeout", timeout,
  116. "src_ip", src_ip,
  117. "src_port", con->rcv.src_port,
  118. "dst_ip", dst_ip,
  119. "dst_port", con->rcv.dst_port);
  120. if (tls_d) {
  121. if(SSL_get_current_cipher(tls_d->ssl)) {
  122. tls_info = SSL_CIPHER_description(
  123. SSL_get_current_cipher(tls_d->ssl),
  124. buf, sizeof(buf));
  125. len = strlen(buf);
  126. if (len && buf[len - 1] == '\n') buf[len - 1] = '\0';
  127. } else {
  128. tls_info = "unknown";
  129. }
  130. /* tls data */
  131. state = "unknown/error";
  132. lock_get(&con->write_lock);
  133. switch(tls_d->state) {
  134. case S_TLS_NONE:
  135. state = "none/init";
  136. break;
  137. case S_TLS_ACCEPTING:
  138. state = "tls_accept";
  139. break;
  140. case S_TLS_CONNECTING:
  141. state = "tls_connect";
  142. break;
  143. case S_TLS_ESTABLISHED:
  144. state = "established";
  145. break;
  146. }
  147. rpc->struct_add(handle, "sddds",
  148. "cipher", tls_info,
  149. "ct_wq_size", tls_d->ct_wq?
  150. tls_d->ct_wq->queued:0,
  151. "enc_rd_buf", tls_d->enc_rd_buf?
  152. tls_d->enc_rd_buf->size:0,
  153. "flags", tls_d->flags,
  154. "state", state
  155. );
  156. lock_release(&con->write_lock);
  157. } else {
  158. rpc->struct_add(handle, "sddds",
  159. "cipher", "unknown",
  160. "ct_wq_size", 0,
  161. "enc_rd_buf", 0,
  162. "flags", 0,
  163. "state", "pre-init"
  164. );
  165. }
  166. }
  167. }
  168. TCPCONN_UNLOCK;
  169. }
  170. static const char* tls_info_doc[2] = {
  171. "Returns internal tls related info.",
  172. 0 };
  173. static void tls_info(rpc_t* rpc, void* c)
  174. {
  175. struct tcp_gen_info ti;
  176. void* handle;
  177. tcp_get_info(&ti);
  178. rpc->add(c, "{", &handle);
  179. rpc->struct_add(handle, "ddd",
  180. "max_connections", ti.tls_max_connections,
  181. "opened_connections", ti.tls_connections_no,
  182. "clear_text_write_queued_bytes", tls_ct_wq_total_bytes());
  183. }
  184. static const char* tls_options_doc[2] = {
  185. "Dumps all the tls config options.",
  186. 0 };
  187. static void tls_options(rpc_t* rpc, void* c)
  188. {
  189. void* handle;
  190. rpc->add(c, "{", &handle);
  191. rpc->struct_add(handle, "dSdddSSSSdSSdddddddddddddd",
  192. "force_run", cfg_get(tls, tls_cfg, force_run),
  193. "method", &cfg_get(tls, tls_cfg, method),
  194. "verify_certificate", cfg_get(tls, tls_cfg, verify_cert),
  195. "verify_depth", cfg_get(tls, tls_cfg, verify_depth),
  196. "require_certificate", cfg_get(tls, tls_cfg, require_cert),
  197. "private_key", &cfg_get(tls, tls_cfg, private_key),
  198. "ca_list", &cfg_get(tls, tls_cfg, ca_list),
  199. "certificate", &cfg_get(tls, tls_cfg, certificate),
  200. "cipher_list", &cfg_get(tls, tls_cfg, cipher_list),
  201. "session_cache", cfg_get(tls, tls_cfg, session_cache),
  202. "session_id", &cfg_get(tls, tls_cfg, session_id),
  203. "config", &cfg_get(tls, tls_cfg, config_file),
  204. "log", cfg_get(tls, tls_cfg, log),
  205. "debug", cfg_get(tls, tls_cfg, debug),
  206. "connection_timeout", TICKS_TO_S(cfg_get(tls, tls_cfg, con_lifetime)),
  207. "disable_compression", cfg_get(tls, tls_cfg, disable_compression),
  208. "ssl_release_buffers", cfg_get(tls, tls_cfg, ssl_release_buffers),
  209. "ssl_freelist_max", cfg_get(tls, tls_cfg, ssl_freelist_max),
  210. "ssl_max_send_fragment", cfg_get(tls, tls_cfg, ssl_max_send_fragment),
  211. "ssl_read_ahead", cfg_get(tls, tls_cfg, ssl_read_ahead),
  212. "send_close_notify", cfg_get(tls, tls_cfg, send_close_notify),
  213. "low_mem_threshold1", cfg_get(tls, tls_cfg, low_mem_threshold1),
  214. "low_mem_threshold2", cfg_get(tls, tls_cfg, low_mem_threshold2),
  215. "ct_wq_max", cfg_get(tls, tls_cfg, ct_wq_max),
  216. "con_ct_wq_max", cfg_get(tls, tls_cfg, con_ct_wq_max),
  217. "ct_wq_blk_size", cfg_get(tls, tls_cfg, ct_wq_blk_size)
  218. );
  219. }
  220. rpc_export_t tls_rpc[] = {
  221. {"tls.reload", tls_reload, tls_reload_doc, 0},
  222. {"tls.list", tls_list, tls_list_doc, RET_ARRAY},
  223. {"tls.info", tls_info, tls_info_doc, 0},
  224. {"tls.options",tls_options, tls_options_doc, 0},
  225. {0, 0, 0, 0}
  226. };