And we were all just getting so warm and fuzzy here... ;-) There are several areas where RFC 7540 says something that - let's say it like this - applies maybe to the Internet - whatever that is - but that Apache httpd should and will work in environments that have other needs.
Instead of a unspecific "H2Compliance", we can make individual directive to address these parts. We already have: - H2Direct on|off, can enable direct mode on cleartext and TLS connections We can add - H2ModernTLSOnly on|off, to enforce TLS params as specified in the RFC and also enforced by modern browsers as described in https://wiki.mozilla.org/Security/Server_Side_TLS#Modern_compatibility - H2UpgradeInTLS on|off, to allow HTTP/1.1 style Upgrade: on TLS connections ... (insert your wishes here) //Stefan > Am 14.10.2015 um 16:55 schrieb Roy T. Fielding <field...@gbiv.com>: > > Can you please choose a more specific directive name? Like "LimitTLSunderH2". > > We don't have switches for RFC compliance. We do have switches for stupid WG > political positions that contradict common sense and are not applicable to > non-Internet deployments. > > ....Roy > > >> On Oct 14, 2015, at 5:10 AM, ic...@apache.org wrote: >> >> Author: icing >> Date: Wed Oct 14 12:10:11 2015 >> New Revision: 1708593 >> >> URL: http://svn.apache.org/viewvc?rev=1708593&view=rev >> Log: >> mod_http2: new directive H2Compliance on/off, checking TLS protocol and >> cipher against RFC7540 >> >> Modified: >> httpd/httpd/trunk/docs/manual/mod/mod_http2.xml >> httpd/httpd/trunk/modules/http2/h2_config.c >> httpd/httpd/trunk/modules/http2/h2_config.h >> httpd/httpd/trunk/modules/http2/h2_conn.c >> httpd/httpd/trunk/modules/http2/h2_h2.c >> httpd/httpd/trunk/modules/http2/h2_h2.h >> httpd/httpd/trunk/modules/http2/h2_switch.c >> >> Modified: httpd/httpd/trunk/docs/manual/mod/mod_http2.xml >> URL: >> http://svn.apache.org/viewvc/httpd/httpd/trunk/docs/manual/mod/mod_http2.xml?rev=1708593&r1=1708592&r2=1708593&view=diff >> ============================================================================== >> --- httpd/httpd/trunk/docs/manual/mod/mod_http2.xml (original) >> +++ httpd/httpd/trunk/docs/manual/mod/mod_http2.xml Wed Oct 14 12:10:11 2015 >> @@ -74,11 +74,11 @@ >> Direct communication means that if the first bytes received >> by the >> server on a connection match the HTTP/2 preamble, the HTTP/2 >> protocol is switched to immediately without further >> negotiation. >> - This mode falls outside the RFC 7540 but has become widely >> implemented >> - on cleartext ports as it is very convenient for development >> and testing. >> + This mode is defined in RFC 7540 for the cleartext (h2c) >> case. Its >> + use on TLS connections is not allowed by the standard. >> </p> >> <p> >> - Since this detection implies that the client will send data >> on >> + Since this detection requires that the client will send >> data on >> new connection immediately, direct HTTP/2 mode is disabled by >> default. >> </p> >> >> Modified: httpd/httpd/trunk/modules/http2/h2_config.c >> URL: >> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_config.c?rev=1708593&r1=1708592&r2=1708593&view=diff >> ============================================================================== >> --- httpd/httpd/trunk/modules/http2/h2_config.c (original) >> +++ httpd/httpd/trunk/modules/http2/h2_config.c Wed Oct 14 12:10:11 2015 >> @@ -49,6 +49,7 @@ static h2_config defconf = { >> 0, /* serialize headers */ >> 0, /* h2 direct mode */ >> -1, /* # session extra files */ >> + 1, /* rfc 7540 compliance */ >> }; >> >> static int files_per_session = 0; >> @@ -100,6 +101,7 @@ static void *h2_config_create(apr_pool_t >> conf->serialize_headers = DEF_VAL; >> conf->h2_direct = DEF_VAL; >> conf->session_extra_files = DEF_VAL; >> + conf->rfc_compliance = DEF_VAL; >> return conf; >> } >> >> @@ -138,6 +140,7 @@ void *h2_config_merge(apr_pool_t *pool, >> n->serialize_headers = H2_CONFIG_GET(add, base, serialize_headers); >> n->h2_direct = H2_CONFIG_GET(add, base, h2_direct); >> n->session_extra_files = H2_CONFIG_GET(add, base, session_extra_files); >> + n->rfc_compliance = H2_CONFIG_GET(add, base, rfc_compliance); >> >> return n; >> } >> @@ -162,6 +165,8 @@ int h2_config_geti(h2_config *conf, h2_c >> return H2_CONFIG_GET(conf, &defconf, alt_svc_max_age); >> case H2_CONF_SER_HEADERS: >> return H2_CONFIG_GET(conf, &defconf, serialize_headers); >> + case H2_CONF_COMPLIANCE: >> + return H2_CONFIG_GET(conf, &defconf, rfc_compliance); >> case H2_CONF_DIRECT: >> return H2_CONFIG_GET(conf, &defconf, h2_direct); >> case H2_CONF_SESSION_FILES: >> @@ -332,8 +337,25 @@ static const char *h2_conf_set_direct(cm >> return "value must be On or Off"; >> } >> >> -#define AP_END_CMD AP_INIT_TAKE1(NULL, NULL, NULL, RSRC_CONF, NULL) >> +static const char *h2_conf_set_compliance(cmd_parms *parms, >> + void *arg, const char *value) >> +{ >> + h2_config *cfg = h2_config_sget(parms->server); >> + if (!strcasecmp(value, "On")) { >> + cfg->rfc_compliance = 1; >> + return NULL; >> + } >> + else if (!strcasecmp(value, "Off")) { >> + cfg->rfc_compliance = 0; >> + return NULL; >> + } >> + >> + (void)arg; >> + return "value must be On or Off"; >> +} >> + >> >> +#define AP_END_CMD AP_INIT_TAKE1(NULL, NULL, NULL, RSRC_CONF, NULL) >> >> const command_rec h2_cmds[] = { >> AP_INIT_TAKE1("H2MaxSessionStreams", h2_conf_set_max_streams, NULL, >> @@ -354,6 +376,8 @@ const command_rec h2_cmds[] = { >> RSRC_CONF, "set the maximum age (in seconds) that client >> can rely on alt-svc information"), >> AP_INIT_TAKE1("H2SerializeHeaders", h2_conf_set_serialize_headers, NULL, >> RSRC_CONF, "on to enable header serialization for >> compatibility"), >> + AP_INIT_TAKE1("H2Compliance", h2_conf_set_compliance, NULL, >> + RSRC_CONF, "off to disable strict compliance to RFC >> 7540"), >> AP_INIT_TAKE1("H2Direct", h2_conf_set_direct, NULL, >> RSRC_CONF, "on to enable direct HTTP/2 mode"), >> AP_INIT_TAKE1("H2SessionExtraFiles", h2_conf_set_session_extra_files, >> NULL, >> >> Modified: httpd/httpd/trunk/modules/http2/h2_config.h >> URL: >> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_config.h?rev=1708593&r1=1708592&r2=1708593&view=diff >> ============================================================================== >> --- httpd/httpd/trunk/modules/http2/h2_config.h (original) >> +++ httpd/httpd/trunk/modules/http2/h2_config.h Wed Oct 14 12:10:11 2015 >> @@ -34,6 +34,7 @@ typedef enum { >> H2_CONF_SER_HEADERS, >> H2_CONF_DIRECT, >> H2_CONF_SESSION_FILES, >> + H2_CONF_COMPLIANCE, >> } h2_config_var_t; >> >> /* Apache httpd module configuration for h2. */ >> @@ -51,6 +52,7 @@ typedef struct h2_config { >> processing, better compatibility */ >> int h2_direct; /* if mod_h2 is active directly */ >> int session_extra_files; /* # of extra files a session may keep open >> */ >> + int rfc_compliance; /* Comply with all aspects of RFC 7540 */ >> >> } h2_config; >> >> >> >> Modified: httpd/httpd/trunk/modules/http2/h2_conn.c >> URL: >> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_conn.c?rev=1708593&r1=1708592&r2=1708593&view=diff >> ============================================================================== >> --- httpd/httpd/trunk/modules/http2/h2_conn.c (original) >> +++ httpd/httpd/trunk/modules/http2/h2_conn.c Wed Oct 14 12:10:11 2015 >> @@ -32,6 +32,7 @@ >> #include "h2_session.h" >> #include "h2_stream.h" >> #include "h2_stream_set.h" >> +#include "h2_h2.h" >> #include "h2_task.h" >> #include "h2_worker.h" >> #include "h2_workers.h" >> @@ -177,6 +178,11 @@ apr_status_t h2_conn_main(conn_rec *c) >> return APR_EGENERAL; >> } >> >> + if (!h2_is_security_compliant(c, 1)) { >> + nghttp2_submit_goaway(session->ngh2, NGHTTP2_FLAG_NONE, 0, >> + NGHTTP2_INADEQUATE_SECURITY, NULL, 0); >> + } >> + >> status = h2_session_process(session); >> >> /* Make sure this connection gets closed properly. */ >> >> Modified: httpd/httpd/trunk/modules/http2/h2_h2.c >> URL: >> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_h2.c?rev=1708593&r1=1708592&r2=1708593&view=diff >> ============================================================================== >> --- httpd/httpd/trunk/modules/http2/h2_h2.c (original) >> +++ httpd/httpd/trunk/modules/http2/h2_h2.c Wed Oct 14 12:10:11 2015 >> @@ -54,6 +54,354 @@ APR_DECLARE_OPTIONAL_FN(int, ssl_is_http >> static int (*opt_ssl_engine_disable)(conn_rec*); >> static int (*opt_ssl_is_https)(conn_rec*); >> /******************************************************************************* >> + * SSL var lookup >> + */ >> +APR_DECLARE_OPTIONAL_FN(char *, ssl_var_lookup, >> + (apr_pool_t *, server_rec *, >> + conn_rec *, request_rec *, >> + char *)); >> +static char *(*opt_ssl_var_lookup)(apr_pool_t *, server_rec *, >> + conn_rec *, request_rec *, >> + char *); >> + >> +/******************************************************************************* >> + * Check connection security requirements of RFC 7540 >> + */ >> + >> +/* >> + * Black Listed Ciphers from RFC 7549 Appendix A >> + * >> + */ >> +static const char *RFC7540_names[] = { >> + /* ciphers with NULL encrpytion */ >> + "NULL-MD5", /* TLS_NULL_WITH_NULL_NULL */ >> + /* same */ /* TLS_RSA_WITH_NULL_MD5 */ >> + "NULL-SHA", /* TLS_RSA_WITH_NULL_SHA */ >> + "NULL-SHA256", /* TLS_RSA_WITH_NULL_SHA256 */ >> + "PSK-NULL-SHA", /* TLS_PSK_WITH_NULL_SHA */ >> + "DHE-PSK-NULL-SHA", /* TLS_DHE_PSK_WITH_NULL_SHA */ >> + "RSA-PSK-NULL-SHA", /* TLS_RSA_PSK_WITH_NULL_SHA */ >> + "PSK-NULL-SHA256", /* TLS_PSK_WITH_NULL_SHA256 */ >> + "PSK-NULL-SHA384", /* TLS_PSK_WITH_NULL_SHA384 */ >> + "DHE-PSK-NULL-SHA256", /* TLS_DHE_PSK_WITH_NULL_SHA256 */ >> + "DHE-PSK-NULL-SHA384", /* TLS_DHE_PSK_WITH_NULL_SHA384 */ >> + "RSA-PSK-NULL-SHA256", /* TLS_RSA_PSK_WITH_NULL_SHA256 */ >> + "RSA-PSK-NULL-SHA384", /* TLS_RSA_PSK_WITH_NULL_SHA384 */ >> + "ECDH-ECDSA-NULL-SHA", /* TLS_ECDH_ECDSA_WITH_NULL_SHA */ >> + "ECDHE-ECDSA-NULL-SHA", /* TLS_ECDHE_ECDSA_WITH_NULL_SHA */ >> + "ECDH-RSA-NULL-SHA", /* TLS_ECDH_RSA_WITH_NULL_SHA */ >> + "ECDHE-RSA-NULL-SHA", /* TLS_ECDHE_RSA_WITH_NULL_SHA */ >> + "AECDH-NULL-SHA", /* TLS_ECDH_anon_WITH_NULL_SHA */ >> + "ECDHE-PSK-NULL-SHA", /* TLS_ECDHE_PSK_WITH_NULL_SHA */ >> + "ECDHE-PSK-NULL-SHA256", /* TLS_ECDHE_PSK_WITH_NULL_SHA256 */ >> + "ECDHE-PSK-NULL-SHA384", /* TLS_ECDHE_PSK_WITH_NULL_SHA384 */ >> + >> + /* DES/3DES ciphers */ >> + "PSK-3DES-EDE-CBC-SHA", /* TLS_PSK_WITH_3DES_EDE_CBC_SHA */ >> + "DHE-PSK-3DES-EDE-CBC-SHA", /* >> TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA */ >> + "RSA-PSK-3DES-EDE-CBC-SHA", /* >> TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA */ >> + "ECDH-ECDSA-DES-CBC3-SHA", /* >> TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA */ >> + "ECDHE-ECDSA-DES-CBC3-SHA", /* >> TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA */ >> + "ECDH-RSA-DES-CBC3-SHA", /* >> TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA */ >> + "ECDHE-RSA-DES-CBC3-SHA", /* >> TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA */ >> + "AECDH-DES-CBC3-SHA", /* >> TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA */ >> + "SRP-3DES-EDE-CBC-SHA", /* >> TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA */ >> + "SRP-RSA-3DES-EDE-CBC-SHA", /* >> TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA */ >> + "SRP-DSS-3DES-EDE-CBC-SHA", /* >> TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA */ >> + "ECDHE-PSK-3DES-EDE-CBC-SHA", /* >> TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA */ >> + "DES-CBC-SHA", /* TLS_RSA_WITH_DES_CBC_SHA */ >> + "DES-CBC3-SHA", /* TLS_RSA_WITH_3DES_EDE_CBC_SHA */ >> + "DHE-DSS-DES-CBC3-SHA", /* >> TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA */ >> + "DHE-RSA-DES-CBC-SHA", /* TLS_DHE_RSA_WITH_DES_CBC_SHA */ >> + "DHE-RSA-DES-CBC3-SHA", /* >> TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA */ >> + "ADH-DES-CBC-SHA", /* TLS_DH_anon_WITH_DES_CBC_SHA */ >> + "ADH-DES-CBC3-SHA", /* >> TLS_DH_anon_WITH_3DES_EDE_CBC_SHA */ >> + "EXP-DH-DSS-DES-CBC-SHA", /* >> TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA */ >> + "DH-DSS-DES-CBC-SHA", /* TLS_DH_DSS_WITH_DES_CBC_SHA */ >> + "DH-DSS-DES-CBC3-SHA", /* TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA >> */ >> + "EXP-DH-RSA-DES-CBC-SHA", /* >> TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA */ >> + "DH-RSA-DES-CBC-SHA", /* TLS_DH_RSA_WITH_DES_CBC_SHA */ >> + "DH-RSA-DES-CBC3-SHA", /* TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA >> */ >> + >> + /* blacklisted EXPORT ciphers */ >> + "EXP-RC4-MD5", /* TLS_RSA_EXPORT_WITH_RC4_40_MD5 */ >> + "EXP-RC2-CBC-MD5", /* >> TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 */ >> + "EXP-DES-CBC-SHA", /* >> TLS_RSA_EXPORT_WITH_DES40_CBC_SHA */ >> + "EXP-DHE-DSS-DES-CBC-SHA", /* >> TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA */ >> + "EXP-DHE-RSA-DES-CBC-SHA", /* >> TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA */ >> + "EXP-ADH-DES-CBC-SHA", /* >> TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA */ >> + "EXP-ADH-RC4-MD5", /* >> TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 */ >> + >> + /* blacklisted RC4 encryption */ >> + "RC4-MD5", /* TLS_RSA_WITH_RC4_128_MD5 */ >> + "RC4-SHA", /* TLS_RSA_WITH_RC4_128_SHA */ >> + "ADH-RC4-MD5", /* TLS_DH_anon_WITH_RC4_128_MD5 */ >> + "KRB5-RC4-SHA", /* TLS_KRB5_WITH_RC4_128_SHA */ >> + "KRB5-RC4-MD5", /* TLS_KRB5_WITH_RC4_128_MD5 */ >> + "EXP-KRB5-RC4-SHA", /* TLS_KRB5_EXPORT_WITH_RC4_40_SHA >> */ >> + "EXP-KRB5-RC4-MD5", /* TLS_KRB5_EXPORT_WITH_RC4_40_MD5 >> */ >> + "PSK-RC4-SHA", /* TLS_PSK_WITH_RC4_128_SHA */ >> + "DHE-PSK-RC4-SHA", /* TLS_DHE_PSK_WITH_RC4_128_SHA */ >> + "RSA-PSK-RC4-SHA", /* TLS_RSA_PSK_WITH_RC4_128_SHA */ >> + "ECDH-ECDSA-RC4-SHA", /* TLS_ECDH_ECDSA_WITH_RC4_128_SHA >> */ >> + "ECDHE-ECDSA-RC4-SHA", /* TLS_ECDHE_ECDSA_WITH_RC4_128_SHA >> */ >> + "ECDH-RSA-RC4-SHA", /* TLS_ECDH_RSA_WITH_RC4_128_SHA */ >> + "ECDHE-RSA-RC4-SHA", /* TLS_ECDHE_RSA_WITH_RC4_128_SHA */ >> + "AECDH-RC4-SHA", /* TLS_ECDH_anon_WITH_RC4_128_SHA */ >> + "ECDHE-PSK-RC4-SHA", /* TLS_ECDHE_PSK_WITH_RC4_128_SHA */ >> + >> + /* blacklisted AES128 encrpytion ciphers */ >> + "AES128-SHA256", /* TLS_RSA_WITH_AES_128_CBC_SHA */ >> + "DH-DSS-AES128-SHA", /* TLS_DH_DSS_WITH_AES_128_CBC_SHA >> */ >> + "DH-RSA-AES128-SHA", /* TLS_DH_RSA_WITH_AES_128_CBC_SHA >> */ >> + "DHE-DSS-AES128-SHA", /* TLS_DHE_DSS_WITH_AES_128_CBC_SHA >> */ >> + "DHE-RSA-AES128-SHA", /* TLS_DHE_RSA_WITH_AES_128_CBC_SHA >> */ >> + "ADH-AES128-SHA", /* TLS_DH_anon_WITH_AES_128_CBC_SHA >> */ >> + "AES128-SHA256", /* TLS_RSA_WITH_AES_128_CBC_SHA256 >> */ >> + "DH-DSS-AES128-SHA256", /* >> TLS_DH_DSS_WITH_AES_128_CBC_SHA256 */ >> + "DH-RSA-AES128-SHA256", /* >> TLS_DH_RSA_WITH_AES_128_CBC_SHA256 */ >> + "DHE-DSS-AES128-SHA256", /* >> TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 */ >> + "DHE-RSA-AES128-SHA256", /* >> TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 */ >> + "ECDH-ECDSA-AES128-SHA", /* >> TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA */ >> + "ECDHE-ECDSA-AES128-SHA", /* >> TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA */ >> + "ECDH-RSA-AES128-SHA", /* >> TLS_ECDH_RSA_WITH_AES_128_CBC_SHA */ >> + "ECDHE-RSA-AES128-SHA", /* >> TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA */ >> + "AECDH-AES128-SHA", /* >> TLS_ECDH_anon_WITH_AES_128_CBC_SHA */ >> + "ECDHE-ECDSA-AES128-SHA256", /* >> TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 */ >> + "ECDH-ECDSA-AES128-SHA256", /* >> TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256 */ >> + "ECDHE-RSA-AES128-SHA256", /* >> TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 */ >> + "ECDH-RSA-AES128-SHA256", /* >> TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256 */ >> + "ADH-AES128-SHA256", /* >> TLS_DH_anon_WITH_AES_128_CBC_SHA256 */ >> + "PSK-AES128-CBC-SHA", /* TLS_PSK_WITH_AES_128_CBC_SHA */ >> + "DHE-PSK-AES128-CBC-SHA", /* TLS_DHE_PSK_WITH_AES_128_CBC_SHA >> */ >> + "RSA-PSK-AES128-CBC-SHA", /* TLS_RSA_PSK_WITH_AES_128_CBC_SHA >> */ >> + "PSK-AES128-CBC-SHA256", /* TLS_PSK_WITH_AES_128_CBC_SHA256 >> */ >> + "DHE-PSK-AES128-CBC-SHA256", /* >> TLS_DHE_PSK_WITH_AES_128_CBC_SHA256 */ >> + "RSA-PSK-AES128-CBC-SHA256", /* >> TLS_RSA_PSK_WITH_AES_128_CBC_SHA256 */ >> + "ECDHE-PSK-AES128-CBC-SHA", /* >> TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA */ >> + "ECDHE-PSK-AES128-CBC-SHA256", /* >> TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 */ >> + "AES128-CCM", /* TLS_RSA_WITH_AES_128_CCM */ >> + "AES128-CCM8", /* TLS_RSA_WITH_AES_128_CCM_8 */ >> + "PSK-AES128-CCM", /* TLS_PSK_WITH_AES_128_CCM */ >> + "PSK-AES128-CCM8", /* TLS_PSK_WITH_AES_128_CCM_8 */ >> + "AES128-GCM-SHA256", /* TLS_RSA_WITH_AES_128_GCM_SHA256 >> */ >> + "DH-RSA-AES128-GCM-SHA256", /* >> TLS_DH_RSA_WITH_AES_128_GCM_SHA256 */ >> + "DH-DSS-AES128-GCM-SHA256", /* >> TLS_DH_DSS_WITH_AES_128_GCM_SHA256 */ >> + "ADH-AES128-GCM-SHA256", /* >> TLS_DH_anon_WITH_AES_128_GCM_SHA256 */ >> + "PSK-AES128-GCM-SHA256", /* TLS_PSK_WITH_AES_128_GCM_SHA256 >> */ >> + "RSA-PSK-AES128-GCM-SHA256", /* >> TLS_RSA_PSK_WITH_AES_128_GCM_SHA256 */ >> + "ECDH-ECDSA-AES128-GCM-SHA256", /* >> TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256 */ >> + "ECDH-RSA-AES128-GCM-SHA256", /* >> TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256 */ >> + "SRP-AES-128-CBC-SHA", /* TLS_SRP_SHA_WITH_AES_128_CBC_SHA >> */ >> + "SRP-RSA-AES-128-CBC-SHA", /* >> TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA */ >> + "SRP-DSS-AES-128-CBC-SHA", /* >> TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA */ >> + >> + /* blacklisted AES256 encrpytion ciphers */ >> + "AES256-SHA", /* TLS_RSA_WITH_AES_256_CBC_SHA */ >> + "DH-DSS-AES256-SHA", /* TLS_DH_DSS_WITH_AES_256_CBC_SHA >> */ >> + "DH-RSA-AES256-SHA", /* TLS_DH_RSA_WITH_AES_256_CBC_SHA >> */ >> + "DHE-DSS-AES256-SHA", /* TLS_DHE_DSS_WITH_AES_256_CBC_SHA >> */ >> + "DHE-RSA-AES256-SHA", /* TLS_DHE_RSA_WITH_AES_256_CBC_SHA >> */ >> + "ADH-AES256-SHA", /* TLS_DH_anon_WITH_AES_256_CBC_SHA >> */ >> + "AES256-SHA256", /* TLS_RSA_WITH_AES_256_CBC_SHA256 >> */ >> + "DH-DSS-AES256-SHA256", /* >> TLS_DH_DSS_WITH_AES_256_CBC_SHA256 */ >> + "DH-RSA-AES256-SHA256", /* >> TLS_DH_RSA_WITH_AES_256_CBC_SHA256 */ >> + "DHE-DSS-AES256-SHA256", /* >> TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 */ >> + "DHE-RSA-AES256-SHA256", /* >> TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 */ >> + "ADH-AES256-SHA256", /* >> TLS_DH_anon_WITH_AES_256_CBC_SHA256 */ >> + "ECDH-ECDSA-AES256-SHA", /* >> TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA */ >> + "ECDHE-ECDSA-AES256-SHA", /* >> TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA */ >> + "ECDH-RSA-AES256-SHA", /* >> TLS_ECDH_RSA_WITH_AES_256_CBC_SHA */ >> + "ECDHE-RSA-AES256-SHA", /* >> TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA */ >> + "AECDH-AES256-SHA", /* >> TLS_ECDH_anon_WITH_AES_256_CBC_SHA */ >> + "ECDHE-ECDSA-AES256-SHA384", /* >> TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 */ >> + "ECDH-ECDSA-AES256-SHA384", /* >> TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384 */ >> + "ECDHE-RSA-AES256-SHA384", /* >> TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 */ >> + "ECDH-RSA-AES256-SHA384", /* >> TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384 */ >> + "PSK-AES256-CBC-SHA", /* TLS_PSK_WITH_AES_256_CBC_SHA */ >> + "DHE-PSK-AES256-CBC-SHA", /* TLS_DHE_PSK_WITH_AES_256_CBC_SHA >> */ >> + "RSA-PSK-AES256-CBC-SHA", /* TLS_RSA_PSK_WITH_AES_256_CBC_SHA >> */ >> + "PSK-AES256-CBC-SHA384", /* TLS_PSK_WITH_AES_256_CBC_SHA384 >> */ >> + "DHE-PSK-AES256-CBC-SHA384", /* >> TLS_DHE_PSK_WITH_AES_256_CBC_SHA384 */ >> + "RSA-PSK-AES256-CBC-SHA384", /* >> TLS_RSA_PSK_WITH_AES_256_CBC_SHA384 */ >> + "ECDHE-PSK-AES256-CBC-SHA", /* >> TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA */ >> + "ECDHE-PSK-AES256-CBC-SHA384", /* >> TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 */ >> + "SRP-AES-256-CBC-SHA", /* TLS_SRP_SHA_WITH_AES_256_CBC_SHA >> */ >> + "SRP-RSA-AES-256-CBC-SHA", /* >> TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA */ >> + "SRP-DSS-AES-256-CBC-SHA", /* >> TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA */ >> + "AES256-CCM", /* TLS_RSA_WITH_AES_256_CCM */ >> + "AES256-CCM8", /* TLS_RSA_WITH_AES_256_CCM_8 */ >> + "PSK-AES256-CCM", /* TLS_PSK_WITH_AES_256_CCM */ >> + "PSK-AES256-CCM8", /* TLS_PSK_WITH_AES_256_CCM_8 */ >> + "AES256-GCM-SHA384", /* TLS_RSA_WITH_AES_256_GCM_SHA384 >> */ >> + "DH-RSA-AES256-GCM-SHA384", /* >> TLS_DH_RSA_WITH_AES_256_GCM_SHA384 */ >> + "DH-DSS-AES256-GCM-SHA384", /* >> TLS_DH_DSS_WITH_AES_256_GCM_SHA384 */ >> + "ADH-AES256-GCM-SHA384", /* >> TLS_DH_anon_WITH_AES_256_GCM_SHA384 */ >> + "PSK-AES256-GCM-SHA384", /* TLS_PSK_WITH_AES_256_GCM_SHA384 >> */ >> + "RSA-PSK-AES256-GCM-SHA384", /* >> TLS_RSA_PSK_WITH_AES_256_GCM_SHA384 */ >> + "ECDH-ECDSA-AES256-GCM-SHA384", /* >> TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384 */ >> + "ECDH-RSA-AES256-GCM-SHA384", /* >> TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384 */ >> + >> + /* blacklisted CAMELLIA128 encrpytion ciphers */ >> + "CAMELLIA128-SHA", /* >> TLS_RSA_WITH_CAMELLIA_128_CBC_SHA */ >> + "DH-DSS-CAMELLIA128-SHA", /* >> TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA */ >> + "DH-RSA-CAMELLIA128-SHA", /* >> TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA */ >> + "DHE-DSS-CAMELLIA128-SHA", /* >> TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA */ >> + "DHE-RSA-CAMELLIA128-SHA", /* >> TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA */ >> + "ADH-CAMELLIA128-SHA", /* >> TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA */ >> + "ECDHE-ECDSA-CAMELLIA128-SHA256", /* >> TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 */ >> + "ECDH-ECDSA-CAMELLIA128-SHA256", /* >> TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256 */ >> + "ECDHE-RSA-CAMELLIA128-SHA256", /* >> TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 */ >> + "ECDH-RSA-CAMELLIA128-SHA256", /* >> TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256 */ >> + "PSK-CAMELLIA128-SHA256", /* >> TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256 */ >> + "DHE-PSK-CAMELLIA128-SHA256", /* >> TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 */ >> + "RSA-PSK-CAMELLIA128-SHA256", /* >> TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256 */ >> + "ECDHE-PSK-CAMELLIA128-SHA256", /* >> TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256 */ >> + "CAMELLIA128-GCM-SHA256", /* >> TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256 */ >> + "DH-RSA-CAMELLIA128-GCM-SHA256", /* >> TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256 */ >> + "DH-DSS-CAMELLIA128-GCM-SHA256", /* >> TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256 */ >> + "ADH-CAMELLIA128-GCM-SHA256", /* >> TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256 */ >> + "ECDH-ECDSA-CAMELLIA128-GCM-SHA256",/* >> TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256 */ >> + "ECDH-RSA-CAMELLIA128-GCM-SHA256", /* >> TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256 */ >> + "PSK-CAMELLIA128-GCM-SHA256", /* >> TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256 */ >> + "RSA-PSK-CAMELLIA128-GCM-SHA256", /* >> TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256 */ >> + "CAMELLIA128-SHA256", /* >> TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 */ >> + "DH-DSS-CAMELLIA128-SHA256", /* >> TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256 */ >> + "DH-RSA-CAMELLIA128-SHA256", /* >> TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256 */ >> + "DHE-DSS-CAMELLIA128-SHA256", /* >> TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256 */ >> + "DHE-RSA-CAMELLIA128-SHA256", /* >> TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 */ >> + "ADH-CAMELLIA128-SHA256", /* >> TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256 */ >> + >> + /* blacklisted CAMELLIA256 encrpytion ciphers */ >> + "CAMELLIA256-SHA", /* >> TLS_RSA_WITH_CAMELLIA_256_CBC_SHA */ >> + "DH-RSA-CAMELLIA256-SHA", /* >> TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA */ >> + "DH-DSS-CAMELLIA256-SHA", /* >> TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA */ >> + "DHE-DSS-CAMELLIA256-SHA", /* >> TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA */ >> + "DHE-RSA-CAMELLIA256-SHA", /* >> TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA */ >> + "ADH-CAMELLIA256-SHA", /* >> TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA */ >> + "ECDHE-ECDSA-CAMELLIA256-SHA384", /* >> TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 */ >> + "ECDH-ECDSA-CAMELLIA256-SHA384", /* >> TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384 */ >> + "ECDHE-RSA-CAMELLIA256-SHA384", /* >> TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384 */ >> + "ECDH-RSA-CAMELLIA256-SHA384", /* >> TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384 */ >> + "PSK-CAMELLIA256-SHA384", /* >> TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384 */ >> + "DHE-PSK-CAMELLIA256-SHA384", /* >> TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 */ >> + "RSA-PSK-CAMELLIA256-SHA384", /* >> TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384 */ >> + "ECDHE-PSK-CAMELLIA256-SHA384", /* >> TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384 */ >> + "CAMELLIA256-SHA256", /* >> TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 */ >> + "DH-DSS-CAMELLIA256-SHA256", /* >> TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256 */ >> + "DH-RSA-CAMELLIA256-SHA256", /* >> TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256 */ >> + "DHE-DSS-CAMELLIA256-SHA256", /* >> TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256 */ >> + "DHE-RSA-CAMELLIA256-SHA256", /* >> TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 */ >> + "ADH-CAMELLIA256-SHA256", /* >> TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256 */ >> + "CAMELLIA256-GCM-SHA384", /* >> TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384 */ >> + "DH-RSA-CAMELLIA256-GCM-SHA384", /* >> TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384 */ >> + "DH-DSS-CAMELLIA256-GCM-SHA384", /* >> TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384 */ >> + "ADH-CAMELLIA256-GCM-SHA384", /* >> TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384 */ >> + "ECDH-ECDSA-CAMELLIA256-GCM-SHA384",/* >> TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384 */ >> + "ECDH-RSA-CAMELLIA256-GCM-SHA384", /* >> TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384 */ >> + "PSK-CAMELLIA256-GCM-SHA384", /* >> TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384 */ >> + "RSA-PSK-CAMELLIA256-GCM-SHA384", /* >> TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384 */ >> + >> + /* The blacklisted ARIA encrpytion ciphers */ >> + "ARIA128-SHA256", /* TLS_RSA_WITH_ARIA_128_CBC_SHA256 >> */ >> + "ARIA256-SHA384", /* TLS_RSA_WITH_ARIA_256_CBC_SHA384 >> */ >> + "DH-DSS-ARIA128-SHA256", /* >> TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256 */ >> + "DH-DSS-ARIA256-SHA384", /* >> TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384 */ >> + "DH-RSA-ARIA128-SHA256", /* >> TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256 */ >> + "DH-RSA-ARIA256-SHA384", /* >> TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384 */ >> + "DHE-DSS-ARIA128-SHA256", /* >> TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256 */ >> + "DHE-DSS-ARIA256-SHA384", /* >> TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384 */ >> + "DHE-RSA-ARIA128-SHA256", /* >> TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256 */ >> + "DHE-RSA-ARIA256-SHA384", /* >> TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384 */ >> + "ADH-ARIA128-SHA256", /* >> TLS_DH_anon_WITH_ARIA_128_CBC_SHA256 */ >> + "ADH-ARIA256-SHA384", /* >> TLS_DH_anon_WITH_ARIA_256_CBC_SHA384 */ >> + "ECDHE-ECDSA-ARIA128-SHA256", /* >> TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256 */ >> + "ECDHE-ECDSA-ARIA256-SHA384", /* >> TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384 */ >> + "ECDH-ECDSA-ARIA128-SHA256", /* >> TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256 */ >> + "ECDH-ECDSA-ARIA256-SHA384", /* >> TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384 */ >> + "ECDHE-RSA-ARIA128-SHA256", /* >> TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256 */ >> + "ECDHE-RSA-ARIA256-SHA384", /* >> TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384 */ >> + "ECDH-RSA-ARIA128-SHA256", /* >> TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256 */ >> + "ECDH-RSA-ARIA256-SHA384", /* >> TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384 */ >> + "ARIA128-GCM-SHA256", /* TLS_RSA_WITH_ARIA_128_GCM_SHA256 >> */ >> + "ARIA256-GCM-SHA384", /* TLS_RSA_WITH_ARIA_256_GCM_SHA384 >> */ >> + "DH-DSS-ARIA128-GCM-SHA256", /* >> TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256 */ >> + "DH-DSS-ARIA256-GCM-SHA384", /* >> TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384 */ >> + "DH-RSA-ARIA128-GCM-SHA256", /* >> TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256 */ >> + "DH-RSA-ARIA256-GCM-SHA384", /* >> TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384 */ >> + "ADH-ARIA128-GCM-SHA256", /* >> TLS_DH_anon_WITH_ARIA_128_GCM_SHA256 */ >> + "ADH-ARIA256-GCM-SHA384", /* >> TLS_DH_anon_WITH_ARIA_256_GCM_SHA384 */ >> + "ECDH-ECDSA-ARIA128-GCM-SHA256", /* >> TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256 */ >> + "ECDH-ECDSA-ARIA256-GCM-SHA384", /* >> TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384 */ >> + "ECDH-RSA-ARIA128-GCM-SHA256", /* >> TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256 */ >> + "ECDH-RSA-ARIA256-GCM-SHA384", /* >> TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384 */ >> + "PSK-ARIA128-SHA256", /* TLS_PSK_WITH_ARIA_128_CBC_SHA256 >> */ >> + "PSK-ARIA256-SHA384", /* TLS_PSK_WITH_ARIA_256_CBC_SHA384 >> */ >> + "DHE-PSK-ARIA128-SHA256", /* >> TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256 */ >> + "DHE-PSK-ARIA256-SHA384", /* >> TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384 */ >> + "RSA-PSK-ARIA128-SHA256", /* >> TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256 */ >> + "RSA-PSK-ARIA256-SHA384", /* >> TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384 */ >> + "ARIA128-GCM-SHA256", /* TLS_PSK_WITH_ARIA_128_GCM_SHA256 >> */ >> + "ARIA256-GCM-SHA384", /* TLS_PSK_WITH_ARIA_256_GCM_SHA384 >> */ >> + "RSA-PSK-ARIA128-GCM-SHA256", /* >> TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256 */ >> + "RSA-PSK-ARIA256-GCM-SHA384", /* >> TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384 */ >> + "ECDHE-PSK-ARIA128-SHA256", /* >> TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256 */ >> + "ECDHE-PSK-ARIA256-SHA384", /* >> TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384 */ >> + >> + /* blacklisted SEED encryptions */ >> + "SEED-SHA", /*TLS_RSA_WITH_SEED_CBC_SHA */ >> + "DH-DSS-SEED-SHA", /* TLS_DH_DSS_WITH_SEED_CBC_SHA */ >> + "DH-RSA-SEED-SHA", /* TLS_DH_RSA_WITH_SEED_CBC_SHA */ >> + "DHE-DSS-SEED-SHA", /* TLS_DHE_DSS_WITH_SEED_CBC_SHA */ >> + "DHE-RSA-SEED-SHA", /* TLS_DHE_RSA_WITH_SEED_CBC_SHA */ >> >> + "ADH-SEED-SHA", /* TLS_DH_anon_WITH_SEED_CBC_SHA */ >> + >> + /* blacklisted KRB5 ciphers */ >> + "KRB5-DES-CBC-SHA", /* TLS_KRB5_WITH_DES_CBC_SHA */ >> + "KRB5-DES-CBC3-SHA", /* TLS_KRB5_WITH_3DES_EDE_CBC_SHA */ >> + "KRB5-IDEA-CBC-SHA", /* TLS_KRB5_WITH_IDEA_CBC_SHA */ >> + "KRB5-DES-CBC-MD5", /* TLS_KRB5_WITH_DES_CBC_MD5 */ >> + "KRB5-DES-CBC3-MD5", /* TLS_KRB5_WITH_3DES_EDE_CBC_MD5 */ >> + "KRB5-IDEA-CBC-MD5", /* TLS_KRB5_WITH_IDEA_CBC_MD5 */ >> + "EXP-KRB5-DES-CBC-SHA", /* >> TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA */ >> + "EXP-KRB5-DES-CBC-MD5", /* >> TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5 */ >> + "EXP-KRB5-RC2-CBC-SHA", /* >> TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA */ >> + "EXP-KRB5-RC2-CBC-MD5", /* >> TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5 */ >> + >> + /* blacklisted exoticas */ >> + "DHE-DSS-CBC-SHA", /* TLS_DHE_DSS_WITH_DES_CBC_SHA */ >> + "IDEA-CBC-SHA", /* TLS_RSA_WITH_IDEA_CBC_SHA */ >> + >> + /* not really sure if the following names are correct */ >> + "SSL3_CK_SCSV", /* >> TLS_EMPTY_RENEGOTIATION_INFO_SCSV */ >> + "SSL3_CK_FALLBACK_SCSV" >> +}; >> +static size_t RFC7540_names_LEN = >> sizeof(RFC7540_names)/sizeof(RFC7540_names[0]); >> + >> + >> +static apr_hash_t *BLCNames; >> + >> +static void cipher_init(apr_pool_t *pool) >> +{ >> + apr_hash_t *hash = apr_hash_make(pool); >> + const char *source; >> + int i; >> + >> + source = "rfc7540"; >> + for (i = 0; i < RFC7540_names_LEN; ++i) { >> + apr_hash_set(hash, RFC7540_names[i], APR_HASH_KEY_STRING, source); >> + } >> + >> + BLCNames = hash; >> +} >> + >> +static int cipher_is_blacklisted(const char *cipher, const char **psource) >> +{ >> + *psource = apr_hash_get(BLCNames, cipher, APR_HASH_KEY_STRING); >> + return !!*psource; >> +} >> + >> +/******************************************************************************* >> * Hooks for processing incoming connections: >> * - pre_conn_before_tls switches SSL off for stream connections >> * - process_conn take over connection in case of h2 >> @@ -72,12 +420,15 @@ apr_status_t h2_h2_init(apr_pool_t *pool >> ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "h2_h2, child_init"); >> opt_ssl_engine_disable = APR_RETRIEVE_OPTIONAL_FN(ssl_engine_disable); >> opt_ssl_is_https = APR_RETRIEVE_OPTIONAL_FN(ssl_is_https); >> + opt_ssl_var_lookup = APR_RETRIEVE_OPTIONAL_FN(ssl_var_lookup); >> >> - if (!opt_ssl_is_https) { >> + if (!opt_ssl_is_https || !opt_ssl_var_lookup) { >> ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, >> APLOGNO(02951) "mod_ssl does not seem to be enabled"); >> } >> >> + cipher_init(pool); >> + >> return APR_SUCCESS; >> } >> >> @@ -94,6 +445,63 @@ int h2_tls_disable(conn_rec *c) >> return 0; >> } >> >> +int h2_is_security_compliant(conn_rec *c, int require_all) >> +{ >> + int is_tls = h2_h2_is_tls(c); >> + h2_config *cfg = h2_config_get(c); >> + >> + if (is_tls && h2_config_geti(cfg, H2_CONF_COMPLIANCE) > 0) { >> + /* Check TLS connection for RFC 7540 compliance >> + */ >> + apr_pool_t *pool = c->pool; >> + server_rec *s = c->base_server; >> + char *val; >> + >> + if (!opt_ssl_var_lookup) { >> + /* unable to check */ >> + return 0; >> + } >> + >> + /* Need Tlsv1.2 or higher, rfc 7540, ch. 9.2 >> + */ >> + val = opt_ssl_var_lookup(pool, s, c, NULL, "SSL_PROTOCOL"); >> + if (val && *val) { >> + if (strncmp("TLS", val, 3) >> + || !strcmp("TLSv1", val) >> + || !strcmp("TLSv1.1", val)) { >> + ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, c, >> + "h2_h2(%ld): tls protocol not suitable: %s", >> + (long)c->id, val); >> + return 0; >> + } >> + } >> + else if (require_all) { >> + ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, c, >> + "h2_h2(%ld): tls protocol is indetermined", >> (long)c->id); >> + return 0; >> + } >> + >> + /* Check TLS cipher blacklist >> + */ >> + val = opt_ssl_var_lookup(pool, s, c, NULL, "SSL_CIPHER"); >> + if (val && *val) { >> + const char *source; >> + if (cipher_is_blacklisted(val, &source)) { >> + ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, c, >> + "h2_h2(%ld): tls cipher %s blacklisted by >> %s", >> + (long)c->id, val, source); >> + return 0; >> + } >> + } >> + else if (require_all) { >> + ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, c, >> + "h2_h2(%ld): tls cipher is indetermined", >> (long)c->id); >> + return 0; >> + } >> + } >> + return 1; >> +} >> + >> /******************************************************************************* >> * Register various hooks >> */ >> >> Modified: httpd/httpd/trunk/modules/http2/h2_h2.h >> URL: >> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_h2.h?rev=1708593&r1=1708592&r2=1708593&view=diff >> ============================================================================== >> --- httpd/httpd/trunk/modules/http2/h2_h2.h (original) >> +++ httpd/httpd/trunk/modules/http2/h2_h2.h Wed Oct 14 12:10:11 2015 >> @@ -53,5 +53,16 @@ int h2_tls_disable(conn_rec *c); >> */ >> void h2_h2_register_hooks(void); >> >> +/** >> + * Check if the given connection fulfills the security requirements >> + * of RFC 7540. >> + * @param c the connection >> + * @param require_all != 0 iff any missing connection properties make >> + * the test fail. For example, a cipher might not have been selected >> while >> + * the handshake is still ongoing. >> + * @return != 0 iff security requirements are met >> + */ >> +int h2_is_security_compliant(conn_rec *c, int require_all); >> + >> >> #endif /* defined(__mod_h2__h2_h2__) */ >> >> Modified: httpd/httpd/trunk/modules/http2/h2_switch.c >> URL: >> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_switch.c?rev=1708593&r1=1708592&r2=1708593&view=diff >> ============================================================================== >> --- httpd/httpd/trunk/modules/http2/h2_switch.c (original) >> +++ httpd/httpd/trunk/modules/http2/h2_switch.c Wed Oct 14 12:10:11 2015 >> @@ -35,24 +35,12 @@ >> #include "h2_switch.h" >> >> /******************************************************************************* >> - * SSL var lookup >> - */ >> -APR_DECLARE_OPTIONAL_FN(char *, ssl_var_lookup, >> - (apr_pool_t *, server_rec *, >> - conn_rec *, request_rec *, >> - char *)); >> -static char *(*opt_ssl_var_lookup)(apr_pool_t *, server_rec *, >> - conn_rec *, request_rec *, >> - char *); >> - >> -/******************************************************************************* >> * Once per lifetime init, retrieve optional functions >> */ >> apr_status_t h2_switch_init(apr_pool_t *pool, server_rec *s) >> { >> (void)pool; >> ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "h2_switch init"); >> - opt_ssl_var_lookup = APR_RETRIEVE_OPTIONAL_FN(ssl_var_lookup); >> >> return APR_SUCCESS; >> } >> @@ -63,7 +51,8 @@ static int h2_protocol_propose(conn_rec >> apr_array_header_t *proposals) >> { >> int proposed = 0; >> - const char **protos = h2_h2_is_tls(c)? h2_tls_protos : h2_clear_protos; >> + int is_tls = h2_h2_is_tls(c); >> + const char **protos = is_tls? h2_tls_protos : h2_clear_protos; >> >> (void)s; >> if (strcmp(AP_PROTOCOL_HTTP1, ap_get_protocol(c))) { >> @@ -74,6 +63,12 @@ static int h2_protocol_propose(conn_rec >> return DECLINED; >> } >> >> + if (!h2_is_security_compliant(c, 0)) { >> + ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, c, >> + "protocol propose: security requirements not met, >> declined"); >> + return DECLINED; >> + } >> + >> if (r) { >> const char *p; >> /* So far, this indicates an HTTP/1 Upgrade header initiated >> >> >> >