123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414 |
- [NOTE: this file is obsolete, use README instead]
- free-TLS core module
- Created By: Peter Griffiths
- Mantainer: Cesc Santasusana
- Edited by
- Cesc Santasusana
- Copyright © 2005 Cesc Santasusana
- _________________________________________________________
- TABLE OF CONTENTS
- 1. CHAPTER 1. USER'S GUIDE 2
- 1.1. OVERVIEW 2
- 1.2. DEPENDENCIES 2
- 1.2.1. SER Core and patches 2
- 1.2.2. SER Modules 2
- 1.2.3. External Libraries or Applications 2
- 1.3. HOW TO INSTALL 3
- 1.3.1. File Structure
- 1.3.2. Patches
- 1.3.3. Test Configuration in tls/etc
- 1.3.4. Tools to create certificates in tls/tools
- 1.4. HOW TO COMPILE 3
- 1.5. CONFIG FILE PARAMETERS 3
- 1.5.1. disable_tls 4
- 1.5.2. listen 4
- 1.5.3. tls_certificate 4
- 1.5.4. tls_private_key 4
- 1.5.5. tls_ca_list 4
- 1.5.6. tls_ciphers_list 4
- 1.5.7. tls_method 4
- 1.5.8. tls_verify and tls_require_certificate 4
- 1.5.9. tls_handshake_timeout and tls_send_timeout 5
- 1.5.10. tls_domain[IP_2:port2] 5
- 1.6. SSL/TLS AUTHENTICATION: CLIENT AND SERVER 5
- 1.7. EXPORTED FUNCTIONS 6
- 2. CHAPTER 2. DEVELOPER'S GUIDE 6
- 2.1. TLS_CONFIG 6
- 2.2. TLS_INIT 6
- 2.2.1. default ssl context 6
- 2.2.2. init_tls(void) 6
- 2.2.3. destroy_tls(void) 6
- 2.2.4. tls_init(struct socket_info *) 7
- 2.2.5. ser_malloc, ser_realloc, ser_free 7
- 2.3. TLS_SERVER 7
- 2.3.1. SSL data per connection 7
- 2.3.2. tls_print_errstack(void) 7
- 2.3.3. tls_tcpconn_init( struct tcp_connection *, int) 7
- 2.3.4. tls_tcpconn_clean( struct tcp_connection *) 7
- 2.3.5. tls_close( struct tcp_connection *, int ) 7
- 2.3.6. tls_blocking_write( struct tcp_connection, int, const char, size_t ) 7
- 2.3.7. tls_read( struct tcp_connection *) 8
- 2.3.8. tls_fix_read_conn( struct tcp_connection ) 8
- 2.4. TLS_DOMAIN 8
- 2.4.1. tls_domains 8
- 2.4.2. tls_find_domain( struct ip_addr *, unsigned short) 8
- 2.4.3. tls_new_domain( struct ip_addr *, unsigned *) 8
- 2.4.4. tls_free_domains(void) 8
- 3. CHAPTER 3. FREQUENTLY ASKED QUESTIONS 8
- 3.1. WHERE CAN I FIND MORE ABOUT SER? 8
- 3.2. WHERE CAN I POST A QUESTION ABOUT THIS MODULE? 8
- 3.3. HOW CAN I REPORT A BUG? 9
- 3.4. WHAT IS THE DIFFERENCE WITH OpenSER-TLS?
- 3.5. I AM NOT HAPPY WITH THIS README ... NOW WHAT?
- _________________________________________________________
- 1. CHAPTER 1. USER'S GUIDE
- 1.1. OVERVIEW
- TLS is an optional part of the core, not a module.
- TLS, as defined in SIP RFC, is a mandatory feature for proxies and can be used to secure the SIP signalling
- on a hop-by-hop basis (not end-to-end). TLS works on top of TCP (DTLS, or TLS over UDP is already
- defined by IETF and may become available in the future).
- _________________________________________________________
- 1.2. DEPENDENCIES
- 1.2.1. SER Core and patches
- Core must be compiled with TCP support and the patched cfg.y and cfg.lex, and some
- modification in Makefile.defs.
- The Makefile.defs file is where the library and include paths are set (where to locate Openssl)
- Read more on this below on the "external libraries" dependencies.
- The cfg.XXX patch provide configuration features from the ser.cfg file, usefull and necessary.
- This core module has been compiled successfully with ser branch rel_0_9_0 (updated
- as of June 2005, ser-0.9.3). It should compile in HEAD too without problem.
- It has been tested for functionality (successfully) with rel_0_9_0 (ser-0.9.0).
- Report on success/failure stories to the mantainer. Tks!
- _________________________________________________________
- 1.2.2. SER Modules
- No dependencies on SER modules
- _________________________________________________________
-
- 1.2.3. External Libraries or Applications
- The following libraries or applications must be installed before running SER with this module loaded:
- * OpenSSL v0.9.7 or higher (OpenSSL v0.9.6 also compiles, though not recommended).
- Out of OpenSSL, you need:
- * libssl
- * libcrypto
- * openssl/*.h
- Locate this, usually in:
- /usr/local/lib (for libraries)
- /usr/local/ssl/include/openssl (for header files)
- Depending on your distro, these paths may vary. In this case, you need to modify Makefile.defs file in
- $SERROOT. At the bottom of the file, look for
- ifneq ($(TLS),)
- LIBS+= -L$SOMEPATH/lib -lssl -lcrypto
- DEFS+= -I$SOMEPATH/ssl/include
- endif
- Change the LIBS entry to include the folder where the libssl and libcrypto files are.
- Change the DEFS entry to include the folder where the openssl/ folder is.
- NOTE: RedHat ships by default with a very strange setup of the paths, as well as not usual compilation of
- the libraries, which resumes in ... trouble. Look for solutions in Google, or locally compile OpenSSL
- sources on your system.
- ________________________________________________________
- 1.3. HOW TO INSTALL
- 1.3.1. File Structure
- This is the file structure that needs to be created:
- $SER_ROOT/tls/tls_config.h and .c
- $SER_ROOT/tls/tls_init.h and .c
- $SER_ROOT/tls/tls_server.h and .c
- $SER_ROOT/tls/tls_domain.h and .c
-
- The files that (may) need to be patched or modified
- $SER_ROOT/Makefile.defs
- $SER_ROOT/cfg.y
- $SER_ROOT/cfg.lex
- NOTE: patches can be found in the tls/patches. See above for Makefile.defs tweaking to locate OpenSSL.
-
- 1.3.2. Patches
- In the experimental/tls/patches folder, there are the following files:
- - cfg.lex.patch and cfg.y.patch, to be used to patch the corresponding
- files in $SERROOT.
- > cp cfg.XXX.patch $SERROOT/
- > cd $SERROOT
- > patch -p0 < cfg.XXX.patch
- - cfg.y and cfg.lex: these are the full files, taken from the cvs rel_0_9_0 and patched
- with the above patches (for lazy people :D ).
- Use the patches if you have modified your cfg.y or cfg.lex files or if it is a different
- branch. Use the full files if you don't want to patch the files, or have the standard
- cvs rel_0_9_0 branch files.
-
- 1.3.3. Test configuration
- In the folder tls/etc you can find a sample config file, along with test certificates ready to use.
- Note that in the tls/etc/tls.ser.cfg, the path to certificates and private keys are set to
- /usr/local/etc/ser/certs and /usr/local/etc/ser/private
- (change according to your local configuration)
-
- 1.3.4. Tools to create certificates
- In the folder tls/tools there are script and configuration files to be used with openssl application
- to create certificate (root CA and user certs).
- Read the README.tls.tools file there for more info.
- ________________________________________________________
- 1.4. HOW TO COMPILE
- Easy ;) Add the TLS=1 flag when compiling, for example:
- > make TLS=1 install
- If you have problems compiling the TLS code, such as header files not found, or linking problems related
- to SSL_* functions, check the paths in Makefile.defs (at the bottom, the DEFS+= and LIB+=, and check if
- the openssl/ folder is there, and if the libssl.so and libcrypto.so files are in the specified folders).
- ________________________________________________________
-
- 1.5. CONFIG FILE PARAMETERS
- All these parameters can be used from the ser.cfg file, to configure the behavior of SER-tls.
- ________________________________________________________
- 1.5.1. disable_tls
- Disables TLS (no server is created on the listen addresses, no outgoing connections can be set up).
- It only exhists if TLS=1 is used at compile time.
- Default_value: disable_tls=0
- ________________________________________________________
- 1.5.2. listen
- Not specific to TLS. Allows to specify the protocol (udp, tcp, tls), the IP address and the port
- where the listening server will be.
- listen=tls:IP:port
- ________________________________________________________
- 1.5.3. tls_certificate
- NOTE: To be able to use most of this configuration parameters, you need to have patched cfg.y and cfg.lex
- (and recompile :D )
- Public certificate file for SER. It will be used as server-side certificate for incoming TLS
- connections, and as a client-side certificate for outgoing TLS connections.
- default: "CFG_DIR/cert.pem"
- example: tls_certificate="/mycerts/certs/ser_server_cert.pem"
- ________________________________________________________
- 1.5.4. tls_private_key
- Private key of the above certificate ... keep it in a safe place with tight permissions!
- default: CFG_DIR/cert.pem
- example: tls_private_key="/mycerts/private/prik.pem"
- ________________________________________________________
- 1.5.5. tls_ca_list
- List of trusted CAs. The file contains the certificates accepted, one after the other ( cat x >>
- ca.list). It MUST be a file, not a folder (for now).
- default: "" (no ca_list)
- example: tls_ca_list="/mycerts/certs/ca_list.pem"
- ________________________________________________________
- 1.5.6. tls_ciphers_list
- We can specify the list of algorithms for authentication and encryption that we allow.
- To obtain a list of ciphers and then choose, use the openssl application:
- > openssl ciphers 'ALL:eNULL:!LOW:!EXPORT'
- Do not use the NULL algorithms ... only for testing!!!
- Default: no change, use the default ciphers choosen by OpenSSL.
- Example: tls_ciphers_list="NULL-SHA:NULL-MD5:AES256-SHA:AES128-SHA"
- ________________________________________________________
- 1.5.7. tls_method
- Protocol version to use. Best is to use sslv23, for extended compatibility. Using any of the other
- will restrict the version to just that one version. In fact, sslv2 is disabled in the source code... to use it, you
- need to edit tls_init.c
- Default: sslv23
- tls_method= [sslv2 | sslv23 | sslv3 | tlsv1]
- ________________________________________________________
- 1.5.8. tls_verify and tls_require_certificate
- This two variables highly effect the final security of your deployment. READ carefully!
- Technically, tls_verify activates SSL_VERIFY_PEER in the ssl_context.
- tls_require_certificate does the same with SSL_VERIFY_FAIL_IF_NO_PEER_CERT, which is
- only possible if SSL_VERIFY_PEER is also turned on.
- See the "how does verification work" for more info
- default is 0 for both.
- Example: tls_verify = 1
- tls_require_certificate = 1
- (this example turns on the strictest and strongest authentication possible)
- ________________________________________________________
- 1.5.9. tls_handshake_timeout and tls_send_timeout
- Timeouts ... advanced users only.
- default is 120 seconds for both.
- Example: tls_handshake_timeout=119 [number of seconds]
- Example: tls_send_timeout=121 [number of seconds]
- ________________________________________________________
- 1.5.10. tls_domain[IP_2:port2]
- Note: domains are only possible if cfg.y and cfg.lex are patched.
- If you only run one domain, the main one is enough. If you are running several tls servers (that is,
- you have more than one listen:tls:ip:port entry in the config file), you can specify some parameters for each
- of them separately (not all the above).
- tls_domain[IP_2:port2] {
- #specify parameters for a domain in particular, otherwise,
- #it will use the default. These are the possible parameters to
- #change for each domain
- tls_certificate="new_cert"
- tls_private_key="new_cert_key"
- tls_ca_list="other ca"
- tls_method="tlsv1"
- }
- tls_domain[IP_3:port3] {
- ...
- }
- NOTE: For now, tls_ciphers_list cannot be specified on a per domain basis. When I have the time
- to thoroughly test tls_domains, I will add this.
- _________________________________________________________
- 1.6. SSL/TLS AUTHENTICATION: CLIENT AND SERVER
- TLS provides for strong authentication mechanism, as well as encryption following authentication. Of
- course, null encryption can be used, as well as weak authentication mechanisms (for example, anonymous,
- that is, no authentication).
- How does verification work?
- Verification is the process by which the authentication data provided by the peers is checked. This data
- consists usually of a peer certificate, plus a chain of trusted certification authorities. If for whatever reason,
- either of the peers thinks that the handshake is not valid, the ssl connection is not established.
- The reasons could be many: untrusted server certficate, too-weak algorithm, invalid client cert, no client
- authentication, ...
- The "tls_verify" and "tls_require_certificate" are SER-names for the
- OpenSSL defined flags:
- - SSL_VERIFY_PEER is tls_verify) and
- - SSL_VERIFY_FAIL_IF_NO_PEER_CERT is tls_require_certificate (tls_require_certificate is only used
- if tls_verify=1)
-
- If we are acting as a server, we always send our server-side certificate to the client.
- - If tls_verify=0, we do not request the client a client-certificate. This means that the client is not
- authenticated.
- - If tls_verify=1, we (the server) send a client-certificate request to the client. But the client is free
- to not provide any. In this case, tls_require_certificate comes into play:
- _ if tls_require_cert=0, the verification process will succedd if
- the client does not provide a certificate, or if it provides
- one, it verifies correctly against the server's list of
- trusted certification authorities.
- _ if tls_require_cert=1, the verification process will only succeed
- if the client provides a certificate and this verifies correctly
- against the server's list of trusted CAs.
- _________________________________________________________
- 1.7. EXPORTED FUNCTIONS
- Functions are accessible by including the appropriate tls/tls_xxx.h file.
- _________________________________________________________
- 2. CHAPTER 2. DEVELOPER'S GUIDE
- ________________________________________________________
- 2.1. TLS_CONFIG
- It contains configuration variables for ser's tls (timeouts, file paths, etc).
- ________________________________________________________
- 2.2. TLS_INIT
- Initialization related functions and parameters.
- ________________________________________________________
- 2.2.1. default ssl context
- extern SSL_CTX *default_ctx;
- It is the common context for all tls sockets. If domains are used, each has its own.
- ________________________________________________________
- 2.2.2. init_tls(void)
- Called once to initialize the tls subsystem, from the main().
- int init_tls(void);
- ________________________________________________________
- 2.2.3. destroy_tls(void)
- Called once, just before cleanup.
- void destroy_tls(void);
- ________________________________________________________
- 2.2.4. tls_init(struct socket_info *)
- Called once for each tls socket created.
- int tls_init(struct socket_info *si);
- ________________________________________________________
- 2.2.5. ser_malloc, ser_realloc, ser_free
- Wrapper functions around the shm_* functions. OpenSSL uses non-shared memory to create its objects,
- thus it would not work in SER. By creating these wrappers and configuring OpenSSL to use them instead
- of its default memory functions, we have all OpenSSL objects in shared memory, ready to use.
- ________________________________________________________
- 2.3. TLS_SERVER
- ________________________________________________________
- 2.3.1. SSL data per connection
- Each TLS connection, incoming or outgoing, creates an SSL * object, where configuration inherited from
- the SSL_CTX * and particular info on that socket are stored. This SSL * structure is kept in SER as long as
- the connection is alive, as part of the struct tcp_connection * object:
- struct tcp_connection *c;
- SSL *ssl;
- //create somehow SSL object
- c->extra_data = (void *) ssl;
- ssl = (SSL *) c->extra_data;
- ________________________________________________________
- 2.3.2. tls_print_errstack(void)
- /*
- * dump ssl error stack
- */
- void tls_print_errstack(void);
- ________________________________________________________
- 2.3.3. tls_tcpconn_init( struct tcp_connection *, int)
- /*
- * Called when new tcp connection is accepted
- */
- int tls_tcpconn_init(struct tcp_connection *c, int sock);
- ________________________________________________________
- 2.3.4. tls_tcpconn_clean( struct tcp_connection *)
- /*
- * clean the extra data upon connection shut down
- */
- void tls_tcpconn_clean(struct tcp_connection *c);
- ________________________________________________________
- 2.3.5. tls_close( struct tcp_connection *, int )
- /*
- * shut down the TLS connection
- */
- void tls_close(struct tcp_connection *c, int fd);
- ________________________________________________________
- 2.3.6. tls_blocking_write( struct tcp_connection, int, const char, size_t )
- size_t tls_blocking_write(struct tcp_connection *c, int fd,
- const char *buf, size_t len);
- ________________________________________________________
- 2.3.7. tls_read( struct tcp_connection *)
- size_t tls_read(struct tcp_connection *c);
- ________________________________________________________
- 2.3.8. tls_fix_read_conn( struct tcp_connection )
- int tls_fix_read_conn(struct tcp_connection *c);
- ________________________________________________________
- 2.4. TLS_DOMAIN
- ________________________________________________________
- 2.4.1. tls_domains
- extern struct tls_domain *tls_domains;
-
- ________________________________________________________
- 2.4.2. tls_find_domain( struct ip_addr *, unsigned short)
- /*
- * find domain with given ip and port
- */
- struct tls_domain *tls_find_domain(struct ip_addr *ip,
- unsigned short port);
- ________________________________________________________
- 2.4.3. tls_new_domain( struct ip_addr *, unsigned *)
- /*
- * create a new domain
- */
- int tls_new_domain(struct ip_addr *ip, unsigned short port);
-
- ________________________________________________________
- 2.4.4. tls_free_domains(void)
- /*
- * clean up
- */
- void tls_free_domains(void);
-
- ________________________________________________________
- CHAPTER 3. FREQUENTLY ASKED QUESTIONS
- ________________________________________________________
- 3.1. WHERE CAN I FIND MORE ABOUT SER?
- Take a look at http://iptel.org/ser and http://www.openser.org
- ________________________________________________________
- 3.2. WHERE CAN I POST A QUESTION ABOUT THIS MODULE?
- In the webpages above there is access to mailing list. Use the users list for normal user support, use the dev
- list for development questions (bugs, fixes, etc).
- ________________________________________________________
- 3.3. HOW CAN I REPORT A BUG?
- At the dev lists on the above webpages, and also at:
- http://bugs.sip-router.org
- ________________________________________________________
- 3.4. WHAT IS THE DIFFERENCE WITH OpenSER-TLS?
- None. At least for now. The initial commit in both repositories
- (experimental tree for SER, HEAD for OpenSER) come from the same source:
- an extended version of that released sometime late in 2004 by Peter Griffiths
- and modified by Cesc Santasusana.
- ________________________________________________________
- 3.5. I AM NOT HAPPY WITH THIS README ... NOW WHAT?
- Three things:
- 1 - Complain to the maintainer.
- 2 - Contribute yourself with your acquired knowledge. It is welcome.
- 3 - Take a look at OpenSER tutorials for TLS: http://openser.org/docs/tls.html
-
|