Changeset 6a8a839 in mod_gnutls
- Timestamp:
- Sep 27, 2004, 2:54:58 AM (18 years ago)
- Branches:
- asyncio, debian/master, debian/stretch-backports, jessie-backports, main, master, msva, proxy-ticket, upstream
- Children:
- aa99b13
- Parents:
- 16068f4
- Location:
- src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Makefile.am
r16068f4 r6a8a839 3 3 libmod_gnutls_la_SOURCES = mod_gnutls.c 4 4 libmod_gnutls_la_CFLAGS = -Wall ${MODULE_CFLAGS} 5 libmod_gnutls_la_LDFLAGS = 5 libmod_gnutls_la_LDFLAGS = ${MODULE_LIBS} 6 6 7 7 lib_LTLIBRARIES = libmod_gnutls.la -
src/mod_gnutls.c
r16068f4 r6a8a839 35 35 module AP_MODULE_DECLARE_DATA gnutls_module; 36 36 37 #ifdef GNUTLS_AS_FILTER 37 38 #define GNUTLS_OUTPUT_FILTER_NAME "GnuTLS Output Filter" 38 39 #define GNUTLS_INPUT_FILTER_NAME "GnuTLS Input Filter" 40 #endif 39 41 40 42 #define GNUTLS_ENABLED_FALSE 0 … … 42 44 43 45 44 typedef struct gnutls_srvconf_t gnutls_srvconf_t; 45 struct gnutls_srvconf_t 46 { 46 typedef struct { 47 47 gnutls_certificate_credentials_t certs; 48 gnutls_anon_server_credentials_t anoncred; 48 49 char *key_file; 49 50 char *cert_file; 50 51 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; 52 59 53 60 typedef struct gnutls_handle_t gnutls_handle_t; 54 61 struct gnutls_handle_t 55 62 { 56 gnutls_srvconf_ t*sc;63 gnutls_srvconf_rec *sc; 57 64 gnutls_session_t session; 65 #ifdef GNUTLS_AS_FILTER 58 66 ap_filter_t *input_filter; 59 67 apr_bucket_brigade *input_bb; 60 68 apr_read_type_e input_block; 69 #endif 61 70 }; 62 71 72 #ifdef GNUTLS_AS_FILTER 63 73 static apr_status_t gnutls_filter_input(ap_filter_t * f, 64 74 apr_bucket_brigade * bb, … … 106 116 } 107 117 118 #endif /* GNUTLS_AS_FILTER */ 119 108 120 static apr_status_t gnutls_cleanup_pre_config(void *data) 109 121 { … … 135 147 server_rec * base_server) 136 148 { 137 gnutls_srvconf_ t*sc;149 gnutls_srvconf_rec *sc; 138 150 server_rec *s; 139 151 gnutls_dh_params_t dh_params; … … 142 154 143 155 /* 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); 148 160 149 161 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, 151 163 &gnutls_module); 152 164 if (sc->cert_file != NULL && sc->key_file != NULL) { … … 154 166 sc->key_file, 155 167 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 ){ 158 172 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 170 178 171 179 ap_add_version_component(p, "GnuTLS/" LIBGNUTLS_VERSION); … … 175 183 static const char *gnutls_hook_http_method(const request_rec * r) 176 184 { 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, 179 187 &gnutls_module); 180 188 … … 188 196 static apr_port_t gnutls_hook_default_port(const request_rec * r) 189 197 { 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, 192 200 &gnutls_module); 193 201 … … 199 207 } 200 208 209 #ifdef GNUTLS_AS_FILTER 201 210 /** 202 211 * From mod_ssl / ssl_engine_io.c … … 337 346 return 0; 338 347 } 348 #endif /* GNUTLS_AS_FILTER */ 339 349 340 350 static int gnutls_hook_pre_connection(conn_rec * c, void *csd) … … 342 352 #ifndef GNUTLS_AS_FILTER 343 353 int cfd; 354 int ret; 344 355 #endif 345 356 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-> 348 359 module_config, 349 360 &gnutls_module); … … 358 369 gnutls_init(&ctxt->session, GNUTLS_SERVER); 359 370 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); 361 376 362 377 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 367 382 368 383 ap_set_module_config(c->conn_config, &gnutls_module, ctxt); … … 378 393 apr_os_sock_get(&cfd, csd); 379 394 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); 380 421 #endif 381 422 return OK; 382 423 } 383 424 384 static const char *gnutls_set_c a_file(cmd_parms * parms, void *dummy,425 static const char *gnutls_set_cert_file(cmd_parms * parms, void *dummy, 385 426 const char *arg) 386 427 { 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-> 389 430 module_config, 390 431 &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); 394 433 return NULL; 395 434 } 396 435 436 static 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 447 static 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 397 467 static 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, 403 470 RSRC_CONF, 404 471 "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, 407 474 RSRC_CONF, 408 475 "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 409 480 {NULL} 410 481 }; … … 412 483 /* TODO: CACertificateFile & Client Authentication 413 484 * 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, 415 486 * RSRC_CONF, 416 487 * "CA"), … … 431 502 * ssl_io_filter_Upgrade, NULL, AP_FTYPE_PROTOCOL + 5); 432 503 */ 433 504 #ifdef GNUTLS_AS_FILTER 434 505 ap_register_input_filter(GNUTLS_INPUT_FILTER_NAME, gnutls_filter_input, 435 506 NULL, AP_FTYPE_CONNECTION + 5); 436 507 ap_register_output_filter(GNUTLS_OUTPUT_FILTER_NAME, gnutls_filter_output, 437 508 NULL, AP_FTYPE_CONNECTION + 5); 438 509 #endif 439 510 } 440 511 441 512 static void *gnutls_config_server_create(apr_pool_t * p, server_rec * s) 442 513 { 443 gnutls_srvconf_t *sc = apr_pcalloc(p, sizeof *sc); 514 int i; 515 gnutls_srvconf_rec *sc = apr_pcalloc(p, sizeof(*sc)); 444 516 445 517 sc->enabled = GNUTLS_ENABLED_FALSE; 518 sc->non_https = 0; 446 519 447 520 gnutls_certificate_allocate_credentials(&sc->certs); 448 521 gnutls_anon_allocate_server_credentials(&sc->anoncred); 449 522 sc->key_file = NULL; 450 523 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 451 557 return sc; 452 558 }
Note: See TracChangeset
for help on using the changeset viewer.