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.
kamailio/modules/tls/doc/tls.xml

186 lines
9.1 KiB

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE section PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd"
[ <!ENTITY % local.common.attrib
"xmlns:xi CDATA #FIXED 'http://www.w3.org/2001/XInclude'"> ]
>
<section id="tls" xmlns:xi="http://www.w3.org/2001/XInclude">
<sectioninfo>
<authorgroup>
<author>
<firstname>Andrei</firstname>
<surname>Pelinescu-Onciul</surname>
<affiliation><orgname>iptelorg GmbH</orgname></affiliation>
<address>
<email>andrei@iptel.org</email>
</address>
</author>
</authorgroup>
<copyright>
<year>2007</year>
<holder>iptelorg GmbH</holder>
</copyright>
</sectioninfo>
<title>TLS Module</title>
<section id="tls.overview">
<title>Overview</title>
<para>
This module implements the TLS transport for SIP-router using the <ulink url="http://www.openssl.org">OpenSSL library</ulink> (http://www.openssl.org). To enable the TLS support this module must be loaded and <emphasis>enable_tls=yes</emphasis> must be added to the SIP-router config file
</para>
</section>
<section id="tls.quick_start">
<title>Quick Start</title>
<para>
Make sure you have a proper certificate and private key and either use the certificate and private_key module parameters, or make sure the certificate and key are in the same PEM file, named cert.pem an placed in [your-cfg-install-prefix]/etc/ser/. Don't forget to load the tls module and to enable TLS (add <emphasis>enable_tls=yes</emphasis> to your config).
</para>
<example>
<title>quick start config</title>
<programlisting>
#...
loadmodule "modules/tls/tls.so"
modparam("tls", "private_key", "./andrei-test.pem")
modparam("tls", "certificate", "./andrei-test.pem")
modparam("tls", "ca_list", "./calist.pem")
enable_tls=yes
route{
# ....
}
</programlisting>
</example>
</section>
<section id="tls.notes">
<title>Important Notes</title>
<para>
The TLS module needs some special options enabled when compiling SIP-router. These options are enabled by default, however in case you're using a modified SIP-router version or Makefile, make sure that you enable -DUSE_TLS and -DTLS_HOOKS (or compile with make TLS_HOOKS=1 which will take care of both options). To quickly check if your SIP-router version was compiled with these options, run ser -V and look for USE_TLS and TLS_HOOKS among the flags.
</para>
<para>
This module includes several workarounds for various Openssl bugs (like compression and Kerberos using
the wrong memory allocations functions, low memory problems a.s.o). On startup it will try to enable
the needed workarounds based on the openssl library version. Each time a known problem is detected and
a workaround is enabled, a message will be logged. In general it is recommended to compile this module on the same machine or a similar machine to where ser will be run or to link it statically with libssl. For example if on the compile machine openssl does not have the kerberos support enabled, but on the target machine a kerberos enabled openssl library is installed, ser cannot apply the needed workarounds and will refuse to start. The same thing will happen if the openssl versions are too different (to force ser startup anyway, see the <varname>tls_force_run</varname> module parameter).
</para>
<para>
Try to avoid using keys larger then 1024 bytes. Large keys significantly slow down the TLS connection handshake, thus limiting the maximum SIP-router TLS connection rate.
</para>
<para>
Compression is fully supported if you have a new enough Openssl version (starting with 0.9.8). Although there are some problems with zlib compression in currently deployed Openssl versions (up to and including 0.9.8d, see openssl bug #1468), the TLS module will automatically switch to its own fixed version.
Note however that starting with sr 3.1 compression is not enabled by default, due to the huge extra memory consumption that it causes (about 10x more memory). To enable it use modparam("tls", "tls_disable_compression", 0)
(see <varname>tls_disable_compression</varname>).
</para>
<para>
The TLS module includes workarounds for the following known openssl bugs: openssl #1204 (disable SS_OP_TLS_BLOCK_PADDING_BUG if compression is enabled, for versions between 0.9.8 and 0.9.8c), openssl #1468 (fix zlib compression memory allocation), openssl #1467 (kerberos support will be disabled if the openssl version is less than 0.9.8e-beta1) and openssl #1491 (stop using tls in low memory situations due to the very high risk of openssl crashing or leaking memory). The bug reports can be viewed at
<ulink url="http://rt.openssl.org/">http://rt.openssl.org/</ulink>.
</para>
</section>
<section id="tls.compile">
<title>Compiling the TLS Module</title>
<para>
In most case compiling the TLS module is as simple as:
<programlisting>
make -C modules/tls
</programlisting>
or
<programlisting>
make modules modules=modules/tls
</programlisting>
or (compiling whole SIP-router and the tls module)
<programlisting>
make all include_modules=tls
</programlisting>
.
</para>
<para>
However in some cases the openssl library requires linking with other libraries. For example compiling the openssl library with kerberos and zlib-shared support will require linking the tls module with libkrb5 and libz. In this case just add <emphasis>TLS_EXTRA_LIBS</emphasis>="library list" to make's command line. E.g.:
<programlisting>
make TLS_EXTRA_LIBS="-lkrb5 -lz" all include_modules=tls
</programlisting>
</para>
<para>
In general, if SIP-router fails to start with a symbol not found error when trying to load the tls module (check the log), it means some needed library was not linked and it must be added to <emphasis>TLS_EXTRA_LIBS</emphasis>
</para>
</section>
<section id="tls.low_memory">
<title>TLS and Low Memory</title>
<para>
The openssl library doesn't handle very well low memory situations. If memory allocations start to fail (due to memory shortage), openssl can crash or cause memory leaks (making the memory shortage even worse). As of this writing all openssl versions were affected (includind 0.9.8e), see openssl bug #1491. The tls module has some workarounds for preventing this problem (see <varname>low_mem_treshold1</varname> and <varname>low_mem_threshold2</varname>), however starting SIP-router with enough shared memory is higly recommended. When this is not possible a quick way to significantly reduce openssl memory usage it to disable compression (see <varname>tls_disable_compression</varname>).
</para>
</section>
<section id="tls.debugging">
<title>TLS Debugging</title>
<para>
Debugging messages can be selectively enabled by recompiling
the tls module with a combination of the following defines:
<itemizedlist>
<listitem>
<para>
TLS_WR_DEBUG - debug messages for the write/send part.
</para>
</listitem>
<listitem>
<para>
TLS_RD_DEBUG - debug messages for the read/receive
part.
</para>
</listitem>
<listitem>
<para>
TLS_BIO_DEBUG - debug messages for the custom BIO.
</para>
</listitem>
</itemizedlist>
</para>
<example>
<title>Compiling TLS with Debug Messages</title>
<programlisting>
make -C modules/tls extra_defs="-DTLS_WR_DEBUG -DTLS_RD_DEBUG"
</programlisting>
</example>
<para>
To change the level at which the debug messages are logged,
change the <varname>tls_debug</varname> module parameter.
</para>
</section>
<section id="tls.known_limitations">
<title>Known Limitations</title>
<para>
The private key must not encrypted (SIP-router cannot ask you for a password on startup).
</para>
<para>
The TLS certificate verifications ignores the certificate name, subject altname and ip extensions, it just checks if the certificate is signed by a recognized CA. One can use the select framework to try to overcome this limitation (check in the script for the contents of various certificate fields), but this is not only slow, but also not exactly standard conforming (the verification should happen during TLS connection establishment and not after).
</para>
<para>
TLS specific config reloading is not safe, so for now better don't use it, especially under heavy traffic.
</para>
<para>
This documentation is incomplete.
The RPCs are not documented here, but in doc/rpc_list/rpc_tls.txt
or <ulink url="http://sip-router.org/docbook/sip-router/branch/master/rpc_list/rpc_list.html#rpc_exports.tls">
http://sip-router.org/docbook/sip-router/branch/master/rpc_list/rpc_list.html#rpc_exports.tls</ulink>.
The provided selects are not documented. A list with all the
ones implemented by the tls module can be seen under
doc/select_list/select_tls.txt or
or <ulink url="http://sip-router.org/docbook/sip-router/branch/master/select_list/select_list.html#select_list.tls">
http://sip-router.org/docbook/sip-router/branch/master/select_list/select_list.html#select_list.tls</ulink>.
</para>
</section>
<xi:include href="certs_howto.xml"/>
<xi:include href="params.xml"/>
<xi:include href="functions.xml"/>
<xi:include href="history.xml"/>
</section>