SYNOPSIS

 This Apache module provides strong cryptography for the Apache 2 webserver
 via the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS
 v1) protocols by the help of the SSL/TLS implementation library OpenSSL which
 is based on SSLeay from Eric A. Young and Tim J. Hudson. 

 The mod_ssl package was created in April 1998 by Ralf S. Engelschall 
 and was originally derived from software developed by Ben Laurie for 
 use in the Apache-SSL HTTP server project.  The mod_ssl implementation 
 for Apache 1.3 continues to be supported by the modssl project 
 <http://www.modssl.org/>.

SOURCES

 See the top-level LAYOUT file for file descriptions.

 The source files are written in clean ANSI C and pass the ``gcc -O -g
 -ggdb3 -Wall -Wshadow -Wpointer-arith -Wcast-align -Wmissing-prototypes
 -Wmissing-declarations -Wnested-externs -Winline'' compiler test
 (assuming `gcc' is GCC 2.95.2 or newer) without any complains. When
 you make changes or additions make sure the source still passes this
 compiler test.

FUNCTIONS
  
 Inside the source code you will be confronted with the following types of
 functions which can be identified by their prefixes:

   ap_xxxx() ............... Apache API function
   ssl_xxxx() .............. mod_ssl function
   SSL_xxxx() .............. OpenSSL function (SSL library)
   OpenSSL_xxxx() .......... OpenSSL function (SSL library)
   X509_xxxx() ............. OpenSSL function (Crypto library)
   PEM_xxxx() .............. OpenSSL function (Crypto library)
   EVP_xxxx() .............. OpenSSL function (Crypto library)
   RSA_xxxx() .............. OpenSSL function (Crypto library)

DATA STRUCTURES

 Inside the source code you will be confronted with the following
 data structures:

   server_rec .............. Apache (Virtual) Server
   conn_rec ................ Apache Connection
   request_rec ............. Apache Request
   SSLModConfig ............ mod_ssl (Global)  Module Configuration
   SSLSrvConfig ............ mod_ssl (Virtual) Server Configuration
   SSLDirConfig ............ mod_ssl Directory Configuration
   SSLConnConfig ........... mod_ssl Connection Configuration
   SSLFilterRec ............ mod_ssl Filter Context
   SSL_CTX ................. OpenSSL Context
   SSL_METHOD .............. OpenSSL Protocol Method
   SSL_CIPHER .............. OpenSSL Cipher
   SSL_SESSION ............. OpenSSL Session
   SSL ..................... OpenSSL Connection
   BIO ..................... OpenSSL Connection Buffer

 For an overview how these are related and chained together have a look at the
 page in README.dsov.{fig,ps}. It contains overview diagrams for those data
 structures. It's designed for DIN A4 paper size, but you can easily generate
 a smaller version inside XFig by specifying a magnification on the Export
 panel.

INCOMPATIBILITIES

 The following intentional incompatibilities exist between mod_ssl 2.x
 from Apache 1.3 and this mod_ssl version for Apache 2:

 o The complete EAPI-based SSL_VENDOR stuff was removed.
 o The complete EAPI-based SSL_COMPAT stuff was removed.
 o The <IfDefine> variable MOD_SSL is no longer provided automatically 

MAJOR CHANGES 

 For a complete history of changes for Apache 2 mod_ssl, see the 
 CHANGES file in the top-level directory.  The following 
 is a condensed summary of the major changes were made between 
 mod_ssl 2.x from Apache 1.3 and this mod_ssl version for Apache 2:

 o The DBM based session cache is now based on APR's DBM API only.
 o The shared memory based session cache is now based on APR's APIs.
 o SSL I/O is now implemented in terms of filters rather than BUFF
 o Eliminated ap_global_ctx. Storing Persistent information in 
   process_rec->pool->user_data. The ssl_pphrase_Handle_CB() and 
   ssl_config_global_* () functions have an extra parameter now - 
   "server_rec *" -  which is used to retrieve the SSLModConfigRec.
 o Properly support restarts, allowing mod_ssl to be added to a server
   that is already running and to change server certs/keys on restart
 o Various performance enhancements
 o proxy support is no longer an "extension", much of the mod_ssl core
   was re-written (ssl_engine_{init,kernel,config}.c) to be generic so
   it could be re-used in proxy mode.
   - the optional function ssl_proxy_enable is provide for mod_proxy
     to enable proxy support
   - proxy support now requires 'SSLProxyEngine on' to be configured
   - proxy now supports SSLProxyCARevocation{Path,File} in addition to
     the original SSLProxy* directives
 o per-directory SSLCACertificate{File,Path} is now thread-safe but
   requires SSL_set_cert_store patch to OpenSSL
 o the ssl_engine_{ds,ext}.c source files are obsolete and no longer
   exist

TODO

 See the top-level STATUS file for current efforts and goals.
