Hanno Böck commited on 2015-02-07 17:59:25
Zeige 3 geänderte Dateien mit 823 Einfügungen und 0 Löschungen.
... | ... |
@@ -2,10 +2,13 @@ AUX apache-2.4.9-libressl.diff 542 SHA256 d1ce461d5abdc131a80fbc694d574d52d51cba |
2 | 2 |
AUX apache-libressl2.diff 784 SHA256 15b6339b10289eeb26863dda1e3b10e745aa981544b202c46c13985182b35216 SHA512 2041b122237f2cb9bd0d32c31e00f43f30f86b167ce47648b337e199e780735bfa79feb236e0e38cf1930c19bd75eaddf4a5118dc360cbb93c02eb27bcc34a7e WHIRLPOOL 668ca1018c5262dd6bdd3185ebddbffec9c6b8e44baf99f0b6d95fb9e9dac35de2586605bc2d9e2b77837450bf827d4a00a4c8dc8d7847309913bb9c627da82b |
3 | 3 |
AUX apache.conf 55 SHA256 ea616c5cc37979a006d69c51bda43fca15a4327d33175762652b29f5cdea1c7b SHA512 3a53beb7a283d17c14383f16ad14c0602681ac1b193cce8f5aca50ae9d9af3a71054ce4a9ab11cbcb72fe913459e1b306fd54660154e66afe10272f8c0f149f3 WHIRLPOOL fa348414f320a9f70001386dfb77d57ca4836c3ef3d251976077b7ad545d7f6752e534efadbf28c7dcb777388e3d844eba84b939dcf48881983388daf6ac23f0 |
4 | 4 |
AUX apache2.2.service 716 SHA256 e850ad73585fbba52ade58a39ca91adbfd52f56a0bbd426ebcadb340a7dcb62b SHA512 5f736c803772077598248bbb41f76dff396dfd2f11a60d1ba929a619275efb8c1b4c0dab78cbcdf83b9ec94db67b958b3333b01f67d71eb3b2e07dba4bca2a7c WHIRLPOOL 776a928422b8f37a12099111a1503674ca901934b60dca8596dc8bc287390be9a0e912d7ba6226dcb22eb7c669fa298ddc20fd7bf5c275b0cf019bae0d594839 |
5 |
+AUX apache24-alpn.diff 21499 SHA256 5dc1a6c8f5a395a1a24b9d846a30d73a75e8b9b907acff5d06bacbf17ef82a1b SHA512 f0e01a94f0886de530d689a29811432a5f45a6c935e39d9683915718b3eb57e63cafe1db6c3015179b2f50610e19f0569f95c557f716b0a65a48331195bff1f9 WHIRLPOOL dca29eb0c00b0cff80fdd1fe95b06e832d2b1d18def9e5689fae4fafc11c395d402f3303ebe1ea1be1ad24d4a9f30b5f0ce2464c84556b830093b489cfaabe8c |
|
5 | 6 |
AUX mod_ssl_with_npn.patch 12614 SHA256 165d651fb536e0878b6f841f1031ac121c6061362cf5fc7d657f7be292ae7ff4 SHA512 7968ec245b8324269ce75e98eeca659f672cbfdb759a9e6c0f8e7dd72bdf442cda23fd57490fccd2bcd44fb9eaff452810440b3e5f72a63550601bc706c35e98 WHIRLPOOL 63f5ab18ca7fe1580833f2ac51b4678340883cd6bffa405010ccdd7f132aed29c9ab7db465ab86fa582df43a5e2bc55bd078e75b0e3371bbd72abfd8190ded45 |
6 | 7 |
DIST gentoo-apache-2.4.10-r1-20140731.tar.bz2 24531 SHA256 8e093a18582c3a20283ed1c09de9acc6832a80b1d5a02962599db0535d38af19 SHA512 c54239df36d7ab30bd14a41241d94b4b49b92c5e50e64857da3e7cde7575d5c0a634d51710bdf75807a57932bf9447906407ae4ef6cb333d7197e82ba5052cd9 WHIRLPOOL 0d184763a033209eaa3c91f7050b24c2a2da24d930ed280a8aa99e32461ac31402e6fd8f57e2122a96e45a8308c4a332144ede7b511ceee352be2f38a6ef7839 |
7 | 8 |
DIST httpd-2.4.10.tar.bz2 5031834 SHA256 176c4dac1a745f07b7b91e7f4fd48f9c48049fa6f088efe758d61d9738669c6a SHA512 e251f5b330da17a8920c589b9e0326d6dd45db28923167718db27b0af2edf769607e9ae6fbb859afbf0c345937fd59053423a2d74bd18ff2272a0f6a19a6496f WHIRLPOOL c9f81296052a61483ceef4ae4b4c467cf64a4035030472dc8c17355f572a4887ddc6179ade2a764a4e3f0cd4ab7cc34a3fa36577a148c3df7b8d44a5f1f0424d |
9 |
+DIST httpd-2.4.12.tar.bz2 5054838 SHA256 ad6d39edfe4621d8cc9a2791f6f8d6876943a9da41ac8533d77407a2e630eae4 SHA512 f69db14b421f0e1e4861fe4d8b652688d50ca9eb41c622242d11ae55687eb6c2142a8505a8c3fb6f2bd53167be535bc0a77ca1af97e0720930fc7f20f4c1f8e8 WHIRLPOOL 56512066e8978c4a3d47d0cc2bb92093fd468a9b2f46b8b07fe4db366f55fa5e74ae58bbebe2377cbe0c66f1585759115c786f62f18ac1abc534fb257689d250 |
|
8 | 10 |
EBUILD apache-2.4.10-r1.ebuild 7683 SHA256 b712e57de7c6db718d659cf6f7ae5ae65d29a002c685118f7d1eeb8fa79ce4e1 SHA512 feed9e3d3a8cadd719a8284a8e49d6e311fa3fa2685af4d6fd67a4a525948bebea573e224001d731a9b8cf1377617145e7e851ae75486c692d99b38858f235fc WHIRLPOOL f40d9cde400cb230df82c44b5bd8a57fce399386974f09d93414f4015fea8391a61c1c995da0f0f649f375c0ea689f826fb075b2b8ddf6629f0a3f1cf5a3eccd |
11 |
+EBUILD apache-2.4.12.ebuild 7682 SHA256 11db379e17343925764e2702c0262acff776af3d19b996ca728688268964e5ea SHA512 98b2c82329de5946b25484886152bcef6b6245895c79bf2722616965b9534eeaa3786c3a27e28e36b4d9a0208c514d5f38b6cff21a1d4d0479387a5f28edc7f6 WHIRLPOOL b72024db65c930b4eebf8039af27e96a526111972690eda7a8d0071d168fe766c9c08ac88fcb32bb5ad17f7029e69160116fd7b2f3502f71ce1cb97c11e0311d |
|
9 | 12 |
MISC ChangeLog 28375 SHA256 2fb3488641d831af6d172be612422c331ae572f6c739a2f86ac26b362c13ece5 SHA512 e2e6d28eae8f996b1d8e66ab7f97c2bdb9a038949f7b92d610e12791e0b700e4a3fc0b35aaacb57049b935d24a7987ae1fe22f1a28b1ab1f3a61c55604e12a68 WHIRLPOOL 409b5d569d05c9e0cb33fb450e62f36001da56e0c6c2c8221df926fe8e3a3bb9375315708d94194e557928eda3e11a585232858f32edf41b4af3f32c4cbc4bdb |
10 | 13 |
MISC ChangeLog-2008 105137 SHA256 4afec18ad3c76df40314edb37b5512f81ca6223c38a899534d9d15342481accf SHA512 92dfd339b1c4ddec29222076a597220dc7faa504e2ee770339892f155febbf34004e60395f9eb21b43d3b1feb5f362c2946b69cc65151b5ba00fb53b35ccb9c6 WHIRLPOOL 89d77300aafb53ae0632904118064de19313fe51f635512314471e845574e7a624a770ae4ca4e335cff67d4fee92e062d28ef985a54c577a1b8b3ea0f621c0f8 |
11 | 14 |
MISC metadata.xml 2882 SHA256 bb1c73d9b53a1049c14b477d4441b09670ecafcf46a0ad114c24bb284d0d194a SHA512 bd9a0a5f26e1420aa6023160208d177e233f97f2265b8fad68772a084cbc9fabb2a186f14916a5a664b5590a6052fe039874ff96b1bd9d3dc530c3750561c7ce WHIRLPOOL 0e92d1cd3fbbf3f75ebd38e356a736061c9ea19afd40b06f58abe0ed86219223cafab188bbfa4ce9c91a8cc6619de47dfc3a68edc2c39e6a38476915ad8d48ba |
... | ... |
@@ -0,0 +1,234 @@ |
1 |
+# Copyright 1999-2015 Gentoo Foundation |
|
2 |
+# Distributed under the terms of the GNU General Public License v2 |
|
3 |
+# $Header: /var/cvsroot/gentoo-x86/www-servers/apache/apache-2.4.12.ebuild,v 1.1 2015/02/04 18:16:00 polynomial-c Exp $ |
|
4 |
+ |
|
5 |
+EAPI=5 |
|
6 |
+ |
|
7 |
+# latest gentoo apache files |
|
8 |
+GENTOO_PATCHSTAMP="20140731" |
|
9 |
+GENTOO_DEVELOPER="polynomial-c" |
|
10 |
+GENTOO_PATCHNAME="gentoo-apache-2.4.10-r1" |
|
11 |
+ |
|
12 |
+# IUSE/USE_EXPAND magic |
|
13 |
+IUSE_MPMS_FORK="peruser prefork" |
|
14 |
+IUSE_MPMS_THREAD="event worker" |
|
15 |
+ |
|
16 |
+# << obsolete modules: |
|
17 |
+# authn_default authz_default mem_cache |
|
18 |
+# mem_cache is replaced by cache_disk |
|
19 |
+# ?? buggy modules |
|
20 |
+# proxy_scgi: startup error: undefined symbol "ap_proxy_release_connection", no fix found |
|
21 |
+# >> added modules for reason: |
|
22 |
+# compat: compatibility with 2.2 access control |
|
23 |
+# authz_host: new module for access control |
|
24 |
+# authn_core: functionality provided by authn_alias in previous versions |
|
25 |
+# authz_core: new module, provides core authorization capabilities |
|
26 |
+# cache_disk: replacement for mem_cache |
|
27 |
+# lbmethod_byrequests: Split off from mod_proxy_balancer in 2.3 |
|
28 |
+# lbmethod_bytraffic: Split off from mod_proxy_balancer in 2.3 |
|
29 |
+# lbmethod_bybusyness: Split off from mod_proxy_balancer in 2.3 |
|
30 |
+# lbmethod_heartbeat: Split off from mod_proxy_balancer in 2.3 |
|
31 |
+# slotmem_shm: Slot-based shared memory provider (for lbmethod_byrequests). |
|
32 |
+# socache_shmcb: shared object cache provider. Default config with ssl needs it |
|
33 |
+# unixd: fixes startup error: Invalid command 'User' |
|
34 |
+IUSE_MODULES="access_compat actions alias asis auth_basic auth_digest |
|
35 |
+authn_alias authn_anon authn_core authn_dbd authn_dbm authn_file authz_core |
|
36 |
+authz_dbd authz_dbm authz_groupfile authz_host authz_owner authz_user autoindex |
|
37 |
+cache cache_disk cern_meta charset_lite cgi cgid dav dav_fs dav_lock dbd deflate |
|
38 |
+dir dumpio env expires ext_filter file_cache filter headers ident imagemap |
|
39 |
+include info lbmethod_byrequests lbmethod_bytraffic lbmethod_bybusyness |
|
40 |
+lbmethod_heartbeat log_config log_forensic logio mime mime_magic negotiation |
|
41 |
+proxy proxy_ajp proxy_balancer proxy_connect proxy_ftp proxy_http proxy_scgi |
|
42 |
+proxy_fcgi proxy_wstunnel rewrite ratelimit remoteip reqtimeout setenvif |
|
43 |
+slotmem_shm speling socache_shmcb status substitute unique_id userdir usertrack |
|
44 |
+unixd version vhost_alias" |
|
45 |
+# The following are also in the source as of this version, but are not available |
|
46 |
+# for user selection: |
|
47 |
+# bucketeer case_filter case_filter_in echo http isapi optional_fn_export |
|
48 |
+# optional_fn_import optional_hook_export optional_hook_import |
|
49 |
+ |
|
50 |
+# inter-module dependencies |
|
51 |
+# TODO: this may still be incomplete |
|
52 |
+MODULE_DEPENDS=" |
|
53 |
+ dav_fs:dav |
|
54 |
+ dav_lock:dav |
|
55 |
+ deflate:filter |
|
56 |
+ cache_disk:cache |
|
57 |
+ ext_filter:filter |
|
58 |
+ file_cache:cache |
|
59 |
+ lbmethod_byrequests:proxy_balancer |
|
60 |
+ lbmethod_byrequests:slotmem_shm |
|
61 |
+ lbmethod_bytraffic:proxy_balancer |
|
62 |
+ lbmethod_bybusyness:proxy_balancer |
|
63 |
+ lbmethod_heartbeat:proxy_balancer |
|
64 |
+ log_forensic:log_config |
|
65 |
+ logio:log_config |
|
66 |
+ cache_disk:cache |
|
67 |
+ mime_magic:mime |
|
68 |
+ proxy_ajp:proxy |
|
69 |
+ proxy_balancer:proxy |
|
70 |
+ proxy_balancer:slotmem_shm |
|
71 |
+ proxy_connect:proxy |
|
72 |
+ proxy_ftp:proxy |
|
73 |
+ proxy_http:proxy |
|
74 |
+ proxy_scgi:proxy |
|
75 |
+ proxy_fcgi:proxy |
|
76 |
+ proxy_wstunnel:proxy |
|
77 |
+ substitute:filter |
|
78 |
+" |
|
79 |
+ |
|
80 |
+# module<->define mappings |
|
81 |
+MODULE_DEFINES=" |
|
82 |
+ auth_digest:AUTH_DIGEST |
|
83 |
+ authnz_ldap:AUTHNZ_LDAP |
|
84 |
+ cache:CACHE |
|
85 |
+ cache_disk:CACHE |
|
86 |
+ dav:DAV |
|
87 |
+ dav_fs:DAV |
|
88 |
+ dav_lock:DAV |
|
89 |
+ file_cache:CACHE |
|
90 |
+ info:INFO |
|
91 |
+ ldap:LDAP |
|
92 |
+ proxy:PROXY |
|
93 |
+ proxy_ajp:PROXY |
|
94 |
+ proxy_balancer:PROXY |
|
95 |
+ proxy_connect:PROXY |
|
96 |
+ proxy_ftp:PROXY |
|
97 |
+ proxy_http:PROXY |
|
98 |
+ proxy_fcgi:PROXY |
|
99 |
+ proxy_scgi:PROXY |
|
100 |
+ proxy_wstunnel:PROXY |
|
101 |
+ socache_shmcb:SSL |
|
102 |
+ ssl:SSL |
|
103 |
+ status:STATUS |
|
104 |
+ suexec:SUEXEC |
|
105 |
+ userdir:USERDIR |
|
106 |
+" |
|
107 |
+ |
|
108 |
+# critical modules for the default config |
|
109 |
+MODULE_CRITICAL=" |
|
110 |
+ authn_core |
|
111 |
+ authz_core |
|
112 |
+ authz_host |
|
113 |
+ dir |
|
114 |
+ mime |
|
115 |
+ unixd |
|
116 |
+" |
|
117 |
+inherit eutils apache-2 systemd toolchain-funcs |
|
118 |
+ |
|
119 |
+DESCRIPTION="The Apache Web Server" |
|
120 |
+HOMEPAGE="http://httpd.apache.org/" |
|
121 |
+ |
|
122 |
+# some helper scripts are Apache-1.1, thus both are here |
|
123 |
+LICENSE="Apache-2.0 Apache-1.1" |
|
124 |
+SLOT="2" |
|
125 |
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~amd64-fbsd ~sparc-fbsd ~x86-fbsd ~amd64-linux ~x64-macos ~x86-macos ~m68k-mint ~sparc64-solaris ~x64-solaris" |
|
126 |
+IUSE="" |
|
127 |
+ |
|
128 |
+pkg_setup() { |
|
129 |
+ # dependend critical modules which are not allowed in global scope due |
|
130 |
+ # to USE flag conditionals (bug #499260) |
|
131 |
+ use ssl && MODULE_CRITICAL+=" socache_shmcb" |
|
132 |
+ use doc && MODULE_CRITICAL+=" alias negotiation setenvif" |
|
133 |
+ apache-2_pkg_setup |
|
134 |
+} |
|
135 |
+ |
|
136 |
+src_prepare() { |
|
137 |
+ epatch "${FILESDIR}"/apache-2.4.9-libressl.diff |
|
138 |
+ epatch "${FILESDIR}"/apache-libressl2.diff |
|
139 |
+ epatch "${FILESDIR}"/apache24-alpn.diff |
|
140 |
+ apache-2_src_prepare |
|
141 |
+} |
|
142 |
+ |
|
143 |
+src_configure() { |
|
144 |
+ # Brain dead check. |
|
145 |
+ tc-is-cross-compiler && export ap_cv_void_ptr_lt_long="no" |
|
146 |
+ |
|
147 |
+ apache-2_src_configure |
|
148 |
+} |
|
149 |
+ |
|
150 |
+src_compile() { |
|
151 |
+ if tc-is-cross-compiler; then |
|
152 |
+ # This header is the same across targets, so use the build compiler. |
|
153 |
+ pushd server >/dev/null |
|
154 |
+ emake gen_test_char |
|
155 |
+ tc-export_build_env BUILD_CC |
|
156 |
+ ${BUILD_CC} ${BUILD_CFLAGS} ${BUILD_CPPFLAGS} ${BUILD_LDFLAGS} \ |
|
157 |
+ gen_test_char.c -o gen_test_char $(apr-1-config --includes) || die |
|
158 |
+ popd >/dev/null |
|
159 |
+ fi |
|
160 |
+ |
|
161 |
+ default |
|
162 |
+} |
|
163 |
+ |
|
164 |
+src_install() { |
|
165 |
+ apache-2_src_install |
|
166 |
+ for i in /usr/bin/{htdigest,logresolve,htpasswd,htdbm,ab,httxt2dbm}; do |
|
167 |
+ rm "${ED}"/$i || die "Failed to prune apache-tools bits" |
|
168 |
+ done |
|
169 |
+ for i in /usr/share/man/man8/{rotatelogs.8,htcacheclean.8}; do |
|
170 |
+ rm "${ED}"/$i || die "Failed to prune apache-tools bits" |
|
171 |
+ done |
|
172 |
+ for i in /usr/share/man/man1/{logresolve.1,htdbm.1,htdigest.1,htpasswd.1,dbmmanage.1,ab.1}; do |
|
173 |
+ rm "${ED}"/$i || die "Failed to prune apache-tools bits" |
|
174 |
+ done |
|
175 |
+ for i in /usr/sbin/{checkgid,fcgistarter,htcacheclean,rotatelogs}; do |
|
176 |
+ rm "${ED}/"$i || die "Failed to prune apache-tools bits" |
|
177 |
+ done |
|
178 |
+ |
|
179 |
+ # install apxs in /usr/bin (bug #502384) and put a symlink into the |
|
180 |
+ # old location until all ebuilds and eclasses have been modified to |
|
181 |
+ # use the new location. |
|
182 |
+ local apxs="/usr/bin/apxs" |
|
183 |
+ cp "${S}"/support/apxs "${ED}"${apxs} || die "Failed to install apxs" |
|
184 |
+ ln -s ../bin/apxs "${ED}"/usr/sbin/apxs || die |
|
185 |
+ chmod 0755 "${ED}"${apxs} || die |
|
186 |
+ |
|
187 |
+ # Note: wait for mod_systemd to be included in the next release, |
|
188 |
+ # then apache2.4.service can be used and systemd support controlled |
|
189 |
+ # through --enable-systemd |
|
190 |
+ systemd_newunit "${FILESDIR}/apache2.2.service" "apache2.service" |
|
191 |
+ systemd_dotmpfilesd "${FILESDIR}/apache.conf" |
|
192 |
+ #insinto /etc/apache2/modules.d |
|
193 |
+ #doins "${FILESDIR}/00_systemd.conf" |
|
194 |
+} |
|
195 |
+ |
|
196 |
+pkg_postinst() |
|
197 |
+{ |
|
198 |
+ apache-2_pkg_postinst || die "apache-2_pkg_postinst failed" |
|
199 |
+ # warnings that default config might not work out of the box |
|
200 |
+ for mod in $MODULE_CRITICAL; do |
|
201 |
+ if ! use "apache2_modules_${mod}"; then |
|
202 |
+ echo |
|
203 |
+ ewarn "Warning: Critical module not installed!" |
|
204 |
+ ewarn "Modules 'authn_core', 'authz_core' and 'unixd'" |
|
205 |
+ ewarn "are highly recomended but might not be in the base profile yet." |
|
206 |
+ ewarn "Default config for ssl needs module 'socache_shmcb'." |
|
207 |
+ ewarn "Enabling the following flags is highly recommended:" |
|
208 |
+ for cmod in $MODULE_CRITICAL; do |
|
209 |
+ use "apache2_modules_${cmod}" || \ |
|
210 |
+ ewarn "+ apache2_modules_${cmod}" |
|
211 |
+ done |
|
212 |
+ echo |
|
213 |
+ break |
|
214 |
+ fi |
|
215 |
+ done |
|
216 |
+ # warning for proxy_balancer and missing load balancing scheduler |
|
217 |
+ if use apache2_modules_proxy_balancer; then |
|
218 |
+ local lbset= |
|
219 |
+ for mod in lbmethod_byrequests lbmethod_bytraffic lbmethod_bybusyness lbmethod_heartbeat; do |
|
220 |
+ if use "apache2_modules_${mod}"; then |
|
221 |
+ lbset=1 && break |
|
222 |
+ fi |
|
223 |
+ done |
|
224 |
+ if [ ! $lbset ]; then |
|
225 |
+ echo |
|
226 |
+ ewarn "Info: Missing load balancing scheduler algorithm module" |
|
227 |
+ ewarn "(They were split off from proxy_balancer in 2.3)" |
|
228 |
+ ewarn "In order to get the ability of load balancing, at least" |
|
229 |
+ ewarn "one of these modules has to be present:" |
|
230 |
+ ewarn "lbmethod_byrequests lbmethod_bytraffic lbmethod_bybusyness lbmethod_heartbeat" |
|
231 |
+ echo |
|
232 |
+ fi |
|
233 |
+ fi |
|
234 |
+} |
... | ... |
@@ -0,0 +1,586 @@ |
1 |
+--- gen/httpd-2.4.x/modules/ssl/mod_ssl.c 2015-01-19 16:52:30.000000000 +0100 |
|
2 |
++++ gen/httpd-2.4.x/modules/ssl/mod_ssl.c 2015-01-19 15:42:53.904000000 +0100 |
|
3 |
+@@ -273,6 +270,12 @@ |
|
4 |
+ "OpenSSL configuration command") |
|
5 |
+ #endif |
|
6 |
+ |
|
7 |
++#if defined(HAVE_ALPN_NPN) || defined(HAVE_TLS_NPN) |
|
8 |
++ SSL_CMD_SRV(AlpnPreference, ITERATE, |
|
9 |
++ "Preference in Application-Layer Protocol Negotiation (ALPN), " |
|
10 |
++ "protocols are chosed in the specified order") |
|
11 |
++#endif |
|
12 |
++ |
|
13 |
+ /* Deprecated directives. */ |
|
14 |
+ AP_INIT_RAW_ARGS("SSLLog", ap_set_deprecated, NULL, OR_ALL, |
|
15 |
+ "SSLLog directive is no longer supported - use ErrorLog."), |
|
16 |
+@@ -423,6 +423,37 @@ |
|
17 |
+ return 1; |
|
18 |
+ } |
|
19 |
+ |
|
20 |
++static int modssl_register_alpn(conn_rec *c, |
|
21 |
++ ssl_alpn_propose_protos advertisefn, |
|
22 |
++ ssl_alpn_proto_negotiated negotiatedfn) |
|
23 |
++{ |
|
24 |
++#if defined(HAVE_ALPN_NPN) || defined(HAVE_TLS_NPN) |
|
25 |
++ SSLConnRec *sslconn = myConnConfig(c); |
|
26 |
++ |
|
27 |
++ if (!sslconn) { |
|
28 |
++ return DECLINED; |
|
29 |
++ } |
|
30 |
++ |
|
31 |
++ if (!sslconn->alpn_proposefns) { |
|
32 |
++ sslconn->alpn_proposefns = |
|
33 |
++ apr_array_make(c->pool, 5, sizeof(ssl_alpn_propose_protos)); |
|
34 |
++ sslconn->alpn_negofns = |
|
35 |
++ apr_array_make(c->pool, 5, sizeof(ssl_alpn_proto_negotiated)); |
|
36 |
++ } |
|
37 |
++ |
|
38 |
++ if (advertisefn) |
|
39 |
++ APR_ARRAY_PUSH(sslconn->alpn_proposefns, ssl_alpn_propose_protos) = |
|
40 |
++ advertisefn; |
|
41 |
++ if (negotiatedfn) |
|
42 |
++ APR_ARRAY_PUSH(sslconn->alpn_negofns, ssl_alpn_proto_negotiated) = |
|
43 |
++ negotiatedfn; |
|
44 |
++ |
|
45 |
++ return OK; |
|
46 |
++#else |
|
47 |
++ return DECLINED; |
|
48 |
++#endif |
|
49 |
++} |
|
50 |
++ |
|
51 |
+ int ssl_init_ssl_connection(conn_rec *c, request_rec *r) |
|
52 |
+ { |
|
53 |
+ SSLSrvConfigRec *sc; |
|
54 |
+@@ -585,6 +616,7 @@ |
|
55 |
+ |
|
56 |
+ APR_REGISTER_OPTIONAL_FN(ssl_proxy_enable); |
|
57 |
+ APR_REGISTER_OPTIONAL_FN(ssl_engine_disable); |
|
58 |
++ APR_REGISTER_OPTIONAL_FN(modssl_register_alpn); |
|
59 |
+ |
|
60 |
+ ap_register_auth_provider(p, AUTHZ_PROVIDER_GROUP, "ssl", |
|
61 |
+ AUTHZ_PROVIDER_VERSION, |
|
62 |
+--- gen/httpd-2.4.x/modules/ssl/mod_ssl.h 2015-01-07 17:03:34.000000000 +0100 |
|
63 |
++++ gen/httpd-2.4.x/modules/ssl/mod_ssl.h 2015-01-19 15:42:53.904000000 +0100 |
|
64 |
+@@ -63,5 +63,46 @@ |
|
65 |
+ |
|
66 |
+ APR_DECLARE_OPTIONAL_FN(int, ssl_engine_disable, (conn_rec *)); |
|
67 |
+ |
|
68 |
++/** The alpn_propose_proto callback allows other modules to propose |
|
69 |
++ * the name of the protocol that will be chosen during the |
|
70 |
++ * Application-Layer Protocol Negotiation (ALPN) portion of the SSL handshake. |
|
71 |
++ * The callback is given the connection and a list of NULL-terminated |
|
72 |
++ * protocol strings as supported by the client. If this client_protos is |
|
73 |
++ * non-empty, it must pick its preferred protocol from that list. Otherwise |
|
74 |
++ * it should add its supported protocols in order of precedence. |
|
75 |
++ * The callback should not yet modify the connection or install any filters |
|
76 |
++ * as its proposal(s) may be overridden by another callback or server |
|
77 |
++ * configuration. |
|
78 |
++ * It should return OK or, to prevent further processing of (other modules') |
|
79 |
++ * callbacks, return DONE. |
|
80 |
++ */ |
|
81 |
++typedef int (*ssl_alpn_propose_protos)(conn_rec *connection, |
|
82 |
++ apr_array_header_t *client_protos, |
|
83 |
++ apr_array_header_t *proposed_protos); |
|
84 |
++ |
|
85 |
++/** The alpn_proto_negotiated callback allows other modules to discover |
|
86 |
++ * the name of the protocol that was chosen during the Application-Layer |
|
87 |
++ * Protocol Negotiation (ALPN) portion of the SSL handshake. |
|
88 |
++ * The callback is given the connection, a |
|
89 |
++ * non-NUL-terminated string containing the protocol name, and the |
|
90 |
++ * length of the string; it should do something appropriate |
|
91 |
++ * (i.e. insert or remove filters) and return OK. To prevent further |
|
92 |
++ * processing of (other modules') callbacks, return DONE. */ |
|
93 |
++typedef int (*ssl_alpn_proto_negotiated)(conn_rec *connection, |
|
94 |
++ const char *proto_name, |
|
95 |
++ apr_size_t proto_name_len); |
|
96 |
++ |
|
97 |
++/* An optional function which can be used to register a pair of callbacks |
|
98 |
++ * for ALPN handling. |
|
99 |
++ * This optional function should be invoked from a pre_connection hook |
|
100 |
++ * which runs *after* mod_ssl.c's pre_connection hook. The function returns |
|
101 |
++ * OK if the callbacks are registered, or DECLINED otherwise (for example if |
|
102 |
++ * mod_ssl does not support ALPN). |
|
103 |
++ */ |
|
104 |
++APR_DECLARE_OPTIONAL_FN(int, modssl_register_alpn, |
|
105 |
++ (conn_rec *conn, |
|
106 |
++ ssl_alpn_propose_protos proposefn, |
|
107 |
++ ssl_alpn_proto_negotiated negotiatedfn)); |
|
108 |
++ |
|
109 |
+ #endif /* __MOD_SSL_H__ */ |
|
110 |
+ /** @} */ |
|
111 |
+--- gen/httpd-2.4.x/modules/ssl/ssl_engine_config.c 2015-01-19 16:52:30.000000000 +0100 |
|
112 |
++++ gen/httpd-2.4.x/modules/ssl/ssl_engine_config.c 2015-01-19 16:34:55.944000000 +0100 |
|
113 |
+@@ -159,6 +159,9 @@ |
|
114 |
+ SSL_CONF_CTX_set_flags(mctx->ssl_ctx_config, SSL_CONF_FLAG_CERTIFICATE); |
|
115 |
+ mctx->ssl_ctx_param = apr_array_make(p, 5, sizeof(ssl_ctx_param_t)); |
|
116 |
+ #endif |
|
117 |
++#if defined(HAVE_ALPN_NPN) || defined(HAVE_TLS_NPN) |
|
118 |
++ mctx->ssl_alpn_pref = apr_array_make(p, 5, sizeof(const char *)); |
|
119 |
++#endif |
|
120 |
+ } |
|
121 |
+ |
|
122 |
+ static void modssl_ctx_init_proxy(SSLSrvConfigRec *sc, |
|
123 |
+@@ -298,6 +300,9 @@ |
|
124 |
+ #ifdef HAVE_SSL_CONF_CMD |
|
125 |
+ cfgMergeArray(ssl_ctx_param); |
|
126 |
+ #endif |
|
127 |
++#if defined(HAVE_ALPN_NPN) || defined(HAVE_TLS_NPN) |
|
128 |
++ cfgMergeArray(ssl_alpn_pref); |
|
129 |
++#endif |
|
130 |
+ } |
|
131 |
+ |
|
132 |
+ static void modssl_ctx_cfg_merge_proxy(apr_pool_t *p, |
|
133 |
+@@ -1868,6 +1861,16 @@ |
|
134 |
+ return NULL; |
|
135 |
+ } |
|
136 |
+ #endif |
|
137 |
++ |
|
138 |
++#if defined(HAVE_ALPN_NPN) || defined(HAVE_TLS_NPN) |
|
139 |
++const char *ssl_cmd_SSLAlpnPreference(cmd_parms *cmd, void *dcfg, |
|
140 |
++ const char *protocol) |
|
141 |
++{ |
|
142 |
++ SSLSrvConfigRec *sc = mySrvConfig(cmd->server); |
|
143 |
++ APR_ARRAY_PUSH(sc->server->ssl_alpn_pref, const char *) = protocol; |
|
144 |
++ return NULL; |
|
145 |
++} |
|
146 |
++#endif |
|
147 |
+ |
|
148 |
+ #ifdef HAVE_SRP |
|
149 |
+ |
|
150 |
+--- gen/httpd-2.4.x/modules/ssl/ssl_engine_init.c 2015-01-19 16:52:30.000000000 +0100 |
|
151 |
++++ gen/httpd-2.4.x/modules/ssl/ssl_engine_init.c 2015-01-19 15:42:53.908000000 +0100 |
|
152 |
+@@ -623,6 +613,14 @@ |
|
153 |
+ SSL_CTX_set_tmp_dh_callback(ctx, ssl_callback_TmpDH); |
|
154 |
+ |
|
155 |
+ SSL_CTX_set_info_callback(ctx, ssl_callback_Info); |
|
156 |
++ |
|
157 |
++#if defined(HAVE_TLS_ALPN) |
|
158 |
++ SSL_CTX_set_alpn_select_cb( |
|
159 |
++ ctx, ssl_callback_alpn_select, NULL); |
|
160 |
++#elif defined(HAVE_TLS_NPN) |
|
161 |
++ SSL_CTX_set_next_protos_advertised_cb( |
|
162 |
++ ctx, ssl_callback_AdvertiseNextProtos, NULL); |
|
163 |
++#endif |
|
164 |
+ } |
|
165 |
+ |
|
166 |
+ static apr_status_t ssl_init_ctx_verify(server_rec *s, |
|
167 |
+--- gen/httpd-2.4.x/modules/ssl/ssl_engine_io.c 2015-01-19 16:52:30.000000000 +0100 |
|
168 |
++++ gen/httpd-2.4.x/modules/ssl/ssl_engine_io.c 2015-01-19 15:42:53.908000000 +0100 |
|
169 |
+@@ -28,6 +28,7 @@ |
|
170 |
+ core keeps dumping.'' |
|
171 |
+ -- Unknown */ |
|
172 |
+ #include "ssl_private.h" |
|
173 |
++#include "mod_ssl.h" |
|
174 |
+ #include "apr_date.h" |
|
175 |
+ |
|
176 |
+ /* _________________________________________________________________ |
|
177 |
+@@ -297,6 +298,7 @@ |
|
178 |
+ apr_pool_t *pool; |
|
179 |
+ char buffer[AP_IOBUFSIZE]; |
|
180 |
+ ssl_filter_ctx_t *filter_ctx; |
|
181 |
++ int alpn_finished; /* 1 if ALPN has finished, 0 otherwise */ |
|
182 |
+ } bio_filter_in_ctx_t; |
|
183 |
+ |
|
184 |
+ /* |
|
185 |
+@@ -1412,6 +1414,43 @@ |
|
186 |
+ APR_BRIGADE_INSERT_TAIL(bb, bucket); |
|
187 |
+ } |
|
188 |
+ |
|
189 |
++#if defined(HAVE_TLS_ALPN) || defined(HAVE_TLS_NPN) |
|
190 |
++ /* By this point, Application-Layer Protocol Negotiation (ALPN) should be |
|
191 |
++ * completed (if our version of OpenSSL supports it). If we haven't already, |
|
192 |
++ * find out which protocol was decided upon and inform other modules |
|
193 |
++ * by calling alpn_proto_negotiated_hook. |
|
194 |
++ */ |
|
195 |
++ if (!inctx->alpn_finished) { |
|
196 |
++ SSLConnRec *sslconn = myConnConfig(f->c); |
|
197 |
++ const unsigned char *next_proto = NULL; |
|
198 |
++ unsigned next_proto_len = 0; |
|
199 |
++ int n; |
|
200 |
++ |
|
201 |
++ if (sslconn->alpn_negofns) { |
|
202 |
++ #ifdef HAVE_TLS_ALPN |
|
203 |
++ SSL_get0_alpn_selected(inctx->ssl, &next_proto, &next_proto_len); |
|
204 |
++ ap_log_cerror(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, f->c, |
|
205 |
++ APLOGNO(02306) "SSL ALPN negotiated protocol: '%*s'", |
|
206 |
++ next_proto_len, (const char*)next_proto); |
|
207 |
++ #else |
|
208 |
++ SSL_get0_next_proto_negotiated( |
|
209 |
++ inctx->ssl, &next_proto, &next_proto_len); |
|
210 |
++ ap_log_cerror(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, f->c, |
|
211 |
++ APLOGNO(02306) "SSL NPN negotiated protocol: '%*s'", |
|
212 |
++ next_proto_len, (const char*)next_proto); |
|
213 |
++ #endif |
|
214 |
++ for (n = 0; n < sslconn->alpn_negofns->nelts; n++) { |
|
215 |
++ ssl_alpn_proto_negotiated fn = |
|
216 |
++ APR_ARRAY_IDX(sslconn->alpn_negofns, n, ssl_alpn_proto_negotiated); |
|
217 |
++ |
|
218 |
++ if (fn(f->c, (const char *)next_proto, next_proto_len) == DONE) |
|
219 |
++ break; |
|
220 |
++ } |
|
221 |
++ } |
|
222 |
++ inctx->alpn_finished = 1; |
|
223 |
++ } |
|
224 |
++#endif |
|
225 |
++ |
|
226 |
+ return APR_SUCCESS; |
|
227 |
+ } |
|
228 |
+ |
|
229 |
+@@ -1893,6 +1932,7 @@ |
|
230 |
+ inctx->block = APR_BLOCK_READ; |
|
231 |
+ inctx->pool = c->pool; |
|
232 |
+ inctx->filter_ctx = filter_ctx; |
|
233 |
++ inctx->alpn_finished = 0; |
|
234 |
+ } |
|
235 |
+ |
|
236 |
+ /* The request_rec pointer is passed in here only to ensure that the |
|
237 |
+--- gen/httpd-2.4.x/modules/ssl/ssl_engine_kernel.c 2015-01-19 16:52:30.000000000 +0100 |
|
238 |
++++ gen/httpd-2.4.x/modules/ssl/ssl_engine_kernel.c 2015-01-19 16:37:09.536000000 +0100 |
|
239 |
+@@ -29,6 +29,7 @@ |
|
240 |
+ time I was too famous.'' |
|
241 |
+ -- Unknown */ |
|
242 |
+ #include "ssl_private.h" |
|
243 |
++#include "mod_ssl.h" |
|
244 |
+ #include "util_md5.h" |
|
245 |
+ |
|
246 |
+ static void ssl_configure_env(request_rec *r, SSLConnRec *sslconn); |
|
247 |
+@@ -2136,6 +2131,270 @@ |
|
248 |
+ } |
|
249 |
+ #endif /* HAVE_TLS_SESSION_TICKETS */ |
|
250 |
+ |
|
251 |
++static int ssl_array_index(apr_array_header_t *array, |
|
252 |
++ const unsigned char *s) |
|
253 |
++{ |
|
254 |
++ int i; |
|
255 |
++ for (i = 0; i < array->nelts; i++) { |
|
256 |
++ const unsigned char *p = APR_ARRAY_IDX(array, i, const unsigned char*); |
|
257 |
++ if (!strcmp((const char *)p, (const char *)s)) { |
|
258 |
++ return i; |
|
259 |
++ } |
|
260 |
++ } |
|
261 |
++ return -1; |
|
262 |
++} |
|
263 |
++ |
|
264 |
++#ifdef HAVE_TLS_ALPN |
|
265 |
++/* |
|
266 |
++ * Compare to ALPN protocol proposal. Result is similar to strcmp(): |
|
267 |
++ * 0 gives same precedence, >0 means proto1 is prefered. |
|
268 |
++ */ |
|
269 |
++static int ssl_cmp_alpn_protos(modssl_ctx_t *ctx, |
|
270 |
++ const unsigned char *proto1, |
|
271 |
++ const unsigned char *proto2) |
|
272 |
++{ |
|
273 |
++ /* TODO: we should have a mod_ssl configuration parameter. */ |
|
274 |
++ if (ctx && ctx->ssl_alpn_pref) { |
|
275 |
++ int index1 = ssl_array_index(ctx->ssl_alpn_pref, proto1); |
|
276 |
++ int index2 = ssl_array_index(ctx->ssl_alpn_pref, proto2); |
|
277 |
++ if (index2 > index1) { |
|
278 |
++ return (index1 >= 0)? 1 : -1; |
|
279 |
++ } |
|
280 |
++ else if (index1 > index2) { |
|
281 |
++ return (index2 >= 0)? -1 : 1; |
|
282 |
++ } |
|
283 |
++ } |
|
284 |
++ /* both have the same index (mabye -1 or no pref configured) and we compare |
|
285 |
++ * the names so that spdy3 gets precedence over spdy2. That makes |
|
286 |
++ * the outcome at least deterministic. */ |
|
287 |
++ return strcmp((const char *)proto1, (const char *)proto2); |
|
288 |
++} |
|
289 |
++ |
|
290 |
++/* |
|
291 |
++ * This callback function is executed when the TLS Application Layer |
|
292 |
++ * Protocol Negotiate Extension (ALPN, RFC 7301) is triggered by the client |
|
293 |
++ * hello, giving a list of desired protocol names (in descending preference) |
|
294 |
++ * to the server. |
|
295 |
++ * The callback has to select a protocol name or return an error if none of |
|
296 |
++ * the clients preferences is supported. |
|
297 |
++ * The selected protocol does not have to be on the client list, according |
|
298 |
++ * to RFC 7301, so no checks are performed. |
|
299 |
++ * The client protocol list is serialized as length byte followed by ascii |
|
300 |
++ * characters (not null-terminated), followed by the next protocol name. |
|
301 |
++ */ |
|
302 |
++int ssl_callback_alpn_select(SSL *ssl, |
|
303 |
++ const unsigned char **out, unsigned char *outlen, |
|
304 |
++ const unsigned char *in, unsigned int inlen, void *arg) |
|
305 |
++{ |
|
306 |
++ conn_rec *c = (conn_rec*)SSL_get_app_data(ssl); |
|
307 |
++ SSLConnRec *sslconn = myConnConfig(c); |
|
308 |
++ server_rec *s = mySrvFromConn(c); |
|
309 |
++ SSLSrvConfigRec *sc = mySrvConfig(s); |
|
310 |
++ modssl_ctx_t *mctx = myCtxConfig(sslconn, sc); |
|
311 |
++ const unsigned char *alpn_http1 = (const unsigned char*)"http/1.1"; |
|
312 |
++ apr_array_header_t *client_protos; |
|
313 |
++ apr_array_header_t *proposed_protos; |
|
314 |
++ int i; |
|
315 |
++ |
|
316 |
++ /* If the connection object is not available, |
|
317 |
++ * then there's nothing for us to do. */ |
|
318 |
++ if (c == NULL) { |
|
319 |
++ return SSL_TLSEXT_ERR_OK; |
|
320 |
++ } |
|
321 |
++ |
|
322 |
++ if (inlen == 0) { |
|
323 |
++ // someone tries to trick us? |
|
324 |
++ ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, c, APLOGNO(02306) |
|
325 |
++ "alpn client protocol list empty"); |
|
326 |
++ return SSL_TLSEXT_ERR_ALERT_FATAL; |
|
327 |
++ } |
|
328 |
++ |
|
329 |
++ client_protos = apr_array_make(c->pool, 0, sizeof(char *)); |
|
330 |
++ for (i = 0; i < inlen; /**/) { |
|
331 |
++ unsigned int plen = in[i++]; |
|
332 |
++ if (plen + i > inlen) { |
|
333 |
++ // someone tries to trick us? |
|
334 |
++ ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, c, APLOGNO(02306) |
|
335 |
++ "alpn protocol identier too long"); |
|
336 |
++ return SSL_TLSEXT_ERR_ALERT_FATAL; |
|
337 |
++ } |
|
338 |
++ APR_ARRAY_PUSH(client_protos, char*) = |
|
339 |
++ apr_pstrndup(c->pool, (const char *)in+i, plen); |
|
340 |
++ i += plen; |
|
341 |
++ } |
|
342 |
++ |
|
343 |
++ /* Regardless of installed hooks, the http/1.1 protocol is always |
|
344 |
++ * supported by us. Add it to the proposals if the client also |
|
345 |
++ * offers it. */ |
|
346 |
++ proposed_protos = apr_array_make(c->pool, client_protos->nelts+1, |
|
347 |
++ sizeof(char *)); |
|
348 |
++ if (ssl_array_index(client_protos, alpn_http1) >= 0) { |
|
349 |
++ APR_ARRAY_PUSH(proposed_protos, const unsigned char*) = alpn_http1; |
|
350 |
++ } |
|
351 |
++ |
|
352 |
++ if (sslconn->alpn_proposefns != NULL) { |
|
353 |
++ /* Invoke our alpn_propos_proto hooks, giving other modules a chance to |
|
354 |
++ * propose protocol names for selection. We might have several such |
|
355 |
++ * hooks installed and if two make a proposal, we need to give |
|
356 |
++ * preference to one. |
|
357 |
++ */ |
|
358 |
++ for (i = 0; i < sslconn->alpn_proposefns->nelts; i++) { |
|
359 |
++ ssl_alpn_propose_protos fn = |
|
360 |
++ APR_ARRAY_IDX(sslconn->alpn_proposefns, i, |
|
361 |
++ ssl_alpn_propose_protos); |
|
362 |
++ |
|
363 |
++ if (fn(c, client_protos, proposed_protos) == DONE) |
|
364 |
++ break; |
|
365 |
++ } |
|
366 |
++ } |
|
367 |
++ |
|
368 |
++ if (proposed_protos->nelts <= 0) { |
|
369 |
++ ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, c, APLOGNO(02306) |
|
370 |
++ "none of the client alpn protocols are supported"); |
|
371 |
++ return SSL_TLSEXT_ERR_ALERT_FATAL; |
|
372 |
++ } |
|
373 |
++ |
|
374 |
++ /* Now select the most preferred protocol from the proposals. */ |
|
375 |
++ *out = APR_ARRAY_IDX(proposed_protos, 0, const unsigned char *); |
|
376 |
++ for (i = 1; i < proposed_protos->nelts; ++i) { |
|
377 |
++ const unsigned char *proto = APR_ARRAY_IDX(proposed_protos, i, |
|
378 |
++ const unsigned char*); |
|
379 |
++ /* Do we prefer it over existing candidate? */ |
|
380 |
++ if (ssl_cmp_alpn_protos(mctx, *out, proto) < 0) { |
|
381 |
++ *out = proto; |
|
382 |
++ } |
|
383 |
++ } |
|
384 |
++ |
|
385 |
++ size_t len = strlen((const char*)*out); |
|
386 |
++ if (len > 255) { |
|
387 |
++ ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, c, APLOGNO(02306) |
|
388 |
++ "alpn negotiated protocol name too long"); |
|
389 |
++ return SSL_TLSEXT_ERR_ALERT_FATAL; |
|
390 |
++ } |
|
391 |
++ *outlen = (unsigned char)len; |
|
392 |
++ |
|
393 |
++ return SSL_TLSEXT_ERR_OK; |
|
394 |
++} |
|
395 |
++ |
|
396 |
++#elif defined(HAVE_TLS_NPN) |
|
397 |
++/* |
|
398 |
++ * This callback function is executed when SSL needs to decide what protocols |
|
399 |
++ * to advertise during Next Protocol Negotiation (NPN). It must produce a |
|
400 |
++ * string in wire format -- a sequence of length-prefixed strings -- indicating |
|
401 |
++ * the advertised protocols. Refer to SSL_CTX_set_next_protos_advertised_cb |
|
402 |
++ * in OpenSSL for reference. |
|
403 |
++ */ |
|
404 |
++int ssl_callback_AdvertiseNextProtos(SSL *ssl, const unsigned char **data_out, |
|
405 |
++ unsigned int *size_out, void *arg) |
|
406 |
++{ |
|
407 |
++ conn_rec *c = (conn_rec*)SSL_get_app_data(ssl); |
|
408 |
++ SSLConnRec *sslconn = myConnConfig(c); |
|
409 |
++ server_rec *s = mySrvFromConn(c); |
|
410 |
++ SSLSrvConfigRec *sc = mySrvConfig(s); |
|
411 |
++ modssl_ctx_t *mctx = myCtxConfig(sslconn, sc); |
|
412 |
++ apr_array_header_t *protos; |
|
413 |
++ int num_protos; |
|
414 |
++ unsigned int size; |
|
415 |
++ int i, j; |
|
416 |
++ unsigned char *data; |
|
417 |
++ unsigned char *start; |
|
418 |
++ |
|
419 |
++ *data_out = NULL; |
|
420 |
++ *size_out = 0; |
|
421 |
++ |
|
422 |
++ ap_log_cerror(APLOG_MARK, APLOG_INFO, 0, c, APLOGNO(02306) |
|
423 |
++ "advertisingNextProtos"); |
|
424 |
++ |
|
425 |
++ /* If the connection object is not available, or there are no NPN |
|
426 |
++ * hooks registered, then there's nothing for us to do. */ |
|
427 |
++ if (c == NULL || sslconn->alpn_proposefns == NULL) { |
|
428 |
++ return SSL_TLSEXT_ERR_OK; |
|
429 |
++ } |
|
430 |
++ |
|
431 |
++ /* Invoke our alpn_propose_proto hook, giving other modules a chance to |
|
432 |
++ * add alternate protocol names to advertise. */ |
|
433 |
++ protos = apr_array_make(c->pool, 0, sizeof(char *)); |
|
434 |
++ for (i = 0; i < sslconn->alpn_proposefns->nelts; i++) { |
|
435 |
++ ssl_alpn_propose_protos fn = |
|
436 |
++ APR_ARRAY_IDX(sslconn->alpn_proposefns, i, ssl_alpn_propose_protos); |
|
437 |
++ |
|
438 |
++ if (fn(c, NULL, protos) == DONE) |
|
439 |
++ break; |
|
440 |
++ } |
|
441 |
++ if (ssl_array_index(ssl_alpn_propose_protos, "http/1.1") < 0) { |
|
442 |
++ APR_ARRAY_PUSH(ssl_alpn_propose_protos, const unsigned char*) = "http/1.1"; |
|
443 |
++ } |
|
444 |
++ num_protos = protos->nelts; |
|
445 |
++ |
|
446 |
++ ap_log_cerror(APLOG_MARK, APLOG_INFO, 0, c, APLOGNO(02306) |
|
447 |
++ "alpn protos %d to advertise, %d in pref config", num_protos, mctx->ssl_alpn_pref->nelts ); |
|
448 |
++ if (num_protos > 1 && mctx->ssl_alpn_pref && mctx->ssl_alpn_pref->nelts > 0) { |
|
449 |
++ /* Sort the protocol names according to our configured preferences. */ |
|
450 |
++ int insert_idx = 0; |
|
451 |
++ for (i = 0; i < mctx->ssl_alpn_pref->nelts; ++i) { |
|
452 |
++ const char *proto = APR_ARRAY_IDX(mctx->ssl_alpn_pref, i, const char*); |
|
453 |
++ int idx = ssl_array_index(protos, proto); |
|
454 |
++ if (idx > insert_idx) { |
|
455 |
++ /* bubble found protocol up */ |
|
456 |
++ for (j = idx; j > insert_idx; --j) { |
|
457 |
++ ((const char **)protos->elts)[j] = ((const char **)protos->elts)[j-1]; |
|
458 |
++ } |
|
459 |
++ ((const char **)protos->elts)[insert_idx] = proto; |
|
460 |
++ ++insert_idx; |
|
461 |
++ } |
|
462 |
++ } |
|
463 |
++ } |
|
464 |
++ |
|
465 |
++ /* We now have a list of null-terminated strings; we need to concatenate |
|
466 |
++ * them together into a single string, where each protocol name is prefixed |
|
467 |
++ * by its length. First, calculate how long that string will be. */ |
|
468 |
++ size = 0; |
|
469 |
++ for (i = 0; i < num_protos; ++i) { |
|
470 |
++ const char *string = APR_ARRAY_IDX(protos, i, const char*); |
|
471 |
++ unsigned int length = strlen(string); |
|
472 |
++ /* If the protocol name is too long (the length must fit in one byte), |
|
473 |
++ * then log an error and skip it. */ |
|
474 |
++ if (length > 255) { |
|
475 |
++ ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, c, APLOGNO(02307) |
|
476 |
++ "SSL NPN protocol name too long (length=%u): %s", |
|
477 |
++ length, string); |
|
478 |
++ continue; |
|
479 |
++ } |
|
480 |
++ /* Leave room for the length prefix (one byte) plus the protocol name |
|
481 |
++ * itself. */ |
|
482 |
++ size += 1 + length; |
|
483 |
++ } |
|
484 |
++ |
|
485 |
++ /* If there is nothing to advertise (either because no modules added |
|
486 |
++ * anything to the protos array, or because all strings added to the array |
|
487 |
++ * were skipped), then we're done. */ |
|
488 |
++ if (size == 0) { |
|
489 |
++ return SSL_TLSEXT_ERR_OK; |
|
490 |
++ } |
|
491 |
++ |
|
492 |
++ /* Now we can build the string. Copy each protocol name string into the |
|
493 |
++ * larger string, prefixed by its length. */ |
|
494 |
++ data = apr_palloc(c->pool, size * sizeof(unsigned char)); |
|
495 |
++ start = data; |
|
496 |
++ for (i = 0; i < num_protos; ++i) { |
|
497 |
++ const char *string = APR_ARRAY_IDX(protos, i, const char*); |
|
498 |
++ apr_size_t length = strlen(string); |
|
499 |
++ if (length > 255) |
|
500 |
++ continue; |
|
501 |
++ *start = (unsigned char)length; |
|
502 |
++ ++start; |
|
503 |
++ memcpy(start, string, length * sizeof(unsigned char)); |
|
504 |
++ start += length; |
|
505 |
++ } |
|
506 |
++ |
|
507 |
++ /* Success. */ |
|
508 |
++ *data_out = data; |
|
509 |
++ *size_out = size; |
|
510 |
++ return SSL_TLSEXT_ERR_OK; |
|
511 |
++} |
|
512 |
++ |
|
513 |
++#endif /* HAVE_TLS_NPN */ |
|
514 |
++ |
|
515 |
+ #ifdef HAVE_SRP |
|
516 |
+ |
|
517 |
+ int ssl_callback_SRPServerParams(SSL *ssl, int *ad, void *arg) |
|
518 |
+--- gen/httpd-2.4.x/modules/ssl/ssl_private.h 2015-01-19 16:52:30.000000000 +0100 |
|
519 |
++++ gen/httpd-2.4.x/modules/ssl/ssl_private.h 2015-01-19 15:42:53.908000000 +0100 |
|
520 |
+@@ -176,6 +169,16 @@ |
|
521 |
+ #endif |
|
522 |
+ #endif |
|
523 |
+ |
|
524 |
++/* ALPN Protocol Negotiation */ |
|
525 |
++#if OPENSSL_VERSION_NUMBER >= 0x10002000L && !defined(OPENSSL_NO_TLSEXT) |
|
526 |
++#define HAVE_TLS_ALPN |
|
527 |
++#endif |
|
528 |
++ |
|
529 |
++/* Next Protocol Negotiation */ |
|
530 |
++#if !defined(OPENSSL_NO_NEXTPROTONEG) && defined(OPENSSL_NPN_NEGOTIATED) |
|
531 |
++#define HAVE_TLS_NPN |
|
532 |
++#endif |
|
533 |
++ |
|
534 |
+ /* Secure Remote Password */ |
|
535 |
+ #if !defined(OPENSSL_NO_SRP) && defined(SSL_CTRL_SET_TLS_EXT_SRP_USERNAME_CB) |
|
536 |
+ #define HAVE_SRP |
|
537 |
+@@ -443,6 +446,12 @@ |
|
538 |
+ * connection */ |
|
539 |
+ } reneg_state; |
|
540 |
+ |
|
541 |
++#ifdef HAVE_TLS_NPN |
|
542 |
++ /* Poor man's inter-module optional hooks for NPN. */ |
|
543 |
++ apr_array_header_t *alpn_proposefns; /* list of ssl_alpn_propose_protos callbacks */ |
|
544 |
++ apr_array_header_t *alpn_negofns; /* list of ssl_alpn_proto_negotiated callbacks. */ |
|
545 |
++#endif |
|
546 |
++ |
|
547 |
+ server_rec *server; |
|
548 |
+ } SSLConnRec; |
|
549 |
+ |
|
550 |
+@@ -622,6 +631,10 @@ |
|
551 |
+ SSL_CONF_CTX *ssl_ctx_config; /* Configuration context */ |
|
552 |
+ apr_array_header_t *ssl_ctx_param; /* parameters to pass to SSL_CTX */ |
|
553 |
+ #endif |
|
554 |
++ |
|
555 |
++#if defined(HAVE_ALPN_NPN) || defined(HAVE_TLS_NPN) |
|
556 |
++ apr_array_header_t *ssl_alpn_pref; /* protocol names in order of preference */ |
|
557 |
++#endif |
|
558 |
+ } modssl_ctx_t; |
|
559 |
+ |
|
560 |
+ struct SSLSrvConfigRec { |
|
561 |
+@@ -748,6 +759,10 @@ |
|
562 |
+ const char *ssl_cmd_SSLOpenSSLConfCmd(cmd_parms *cmd, void *dcfg, const char *arg1, const char *arg2); |
|
563 |
+ #endif |
|
564 |
+ |
|
565 |
++#if defined(HAVE_ALPN_NPN) || defined(HAVE_TLS_NPN) |
|
566 |
++const char *ssl_cmd_SSLAlpnPreference(cmd_parms *cmd, void *dcfg, const char *protocol); |
|
567 |
++#endif |
|
568 |
++ |
|
569 |
+ #ifdef HAVE_SRP |
|
570 |
+ const char *ssl_cmd_SSLSRPVerifierFile(cmd_parms *cmd, void *dcfg, const char *arg); |
|
571 |
+ const char *ssl_cmd_SSLSRPUnknownUserSeed(cmd_parms *cmd, void *dcfg, const char *arg); |
|
572 |
+@@ -796,6 +811,14 @@ |
|
573 |
+ EVP_CIPHER_CTX *, HMAC_CTX *, int); |
|
574 |
+ #endif |
|
575 |
+ |
|
576 |
++#ifdef HAVE_TLS_ALPN |
|
577 |
++int ssl_callback_alpn_select(SSL *ssl, const unsigned char **out, |
|
578 |
++ unsigned char *outlen, const unsigned char *in, |
|
579 |
++ unsigned int inlen, void *arg); |
|
580 |
++#elif defined(HAVE_TLS_NPN) |
|
581 |
++int ssl_callback_AdvertiseNextProtos(SSL *ssl, const unsigned char **data, unsigned int *len, void *arg); |
|
582 |
++#endif |
|
583 |
++ |
|
584 |
+ /** Session Cache Support */ |
|
585 |
+ apr_status_t ssl_scache_init(server_rec *, apr_pool_t *); |
|
586 |
+ void ssl_scache_status_register(apr_pool_t *p); |
|
0 | 587 |