This patch[1] adds two new directives, SSLServerName and SSLServerPort. The
idea behind these two directives is to associate a SSL-aware Apache server,
with a non SSL-aware Apache server. For example:

One could have in httpd.conf:

        Listen 80
        Listen 443

        SSLServerName ssl.foobar.org
        SSLServerPort 443

        <VirtualHost ssl.foobar.org:443>
        SSLEngine On
        [...other directives...]
        </VirtualHost>

        <VirtualHost www.xyzzy.com:80>
        SSLServerName ssl.xyzzy.com
        SSLServerPort 443
        [...other directives...]
        </VirtualHost>

        <VirtualHost ssl.xyzzy.com:443>
        SSLEngine On
        [...other directives...]
        </VirtualHost>

Then you could write a module[2] that could, when necessary, redirect to an 
appropriate SSL-aware server whenever SSL is required. No, this will not
work with name-based virtual hosts.

If this patch is accepted, I'd be happy to follow up with documentation.

Thanks,
Tom

[1]

Index: mod_ssl.c
===================================================================
RCS file: /usr/aventail/src/cvsroot/sdk/mod_ssl/pkg.apache/src/modules/ssl/mod_ssl.c,v
retrieving revision 1.55
diff -u -3 -r1.55 mod_ssl.c
--- mod_ssl.c   1999/05/06 09:56:35     1.55
+++ mod_ssl.c   1999/05/20 02:55:11
@@ -150,6 +150,10 @@
     AP_SRV_CMD(Protocol, RAW_ARGS,
                "Enable or disable various SSL protocols"
                "(`[+-][SSLv2|SSLv3|TLSv1] ...' - see manual)")
+    AP_SRV_CMD(ServerName, TAKE1,
+               "The canonical SSL hostname")
+    AP_SRV_CMD(ServerPort, TAKE1,
+               "The canonical SSL TCP port number")
 
     /*
      * Per-directory context configuration directives
Index: mod_ssl.h
===================================================================
RCS file: /usr/aventail/src/cvsroot/sdk/mod_ssl/pkg.apache/src/modules/ssl/mod_ssl.h,v
retrieving revision 1.93
diff -u -3 -r1.93 mod_ssl.h
--- mod_ssl.h   1999/05/06 09:56:36     1.93
+++ mod_ssl.h   1999/05/20 02:55:11
@@ -491,6 +491,8 @@
     char        *szCARevocationPath;
     char        *szCARevocationFile;
     X509_STORE  *pRevocationStore;
+    char        *pServerName;
+    unsigned short nServerPort;
 #ifdef SSL_VENDOR
     ap_ctx      *ctx;
 #endif
@@ -555,6 +557,8 @@
 const char  *ssl_cmd_SSLOptions(cmd_parms *, SSLDirConfigRec *, const char *);
 const char  *ssl_cmd_SSLRequireSSL(cmd_parms *, SSLDirConfigRec *, char *);
 const char  *ssl_cmd_SSLRequire(cmd_parms *, SSLDirConfigRec *, char *);
+const char  *ssl_cmd_SSLServerName(cmd_parms *, void *, char *);
+const char  *ssl_cmd_SSLServerPort(cmd_parms *, void *, char *);
 
 /*  module initialization  */
 void         ssl_init_Module(server_rec *, pool *);
Index: ssl_engine_config.c
===================================================================
RCS file: 
/usr/aventail/src/cvsroot/sdk/mod_ssl/pkg.apache/src/modules/ssl/ssl_engine_config.c,v
retrieving revision 1.53
diff -u -3 -r1.53 ssl_engine_config.c
--- ssl_engine_config.c 1999/05/06 09:56:36     1.53
+++ ssl_engine_config.c 1999/05/20 02:55:11
@@ -204,6 +204,8 @@
     sc->szCARevocationPath     = NULL;
     sc->szCARevocationFile     = NULL;
     sc->pRevocationStore       = NULL;
+    sc->pServerName            = NULL;
+    sc->nServerPort            = DEFAULT_HTTPS_PORT;
 
 #ifdef SSL_VENDOR
     sc->ctx = ap_ctx_new(p);
@@ -245,6 +247,8 @@
     cfgMerge(szCARevocationPath, NULL);
     cfgMerge(szCARevocationFile, NULL);
     cfgMerge(pRevocationStore, NULL);
+    cfgMergeString(pServerName);
+    cfgMerge(nServerPort, DEFAULT_HTTPS_PORT);
 
 #ifdef SSL_VENDOR
     cfgMergeCtx(ctx);
@@ -801,3 +805,25 @@
     return NULL;
 }
 
