Changeset 6a8a839 in mod_gnutls


Ignore:
Timestamp:
Sep 27, 2004, 2:54:58 AM (18 years ago)
Author:
Paul Querna <chip@…>
Branches:
asyncio, debian/master, debian/stretch-backports, jessie-backports, main, master, msva, proxy-ticket, upstream
Children:
aa99b13
Parents:
16068f4
Message:

updated

Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/Makefile.am

    r16068f4 r6a8a839  
    33libmod_gnutls_la_SOURCES = mod_gnutls.c
    44libmod_gnutls_la_CFLAGS = -Wall ${MODULE_CFLAGS}
    5 libmod_gnutls_la_LDFLAGS =
     5libmod_gnutls_la_LDFLAGS = ${MODULE_LIBS}
    66
    77lib_LTLIBRARIES = libmod_gnutls.la
  • src/mod_gnutls.c

    r16068f4 r6a8a839  
    3535module AP_MODULE_DECLARE_DATA gnutls_module;
    3636
     37#ifdef GNUTLS_AS_FILTER
    3738#define GNUTLS_OUTPUT_FILTER_NAME "GnuTLS Output Filter"
    3839#define GNUTLS_INPUT_FILTER_NAME "GnuTLS Input Filter"
     40#endif
    3941
    4042#define GNUTLS_ENABLED_FALSE 0
     
    4244
    4345
    44 typedef struct gnutls_srvconf_t gnutls_srvconf_t;
    45 struct gnutls_srvconf_t
    46 {
     46typedef struct {
    4747    gnutls_certificate_credentials_t certs;
     48    gnutls_anon_server_credentials_t anoncred;
    4849    char *key_file;
    4950    char *cert_file;
    5051    int enabled;
    51 };
     52    int non_https;
     53    int ciphers[16];
     54    int key_exchange[16];
     55    int macs[16];
     56    int protocol[16];
     57    int compression[16];
     58} gnutls_srvconf_rec;
    5259
    5360typedef struct gnutls_handle_t gnutls_handle_t;
    5461struct gnutls_handle_t
    5562{
    56     gnutls_srvconf_t *sc;
     63    gnutls_srvconf_rec *sc;
    5764    gnutls_session_t session;
     65#ifdef GNUTLS_AS_FILTER
    5866    ap_filter_t *input_filter;
    5967    apr_bucket_brigade *input_bb;
    6068    apr_read_type_e input_block;
     69#endif
    6170};
    6271
     72#ifdef GNUTLS_AS_FILTER
    6373static apr_status_t gnutls_filter_input(ap_filter_t * f,
    6474                                        apr_bucket_brigade * bb,
     
    106116}
    107117
     118#endif /* GNUTLS_AS_FILTER */
     119
    108120static apr_status_t gnutls_cleanup_pre_config(void *data)
    109121{
     
    135147                                   server_rec * base_server)
    136148{
    137     gnutls_srvconf_t *sc;
     149    gnutls_srvconf_rec *sc;
    138150    server_rec *s;
    139151    gnutls_dh_params_t dh_params;
     
    142154
    143155    /* TODO: Should we regenerate these after X requests / X time ? */
    144     gnutls_dh_params_init(&dh_params);
    145     gnutls_dh_params_generate2(dh_params, DH_BITS);
    146     gnutls_rsa_params_init(&rsa_params);
    147     gnutls_rsa_params_generate2(rsa_params, RSA_BITS);
     156//    gnutls_dh_params_init(&dh_params);
     157//    gnutls_dh_params_generate2(dh_params, DH_BITS);
     158//    gnutls_rsa_params_init(&rsa_params);
     159//    gnutls_rsa_params_generate2(rsa_params, RSA_BITS);
    148160
    149161    for (s = base_server; s; s = s->next) {
    150         sc = (gnutls_srvconf_t *) ap_get_module_config(s->module_config,
     162        sc = (gnutls_srvconf_rec *) ap_get_module_config(s->module_config,
    151163                                                       &gnutls_module);
    152164        if (sc->cert_file != NULL && sc->key_file != NULL) {
     
    154166                                                 sc->key_file,
    155167                                                 GNUTLS_X509_FMT_PEM);
    156         }
    157         else {
     168//          gnutls_certificate_set_rsa_export_params(sc->certs, rsa_params);
     169//          gnutls_certificate_set_dh_params(sc->certs, dh_params);
     170        }
     171        else if(sc->enabled == GNUTLS_ENABLED_TRUE ){
    158172            ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s,
    159                          "[GnuTLS] - Host '%s' is missing a Cert and Key File!",
    160                          s->server_hostname);
    161         }
    162 
    163         /**
    164          * TODO: Is it okay for all virtual hosts to
    165          *       share the same DH/RSAparams?
    166          */
    167         gnutls_certificate_set_dh_params(sc->certs, dh_params);
    168         gnutls_certificate_set_rsa_export_params(sc->certs, rsa_params);
    169     }
     173                         "[GnuTLS] - Host '%s:%d' is missing a Cert and Key File!",
     174                         s->server_hostname, s->port);
     175        }
     176    }
     177
    170178
    171179    ap_add_version_component(p, "GnuTLS/" LIBGNUTLS_VERSION);
     
    175183static const char *gnutls_hook_http_method(const request_rec * r)
    176184{
    177     gnutls_srvconf_t *sc =
    178         (gnutls_srvconf_t *) ap_get_module_config(r->server->module_config,
     185    gnutls_srvconf_rec *sc =
     186        (gnutls_srvconf_rec *) ap_get_module_config(r->server->module_config,
    179187                                                  &gnutls_module);
    180188
     
    188196static apr_port_t gnutls_hook_default_port(const request_rec * r)
    189197{
    190     gnutls_srvconf_t *sc =
    191         (gnutls_srvconf_t *) ap_get_module_config(r->server->module_config,
     198    gnutls_srvconf_rec *sc =
     199        (gnutls_srvconf_rec *) ap_get_module_config(r->server->module_config,
    192200                                                  &gnutls_module);
    193201
     
    199207}
    200208
     209#ifdef GNUTLS_AS_FILTER
    201210/**
    202211 * From mod_ssl / ssl_engine_io.c
     
    337346    return 0;
    338347}
     348#endif /* GNUTLS_AS_FILTER */
    339349
    340350static int gnutls_hook_pre_connection(conn_rec * c, void *csd)
     
    342352#ifndef GNUTLS_AS_FILTER
    343353    int cfd;
     354    int ret;
    344355#endif
    345356    gnutls_handle_t *ctxt;
    346     gnutls_srvconf_t *sc =
    347         (gnutls_srvconf_t *) ap_get_module_config(c->base_server->
     357    gnutls_srvconf_rec *sc =
     358        (gnutls_srvconf_rec *) ap_get_module_config(c->base_server->
    348359                                                  module_config,
    349360                                                  &gnutls_module);
     
    358369    gnutls_init(&ctxt->session, GNUTLS_SERVER);
    359370
    360     gnutls_set_default_priority(ctxt->session);
     371    gnutls_cipher_set_priority(ctxt->session, sc->ciphers);
     372    gnutls_compression_set_priority(ctxt->session, sc->compression);
     373    gnutls_kx_set_priority(ctxt->session, sc->key_exchange);
     374    gnutls_protocol_set_priority(ctxt->session, sc->protocol);
     375    gnutls_mac_set_priority(ctxt->session, sc->macs);
    361376
    362377    gnutls_credentials_set(ctxt->session, GNUTLS_CRD_CERTIFICATE, sc->certs);
    363 
    364     gnutls_certificate_server_set_request(ctxt->session, GNUTLS_CERT_REQUEST);
    365 
    366     gnutls_dh_set_prime_bits(ctxt->session, DH_BITS);
     378    gnutls_certificate_server_set_request(ctxt->session, GNUTLS_CERT_IGNORE);
     379
     380//    gnutls_dh_set_prime_bits(ctxt->session, DH_BITS);
     381 
    367382
    368383    ap_set_module_config(c->conn_config, &gnutls_module, ctxt);
     
    378393    apr_os_sock_get(&cfd, csd);
    379394    gnutls_transport_set_ptr(ctxt->session, (gnutls_transport_ptr)cfd);
     395    gnutls_credentials_set(ctxt->session, GNUTLS_CRD_ANON, sc->anoncred);
     396
     397    do{
     398        ret = gnutls_handshake(ctxt->session);
     399
     400        if(ret == GNUTLS_E_INTERRUPTED || ret == GNUTLS_E_AGAIN){
     401            continue;
     402        }
     403
     404        if (ret < 0) {
     405            if (ret == GNUTLS_E_WARNING_ALERT_RECEIVED || ret == GNUTLS_E_FATAL_ALERT_RECEIVED) {
     406                ret = gnutls_alert_get(ctxt->session);
     407                ap_log_error(APLOG_MARK, APLOG_ERR, 0, c->base_server,
     408                    "GnuTLS: Hanshake Alert (%d) '%s'.\n", ret, gnutls_alert_get_name(ret));
     409            }
     410
     411            if (gnutls_error_is_fatal(ret) != 0) {
     412                gnutls_deinit(ctxt->session);
     413                ap_log_error(APLOG_MARK, APLOG_ERR, 0, c->base_server,
     414                     "GnuTLS: Handshake Failed (%d) '%s'",ret, gnutls_strerror(ret));
     415                sc->non_https = 1;
     416                break;
     417            }
     418        }
     419        break; /* all done with the handshake */
     420    } while(1);
    380421#endif
    381422    return OK;
    382423}
    383424
    384 static const char *gnutls_set_ca_file(cmd_parms * parms, void *dummy,
     425static const char *gnutls_set_cert_file(cmd_parms * parms, void *dummy,
    385426                                      const char *arg)
    386427{
    387     gnutls_srvconf_t *sc =
    388         (gnutls_srvconf_t *) ap_get_module_config(parms->server->
     428    gnutls_srvconf_rec *sc =
     429        (gnutls_srvconf_rec *) ap_get_module_config(parms->server->
    389430                                                  module_config,
    390431                                                  &gnutls_module);
    391 /* TODO: CRL, CAFile */
    392 //    gnutls_certificate_set_x509_trust_file(sc->certs, CAFILE,
    393 //                                         GNUTLS_X509_FMT_PEM);
     432    sc->cert_file = apr_pstrdup(parms->pool, arg);
    394433    return NULL;
    395434}
    396435
     436static const char *gnutls_set_key_file(cmd_parms * parms, void *dummy,
     437                                      const char *arg)
     438{
     439    gnutls_srvconf_rec *sc =
     440        (gnutls_srvconf_rec *) ap_get_module_config(parms->server->
     441                                                  module_config,
     442                                                  &gnutls_module);
     443    sc->key_file =  apr_pstrdup(parms->pool, arg);
     444    return NULL;
     445}
     446
     447static const char *gnutls_set_enabled(cmd_parms * parms, void *dummy,
     448                                      const char *arg)
     449{
     450    gnutls_srvconf_rec *sc =
     451        (gnutls_srvconf_rec *) ap_get_module_config(parms->server->
     452                                                  module_config,
     453                                                  &gnutls_module);
     454    if (!strcasecmp(arg, "On")) {
     455        sc->enabled = GNUTLS_ENABLED_TRUE;
     456    }
     457    else if (!strcasecmp(arg, "Off")) {
     458        sc->enabled = GNUTLS_ENABLED_FALSE;
     459    }
     460    else {
     461        return "GnuTLSEnable must be set to 'On' or 'Off'";
     462    }
     463
     464    return NULL;
     465}
     466
    397467static const command_rec gnutls_cmds[] = {
    398     AP_INIT_FLAG("GnuTLSEnable", ap_set_flag_slot,
    399                  (void *) APR_OFFSETOF(gnutls_srvconf_t, enabled), RSRC_CONF,
    400                  "Whether this server has GnuTLS Enabled. Default: Off"),
    401     AP_INIT_TAKE1("GnuTLSCertificateFile", ap_set_string_slot,
    402                   (void *) APR_OFFSETOF(gnutls_srvconf_t, cert_file),
     468    AP_INIT_TAKE1("GnuTLSCertificateFile", gnutls_set_cert_file,
     469                  NULL,
    403470                  RSRC_CONF,
    404471                  "SSL Server Key file"),
    405     AP_INIT_TAKE1("GnuTLSKeyFile", ap_set_string_slot,
    406                   (void *) APR_OFFSETOF(gnutls_srvconf_t, key_file),
     472    AP_INIT_TAKE1("GnuTLSKeyFile", gnutls_set_key_file,
     473                  NULL,
    407474                  RSRC_CONF,
    408475                  "SSL Server Certificate file"),
     476    AP_INIT_TAKE1("GnuTLSEnable", gnutls_set_enabled,
     477                 NULL, RSRC_CONF,
     478                 "Whether this server has GnuTLS Enabled. Default: Off"),
     479
    409480    {NULL}
    410481};
     
    412483/* TODO: CACertificateFile & Client Authentication
    413484 *    AP_INIT_TAKE1("GnuTLSCACertificateFile", ap_set_server_string_slot,
    414  *                 (void *) APR_OFFSETOF(gnutls_srvconf_t, key_file), NULL,
     485 *                 (void *) APR_OFFSETOF(gnutls_srvconf_rec, key_file), NULL,
    415486 *                 RSRC_CONF,
    416487 *                 "CA"),
     
    431502     *          ssl_io_filter_Upgrade, NULL, AP_FTYPE_PROTOCOL + 5);
    432503     */
    433 
     504#ifdef GNUTLS_AS_FILTER
    434505    ap_register_input_filter(GNUTLS_INPUT_FILTER_NAME, gnutls_filter_input,
    435506                             NULL, AP_FTYPE_CONNECTION + 5);
    436507    ap_register_output_filter(GNUTLS_OUTPUT_FILTER_NAME, gnutls_filter_output,
    437508                              NULL, AP_FTYPE_CONNECTION + 5);
    438 
     509#endif
    439510}
    440511
    441512static void *gnutls_config_server_create(apr_pool_t * p, server_rec * s)
    442513{
    443     gnutls_srvconf_t *sc = apr_pcalloc(p, sizeof *sc);
     514    int i;
     515    gnutls_srvconf_rec *sc = apr_pcalloc(p, sizeof(*sc));
    444516
    445517    sc->enabled = GNUTLS_ENABLED_FALSE;
     518    sc->non_https = 0;
    446519
    447520    gnutls_certificate_allocate_credentials(&sc->certs);
    448 
     521    gnutls_anon_allocate_server_credentials(&sc->anoncred);
    449522    sc->key_file = NULL;
    450523    sc->cert_file = NULL;
     524
     525    i = 0;
     526    sc->ciphers[i++] = GNUTLS_CIPHER_RIJNDAEL_128_CBC;
     527    sc->ciphers[i++] = GNUTLS_CIPHER_ARCFOUR_128;
     528    sc->ciphers[i++] = GNUTLS_CIPHER_3DES_CBC;
     529    sc->ciphers[i++] = GNUTLS_CIPHER_ARCFOUR_40;
     530    sc->ciphers[i]   = 0;
     531
     532    i = 0;
     533    sc->key_exchange[i++] = GNUTLS_KX_RSA;
     534    sc->key_exchange[i++] = GNUTLS_KX_RSA_EXPORT;
     535    sc->key_exchange[i++] = GNUTLS_KX_DHE_RSA;
     536    sc->key_exchange[i++] = GNUTLS_KX_DHE_DSS;
     537    sc->key_exchange[i] = 0;
     538
     539    i = 0;
     540    sc->macs[i++] = GNUTLS_MAC_MD5;
     541    sc->macs[i++] = GNUTLS_MAC_SHA;
     542    sc->macs[i++] = GNUTLS_MAC_RMD160;
     543    sc->macs[i] = 0;
     544
     545    i = 0;
     546    sc->protocol[i++] = GNUTLS_TLS1_1;
     547    sc->protocol[i++] = GNUTLS_TLS1;
     548    sc->protocol[i++] = GNUTLS_SSL3;
     549    sc->protocol[i] = 0;
     550
     551    i = 0;
     552    sc->compression[i++] = GNUTLS_COMP_NULL;
     553    sc->compression[i++] = GNUTLS_COMP_ZLIB;
     554    sc->compression[i++] = GNUTLS_COMP_LZO;
     555    sc->compression[i] = 0;
     556
    451557    return sc;
    452558}
Note: See TracChangeset for help on using the changeset viewer.