+const char *ssl_cmd_SSLServerName(cmd_parms *cmd, void *dummy, char *word1)
+{
+    SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
+
+    sc->pServerName = word1;
+    return NULL;
+}
+
+const char *ssl_cmd_SSLServerPort(cmd_parms *cmd, void *dummy, char *word1)
+{
+    SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
+    int port;
+
+    port = atoi(word1);
+    if (port <= 0 || port >= 65536) { /* 65536 == 1<<16 */
+        return ap_pstrcat(cmd->temp_pool, "The SSL port number \"", word1,
+                                          "\" is outside the appropriate range "
+                                          "(i.e., 1..65535).", NULL);
+    }
+    sc->nServerPort = port;
+    return NULL;
+}
Index: ssl_engine_kernel.c
===================================================================
RCS file: 
/usr/aventail/src/cvsroot/sdk/mod_ssl/pkg.apache/src/modules/ssl/ssl_engine_kernel.c,v
retrieving revision 1.85
diff -u -3 -r1.85 ssl_engine_kernel.c
--- ssl_engine_kernel.c 1999/05/14 15:37:50     1.85
+++ ssl_engine_kernel.c 1999/05/20 02:55:11
@@ -1041,6 +1041,8 @@
     "SSL_SERVER_I_DN_Email",
     "SSL_SERVER_A_KEY",
     "SSL_SERVER_A_SIG",
+    "SSL_SERVER_NAME",
+    "SSL_SERVER_PORT",
     NULL
 };
 
Index: ssl_engine_vars.c
===================================================================
RCS file: 
/usr/aventail/src/cvsroot/sdk/mod_ssl/pkg.apache/src/modules/ssl/ssl_engine_vars.c,v
retrieving revision 1.34
diff -u -3 -r1.34 ssl_engine_vars.c
--- ssl_engine_vars.c   1999/05/18 09:14:59     1.34
+++ ssl_engine_vars.c   1999/05/20 02:55:11
@@ -304,6 +304,14 @@
         if ((xs = SSL_get_peer_certificate(ssl)) != NULL)
             result = ssl_var_lookup_ssl_cert(p, xs, var+7);
     }
+    else if (strcEQ(var, "SERVER_NAME")) {
+        SSLSrvConfigRec *sc = mySrvConfig(c->server);
+        return sc->pServerName;
+    }
+    else if (strcEQ(var, "SERVER_PORT")) {
+        SSLSrvConfigRec *sc = mySrvConfig(c->server);
+        return ap_psprintf(p, "%u", sc->nServerPort);
+    }
     else if (strlen(var) > 7 && strcEQn(var, "SERVER_", 7)) {
         ssl = ap_ctx_get(c->client->ctx, "ssl");
         if ((xs = SSL_get_certificate(ssl)) != NULL)

[2]

#include "httpd.h"
#include "http_config.h"
#include "http_core.h"
#include "http_log.h"
#include "http_main.h"
#include "http_protocol.h"

module MODULE_VAR_EXPORT ssltest_module;

static int
ssltest_handler(request_rec *r)
{
        const char *ssl_server_name, *ssl_server_port, *location;

    ap_hook_call("ap::mod_ssl::var_lookup", &ssl_server_name,
                 r->pool, r->server, r->connection, r, "SSL_SERVER_NAME");
    ap_hook_call("ap::mod_ssl::var_lookup", &ssl_server_port,
                 r->pool, r->server, r->connection, r, "SSL_SERVER_PORT");

        if (ssl_server_name == NULL || *ssl_server_name == '\0')
                ssl_server_name = ap_get_server_name(r);

        location = ap_psprintf(r->pool, "https://%s:%s%s",
                                                   ssl_server_name, ssl_server_port, 
r->unparsed_uri);
        ap_table_setn(r->headers_out, "Location", location);
    return REDIRECT;
}

static const handler_rec
ssltest_handlers[] = {
    { "ssltest-handler", ssltest_handler },
    { NULL }
};

static int
ssltest_post_read(request_rec *r)
{
        char *ssl_session_id;

    ap_hook_call("ap::mod_ssl::var_lookup", &ssl_session_id,
                 r->pool, r->server, r->connection, r, "SSL_SESSION_ID");

        if (ssl_session_id == NULL || *ssl_session_id == '\0')
        /*
        ** I wonder what would happen if I were to redirect right here...
        */
                r->handler = "ssltest-handler";

        return DECLINED;
}

module MODULE_VAR_EXPORT ssltest_module = {
   STANDARD_MODULE_STUFF,
   NULL,                        /* module initializer                  */
   NULL,                        /* create per-dir    config structures */
   NULL,                        /* merge  per-dir    config structures */
   NULL,                        /* create per-server config structures */
   NULL,                        /* merge  per-server config structures */
   NULL,                        /* table of config file commands       */
   ssltest_handlers,            /* [#8] MIME-typed-dispatched handlers */
   NULL,                        /* [#1] URI to filename translation    */
   NULL,                        /* [#4] validate user id from request  */
   NULL,                        /* [#5] check if the user is ok _here_ */
   NULL,                        /* [#3] check access by host address   */
   NULL,                        /* [#6] determine MIME type            */
   NULL,                        /* [#7] pre-run fixups                 */
   NULL,                        /* [#9] log a transaction              */
   NULL,                        /* [#2] header parser                  */
   NULL,                        /* child_init                          */
   NULL,                        /* child_exit                          */
   ssltest_post_read            /* [#0] post read-request              */
};

-- 
Tom Vaughan <tvaughan at aventail dot com>
______________________________________________________________________
Apache Interface to OpenSSL (mod_ssl)                   www.modssl.org
User Support Mailing List                      [EMAIL PROTECTED]
Automated List Manager                            [EMAIL PROTECTED]

Reply via email to