import httpd-2.4.51-7.el9_0
This commit is contained in:
commit
f0aa546a82
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
SOURCES/apache-poweredby.png
|
||||||
|
SOURCES/httpd-2.4.51.tar.bz2
|
2
.httpd.metadata
Normal file
2
.httpd.metadata
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
3a7449d6cff00e5ccb3ed8571f34c0528555d38f SOURCES/apache-poweredby.png
|
||||||
|
d8ae02630f836d7cf60e24f4676e633518f16e2b SOURCES/httpd-2.4.51.tar.bz2
|
69
SOURCES/00-base.conf
Normal file
69
SOURCES/00-base.conf
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
#
|
||||||
|
# This file loads most of the modules included with the Apache HTTP
|
||||||
|
# Server itself.
|
||||||
|
#
|
||||||
|
|
||||||
|
LoadModule access_compat_module modules/mod_access_compat.so
|
||||||
|
LoadModule actions_module modules/mod_actions.so
|
||||||
|
LoadModule alias_module modules/mod_alias.so
|
||||||
|
LoadModule allowmethods_module modules/mod_allowmethods.so
|
||||||
|
LoadModule auth_basic_module modules/mod_auth_basic.so
|
||||||
|
LoadModule auth_digest_module modules/mod_auth_digest.so
|
||||||
|
LoadModule authn_anon_module modules/mod_authn_anon.so
|
||||||
|
LoadModule authn_core_module modules/mod_authn_core.so
|
||||||
|
LoadModule authn_dbd_module modules/mod_authn_dbd.so
|
||||||
|
LoadModule authn_dbm_module modules/mod_authn_dbm.so
|
||||||
|
LoadModule authn_file_module modules/mod_authn_file.so
|
||||||
|
LoadModule authn_socache_module modules/mod_authn_socache.so
|
||||||
|
LoadModule authz_core_module modules/mod_authz_core.so
|
||||||
|
LoadModule authz_dbd_module modules/mod_authz_dbd.so
|
||||||
|
LoadModule authz_dbm_module modules/mod_authz_dbm.so
|
||||||
|
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
|
||||||
|
LoadModule authz_host_module modules/mod_authz_host.so
|
||||||
|
LoadModule authz_owner_module modules/mod_authz_owner.so
|
||||||
|
LoadModule authz_user_module modules/mod_authz_user.so
|
||||||
|
LoadModule autoindex_module modules/mod_autoindex.so
|
||||||
|
LoadModule brotli_module modules/mod_brotli.so
|
||||||
|
LoadModule cache_module modules/mod_cache.so
|
||||||
|
LoadModule cache_disk_module modules/mod_cache_disk.so
|
||||||
|
LoadModule cache_socache_module modules/mod_cache_socache.so
|
||||||
|
LoadModule data_module modules/mod_data.so
|
||||||
|
LoadModule dbd_module modules/mod_dbd.so
|
||||||
|
LoadModule deflate_module modules/mod_deflate.so
|
||||||
|
LoadModule dir_module modules/mod_dir.so
|
||||||
|
LoadModule dumpio_module modules/mod_dumpio.so
|
||||||
|
LoadModule echo_module modules/mod_echo.so
|
||||||
|
LoadModule env_module modules/mod_env.so
|
||||||
|
LoadModule expires_module modules/mod_expires.so
|
||||||
|
LoadModule ext_filter_module modules/mod_ext_filter.so
|
||||||
|
LoadModule filter_module modules/mod_filter.so
|
||||||
|
LoadModule headers_module modules/mod_headers.so
|
||||||
|
LoadModule include_module modules/mod_include.so
|
||||||
|
LoadModule info_module modules/mod_info.so
|
||||||
|
LoadModule log_config_module modules/mod_log_config.so
|
||||||
|
LoadModule logio_module modules/mod_logio.so
|
||||||
|
LoadModule macro_module modules/mod_macro.so
|
||||||
|
LoadModule mime_magic_module modules/mod_mime_magic.so
|
||||||
|
LoadModule mime_module modules/mod_mime.so
|
||||||
|
LoadModule negotiation_module modules/mod_negotiation.so
|
||||||
|
LoadModule remoteip_module modules/mod_remoteip.so
|
||||||
|
LoadModule reqtimeout_module modules/mod_reqtimeout.so
|
||||||
|
LoadModule request_module modules/mod_request.so
|
||||||
|
LoadModule rewrite_module modules/mod_rewrite.so
|
||||||
|
LoadModule setenvif_module modules/mod_setenvif.so
|
||||||
|
LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
|
||||||
|
LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
|
||||||
|
LoadModule socache_dbm_module modules/mod_socache_dbm.so
|
||||||
|
LoadModule socache_memcache_module modules/mod_socache_memcache.so
|
||||||
|
LoadModule socache_redis_module modules/mod_socache_redis.so
|
||||||
|
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
|
||||||
|
LoadModule status_module modules/mod_status.so
|
||||||
|
LoadModule substitute_module modules/mod_substitute.so
|
||||||
|
LoadModule suexec_module modules/mod_suexec.so
|
||||||
|
LoadModule unique_id_module modules/mod_unique_id.so
|
||||||
|
LoadModule unixd_module modules/mod_unixd.so
|
||||||
|
LoadModule userdir_module modules/mod_userdir.so
|
||||||
|
LoadModule version_module modules/mod_version.so
|
||||||
|
LoadModule vhost_alias_module modules/mod_vhost_alias.so
|
||||||
|
LoadModule watchdog_module modules/mod_watchdog.so
|
||||||
|
|
3
SOURCES/00-dav.conf
Normal file
3
SOURCES/00-dav.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
LoadModule dav_module modules/mod_dav.so
|
||||||
|
LoadModule dav_fs_module modules/mod_dav_fs.so
|
||||||
|
LoadModule dav_lock_module modules/mod_dav_lock.so
|
1
SOURCES/00-lua.conf
Normal file
1
SOURCES/00-lua.conf
Normal file
@ -0,0 +1 @@
|
|||||||
|
LoadModule lua_module modules/mod_lua.so
|
23
SOURCES/00-mpm.conf
Normal file
23
SOURCES/00-mpm.conf
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
# Select the MPM module which should be used by uncommenting exactly
|
||||||
|
# one of the following LoadModule lines. See the httpd.conf(5) man
|
||||||
|
# page for more information on changing the MPM.
|
||||||
|
|
||||||
|
# prefork MPM: Implements a non-threaded, pre-forking web server
|
||||||
|
# See: http://httpd.apache.org/docs/2.4/mod/prefork.html
|
||||||
|
#
|
||||||
|
# NOTE: If enabling prefork, the httpd_graceful_shutdown SELinux
|
||||||
|
# boolean should be enabled, to allow graceful stop/shutdown.
|
||||||
|
#
|
||||||
|
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
|
||||||
|
|
||||||
|
# worker MPM: Multi-Processing Module implementing a hybrid
|
||||||
|
# multi-threaded multi-process web server
|
||||||
|
# See: http://httpd.apache.org/docs/2.4/mod/worker.html
|
||||||
|
#
|
||||||
|
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
|
||||||
|
|
||||||
|
# event MPM: A variant of the worker MPM with the goal of consuming
|
||||||
|
# threads only for connections with active processing
|
||||||
|
# See: http://httpd.apache.org/docs/2.4/mod/event.html
|
||||||
|
#
|
||||||
|
#LoadModule mpm_event_module modules/mod_mpm_event.so
|
18
SOURCES/00-optional.conf
Normal file
18
SOURCES/00-optional.conf
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
#
|
||||||
|
# This file lists modules included with the Apache HTTP Server
|
||||||
|
# which are not enabled by default.
|
||||||
|
#
|
||||||
|
|
||||||
|
#LoadModule asis_module modules/mod_asis.so
|
||||||
|
#LoadModule buffer_module modules/mod_buffer.so
|
||||||
|
#LoadModule heartbeat_module modules/mod_heartbeat.so
|
||||||
|
#LoadModule heartmonitor_module modules/mod_heartmonitor.so
|
||||||
|
#LoadModule usertrack_module modules/mod_usertrack.so
|
||||||
|
#LoadModule dialup_module modules/mod_dialup.so
|
||||||
|
#LoadModule charset_lite_module modules/mod_charset_lite.so
|
||||||
|
#LoadModule log_debug_module modules/mod_log_debug.so
|
||||||
|
#LoadModule log_forensic_module modules/mod_log_forensic.so
|
||||||
|
#LoadModule ratelimit_module modules/mod_ratelimit.so
|
||||||
|
#LoadModule reflector_module modules/mod_reflector.so
|
||||||
|
#LoadModule sed_module modules/mod_sed.so
|
||||||
|
#LoadModule speling_module modules/mod_speling.so
|
18
SOURCES/00-proxy.conf
Normal file
18
SOURCES/00-proxy.conf
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# This file configures all the proxy modules:
|
||||||
|
LoadModule proxy_module modules/mod_proxy.so
|
||||||
|
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so
|
||||||
|
LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so
|
||||||
|
LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so
|
||||||
|
LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so
|
||||||
|
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
|
||||||
|
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
|
||||||
|
LoadModule proxy_connect_module modules/mod_proxy_connect.so
|
||||||
|
LoadModule proxy_express_module modules/mod_proxy_express.so
|
||||||
|
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
|
||||||
|
LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so
|
||||||
|
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
|
||||||
|
LoadModule proxy_http_module modules/mod_proxy_http.so
|
||||||
|
LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so
|
||||||
|
LoadModule proxy_scgi_module modules/mod_proxy_scgi.so
|
||||||
|
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so
|
||||||
|
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
|
3
SOURCES/00-proxyhtml.conf
Normal file
3
SOURCES/00-proxyhtml.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# This file configures mod_proxy_html and mod_xml2enc:
|
||||||
|
LoadModule xml2enc_module modules/mod_xml2enc.so
|
||||||
|
LoadModule proxy_html_module modules/mod_proxy_html.so
|
1
SOURCES/00-ssl.conf
Normal file
1
SOURCES/00-ssl.conf
Normal file
@ -0,0 +1 @@
|
|||||||
|
LoadModule ssl_module modules/mod_ssl.so
|
2
SOURCES/00-systemd.conf
Normal file
2
SOURCES/00-systemd.conf
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
# This file configures systemd module:
|
||||||
|
LoadModule systemd_module modules/mod_systemd.so
|
11
SOURCES/01-cgi.conf
Normal file
11
SOURCES/01-cgi.conf
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# This configuration file loads a CGI module appropriate to the MPM
|
||||||
|
# which has been configured in 00-mpm.conf. mod_cgid should be used
|
||||||
|
# with a threaded MPM; mod_cgi with the prefork MPM.
|
||||||
|
|
||||||
|
<IfModule !mpm_prefork_module>
|
||||||
|
LoadModule cgid_module modules/mod_cgid.so
|
||||||
|
</IfModule>
|
||||||
|
<IfModule mpm_prefork_module>
|
||||||
|
LoadModule cgi_module modules/mod_cgi.so
|
||||||
|
</IfModule>
|
||||||
|
|
3
SOURCES/01-ldap.conf
Normal file
3
SOURCES/01-ldap.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# This file configures the LDAP modules:
|
||||||
|
LoadModule ldap_module modules/mod_ldap.so
|
||||||
|
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
|
6
SOURCES/01-session.conf
Normal file
6
SOURCES/01-session.conf
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
LoadModule session_module modules/mod_session.so
|
||||||
|
LoadModule session_cookie_module modules/mod_session_cookie.so
|
||||||
|
LoadModule session_dbd_module modules/mod_session_dbd.so
|
||||||
|
LoadModule auth_form_module modules/mod_auth_form.so
|
||||||
|
|
||||||
|
#LoadModule session_crypto_module modules/mod_session_crypto.so
|
5
SOURCES/10-listen443.conf
Normal file
5
SOURCES/10-listen443.conf
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# This file is part of mod_ssl. It enables listening on port 443 when
|
||||||
|
# socket activation is used.
|
||||||
|
|
||||||
|
[Socket]
|
||||||
|
ListenStream=443
|
8818
SOURCES/KEYS
Normal file
8818
SOURCES/KEYS
Normal file
File diff suppressed because it is too large
Load Diff
9
SOURCES/README.confd
Normal file
9
SOURCES/README.confd
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
|
||||||
|
This directory holds configuration files for the Apache HTTP Server;
|
||||||
|
any files in this directory which have the ".conf" extension will be
|
||||||
|
processed as httpd configuration files. The directory is used in
|
||||||
|
addition to the directory /etc/httpd/conf.modules.d/, which contains
|
||||||
|
configuration files necessary to load modules.
|
||||||
|
|
||||||
|
Files are processed in sorted order. See httpd.conf(5) for more
|
||||||
|
information.
|
10
SOURCES/README.confmod
Normal file
10
SOURCES/README.confmod
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
This directory holds configuration files for the Apache HTTP Server;
|
||||||
|
any files in this directory which have the ".conf" extension will be
|
||||||
|
processed as httpd configuration files. This directory contains
|
||||||
|
configuration fragments necessary only to load modules.
|
||||||
|
Administrators should use the directory "/etc/httpd/conf.d" to modify
|
||||||
|
the configuration of httpd, or any modules.
|
||||||
|
|
||||||
|
Files are processed in sorted order and should have a two digit
|
||||||
|
numeric prefix. See httpd.conf(5) for more information.
|
2
SOURCES/action-configtest.sh
Normal file
2
SOURCES/action-configtest.sh
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
exec /usr/sbin/httpd -t
|
2
SOURCES/action-graceful.sh
Normal file
2
SOURCES/action-graceful.sh
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
exec /sbin/apachectl graceful
|
74
SOURCES/apachectl.sh
Executable file
74
SOURCES/apachectl.sh
Executable file
@ -0,0 +1,74 @@
|
|||||||
|
#!/usr/bin/sh
|
||||||
|
#
|
||||||
|
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
# contributor license agreements. See the NOTICE file distributed with
|
||||||
|
# this work for additional information regarding copyright ownership.
|
||||||
|
# The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
# (the "License"); you may not use this file except in compliance with
|
||||||
|
# the License. You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
|
||||||
|
###
|
||||||
|
### NOTE: This is a replacement version of the "apachectl" script with
|
||||||
|
### some differences in behaviour to the version distributed with
|
||||||
|
### Apache httpd. Please read the apachectl(8) man page for more
|
||||||
|
### information.
|
||||||
|
###
|
||||||
|
|
||||||
|
if [ "x$1" = "x-k" ]; then
|
||||||
|
shift
|
||||||
|
fi
|
||||||
|
|
||||||
|
ACMD="$1"
|
||||||
|
ARGV="$@"
|
||||||
|
SVC='httpd.service'
|
||||||
|
HTTPD='@HTTPDBIN@'
|
||||||
|
|
||||||
|
if [ "x$2" != "x" ] ; then
|
||||||
|
echo Passing arguments to httpd using apachectl is no longer supported.
|
||||||
|
echo You can only start/stop/restart httpd using this script.
|
||||||
|
echo To pass extra arguments to httpd, see the $SVC'(8)'
|
||||||
|
echo man page.
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
case $ACMD in
|
||||||
|
start|stop|restart|status)
|
||||||
|
/usr/bin/systemctl --no-pager $ACMD $SVC
|
||||||
|
ERROR=$?
|
||||||
|
;;
|
||||||
|
graceful)
|
||||||
|
if /usr/bin/systemctl -q is-active $SVC; then
|
||||||
|
/usr/bin/systemctl kill --signal=SIGUSR1 --kill-who=main $SVC
|
||||||
|
else
|
||||||
|
/usr/bin/systemctl start $SVC
|
||||||
|
fi
|
||||||
|
ERROR=$?
|
||||||
|
;;
|
||||||
|
graceful-stop)
|
||||||
|
/usr/bin/systemctl kill --signal=SIGWINCH --kill-who=main $SVC
|
||||||
|
ERROR=$?
|
||||||
|
;;
|
||||||
|
configtest|-t)
|
||||||
|
$HTTPD -t
|
||||||
|
ERROR=$?
|
||||||
|
;;
|
||||||
|
-v|-V)
|
||||||
|
$HTTPD $ACMD
|
||||||
|
ERROR=$?
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo apachectl: The \"$ACMD\" option is not supported. 1>&2
|
||||||
|
ERROR=2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit $ERROR
|
||||||
|
|
191
SOURCES/apachectl.xml
Normal file
191
SOURCES/apachectl.xml
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
<?xml version='1.0' encoding='UTF-8' ?>
|
||||||
|
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.4/docbookx.dtd">[
|
||||||
|
|
||||||
|
]>
|
||||||
|
<!--
|
||||||
|
Copyright 2020 Red Hat, Inc.
|
||||||
|
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
<refentry>
|
||||||
|
<refentryinfo>
|
||||||
|
<title>apachectl</title>
|
||||||
|
<productname>httpd</productname>
|
||||||
|
<author><contrib>Apache man page</contrib><othername>Apache Software Foundation contributors</othername></author>
|
||||||
|
<author><contrib>Fedora man page</contrib><surname>Dana</surname><firstname>Frank</firstname></author>
|
||||||
|
</refentryinfo>
|
||||||
|
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>apachectl</refentrytitle>
|
||||||
|
<manvolnum>8</manvolnum>
|
||||||
|
</refmeta>
|
||||||
|
|
||||||
|
<refnamediv>
|
||||||
|
<refname>apachectl</refname>
|
||||||
|
<refpurpose>Server control interface for httpd</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
|
||||||
|
<refsynopsisdiv id='synopsis'>
|
||||||
|
<cmdsynopsis>
|
||||||
|
<command>apachectl</command>
|
||||||
|
<arg choice='opt'><replaceable>command</replaceable> </arg>
|
||||||
|
<sbr/>
|
||||||
|
</cmdsynopsis>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
|
||||||
|
<!-- body begins here -->
|
||||||
|
<refsect1 id='description'>
|
||||||
|
<title>Description</title>
|
||||||
|
|
||||||
|
<para><command>apachectl</command> is a front end to the Apache HyperText
|
||||||
|
Transfer Protocol (HTTP) server. It is designed to help the
|
||||||
|
administrator control the functioning of the Apache
|
||||||
|
<command>httpd</command> daemon.</para>
|
||||||
|
|
||||||
|
<para>The <command>apachectl</command> script takes one-word arguments like
|
||||||
|
<option>start</option>,
|
||||||
|
<option>restart</option>, and
|
||||||
|
<option>stop</option>, and translates them
|
||||||
|
into appropriate signals to <command>httpd</command>.</para>
|
||||||
|
|
||||||
|
<para>The <command>apachectl</command> script returns a 0 exit value on
|
||||||
|
success, and >0 if an error occurs.</para>
|
||||||
|
|
||||||
|
<refsect2 id="compatibility">
|
||||||
|
<title>Compatibility</title>
|
||||||
|
|
||||||
|
<para>The version of <command>apachectl</command> used on this
|
||||||
|
system is a replacement script intended to be mostly (but not
|
||||||
|
completely) compatible with version provided with
|
||||||
|
<emphasis>Apache httpd</emphasis>. This
|
||||||
|
<command>apachectl</command> mostly acts as a wrapper around
|
||||||
|
<command>systemctl</command> and manipulates the
|
||||||
|
<command>systemd</command> service for <command>httpd</command>.
|
||||||
|
The interface to the <emphasis>Apache</emphasis> version of
|
||||||
|
<command>apachectl</command> is described at <ulink
|
||||||
|
url="https://httpd.apache.org/docs/2.4/programs/apachectl.html"/>.</para>
|
||||||
|
|
||||||
|
<para>The following differences are present in the version of
|
||||||
|
<command>apachectl</command> present on this system:
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para>Option arguments passed when starting
|
||||||
|
<command>httpd</command> are not allowed. These should be
|
||||||
|
configured in the systemd service directly (see <citerefentry><refentrytitle>httpd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>).</para></listitem>
|
||||||
|
|
||||||
|
<listitem><para>The <command>"fullstatus"</command> option is
|
||||||
|
not available.</para></listitem>
|
||||||
|
|
||||||
|
<listitem><para>The <command>"status"</command> option does
|
||||||
|
not use or rely on the running server's
|
||||||
|
<emphasis>server-status</emphasis> output.</para></listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
</para>
|
||||||
|
</refsect2>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id='options'>
|
||||||
|
<title>Options</title>
|
||||||
|
<variablelist remap='TP'>
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>start</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Start the Apache <command>httpd</command> daemon. Gives an error if it
|
||||||
|
is already running. This is equivalent to <command>systemctl start httpd.service</command>.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>stop</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Stops the Apache <command>httpd</command> daemon. This is equivalent to
|
||||||
|
<command>systemctl stop httpd.service</command>.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>restart</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Restarts the Apache <command>httpd</command> daemon. If the daemon is
|
||||||
|
not running, it is started. This is equivalent
|
||||||
|
to <command>systemctl restart httpd.service</command>.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>status</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Displays a brief status report. This is equivalent to <command>systemctl status httpd.service.</command></para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>graceful</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Gracefully restarts the Apache <command>httpd</command> daemon. If the
|
||||||
|
daemon is not running, it is started. This differs from a normal
|
||||||
|
restart in that currently open connections are not aborted. A side
|
||||||
|
effect is that old log files will not be closed immediately. This
|
||||||
|
means that if used in a log rotation script, a substantial delay may
|
||||||
|
be necessary to ensure that the old log files are closed before
|
||||||
|
processing them. This is equivalent to
|
||||||
|
<command>systemctl kill --signal=SIGUSR1 --kill-who=main httpd.service</command>.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>graceful-stop</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Gracefully stops the Apache <command>httpd</command> daemon.
|
||||||
|
This differs from a normal stop in that currently open connections are not
|
||||||
|
aborted. A side effect is that old log files will not be closed immediately.
|
||||||
|
This is equivalent to
|
||||||
|
<command>systemctl kill --signal=SIGWINCH --kill-who=main httpd.service</command>.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>configtest</option></term>
|
||||||
|
<listitem>
|
||||||
|
<para>Run a configuration file syntax test. It parses the configuration
|
||||||
|
files and either reports <literal>Syntax OK</literal>
|
||||||
|
or detailed information about the particular syntax error. This is
|
||||||
|
equivalent to <command>httpd -t</command>.</para>
|
||||||
|
</listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1 id='bugs'>
|
||||||
|
<title>Bugs</title>
|
||||||
|
<para>Please report bugs by filing an issue in Bugzilla via <ulink url='https://bugzilla.redhat.com/'/>.</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>See also</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
<citerefentry><refentrytitle>httpd</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>httpd.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>httpd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
</refentry>
|
24
SOURCES/config.layout
Normal file
24
SOURCES/config.layout
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Layout used in Fedora httpd packaging.
|
||||||
|
<Layout Fedora>
|
||||||
|
prefix: /etc/httpd
|
||||||
|
localstatedir: /var
|
||||||
|
exec_prefix: /usr
|
||||||
|
bindir: ${exec_prefix}/bin
|
||||||
|
sbindir: ${exec_prefix}/sbin
|
||||||
|
libdir: ${exec_prefix}/lib
|
||||||
|
libexecdir: ${exec_prefix}/libexec
|
||||||
|
mandir: ${exec_prefix}/man
|
||||||
|
sysconfdir: /etc/httpd/conf
|
||||||
|
datadir: ${exec_prefix}/share/httpd
|
||||||
|
installbuilddir: ${libdir}/httpd/build
|
||||||
|
errordir: ${datadir}/error
|
||||||
|
iconsdir: ${datadir}/icons
|
||||||
|
htdocsdir: ${localstatedir}/www/html
|
||||||
|
manualdir: ${datadir}/manual
|
||||||
|
cgidir: ${localstatedir}/www/cgi-bin
|
||||||
|
includedir: ${exec_prefix}/include/httpd
|
||||||
|
runtimedir: ${prefix}/run
|
||||||
|
logfiledir: ${localstatedir}/log/httpd
|
||||||
|
statedir: ${prefix}/state
|
||||||
|
proxycachedir: ${localstatedir}/cache/httpd/proxy
|
||||||
|
</Layout>
|
11
SOURCES/htcacheclean.service
Normal file
11
SOURCES/htcacheclean.service
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Disk Cache Cleaning Daemon for the Apache HTTP Server
|
||||||
|
After=httpd.service
|
||||||
|
Documentation=man:htcacheclean.service(8)
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=forking
|
||||||
|
User=apache
|
||||||
|
PIDFile=/run/httpd/htcacheclean/pid
|
||||||
|
EnvironmentFile=/etc/sysconfig/htcacheclean
|
||||||
|
ExecStart=/usr/sbin/htcacheclean -P /run/httpd/htcacheclean/pid -d $INTERVAL -p $CACHE_ROOT -l $LIMIT $OPTIONS
|
123
SOURCES/htcacheclean.service.xml
Normal file
123
SOURCES/htcacheclean.service.xml
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
|
||||||
|
|
||||||
|
]>
|
||||||
|
<!--
|
||||||
|
Copyright 2018 Red Hat, Inc.
|
||||||
|
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language overning permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
<refentry>
|
||||||
|
<refentryinfo>
|
||||||
|
<title>htcacheclean systemd unit</title>
|
||||||
|
<productname>httpd</productname>
|
||||||
|
<author><contrib>Author</contrib><surname>Orton</surname><firstname>Joe</firstname><email>jorton@redhat.com</email></author>
|
||||||
|
</refentryinfo>
|
||||||
|
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>htcacheclean.service</refentrytitle>
|
||||||
|
<manvolnum>8</manvolnum>
|
||||||
|
</refmeta>
|
||||||
|
|
||||||
|
<refnamediv>
|
||||||
|
<refname>htcacheclean.service</refname>
|
||||||
|
<refpurpose>htcacheclean unit file for systemd</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<para>
|
||||||
|
<filename>/usr/lib/systemd/system/htcacheclean.service</filename>
|
||||||
|
</para>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Description</title>
|
||||||
|
|
||||||
|
<para>This manual page describes the <command>systemd</command>
|
||||||
|
unit file for the <command>htcacheclean</command> daemon. This
|
||||||
|
unit file provides a service which runs
|
||||||
|
<command>htcacheclean</command> in daemon mode,
|
||||||
|
periodically cleaning the disk cache root to ensure disk space
|
||||||
|
usage is within configured limits.</para>
|
||||||
|
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Options</title>
|
||||||
|
|
||||||
|
<para>The service is configured by configuration file
|
||||||
|
<filename>/etc/sysconfig/htcacheclean</filename>. The following
|
||||||
|
variables are used, following standard <command>systemd</command>
|
||||||
|
<varname>EnvironmentFile=</varname> syntax:</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>INTERVAL=</varname></term>
|
||||||
|
|
||||||
|
<listitem><para>Sets the interval between cache clean runs, in
|
||||||
|
minutes. By default this is configured as
|
||||||
|
<emphasis>15</emphasis>.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>CACHE_ROOT=</varname></term>
|
||||||
|
|
||||||
|
<listitem><para>Sets the directory name used for the cache
|
||||||
|
root. By default this is configured as
|
||||||
|
<filename>/var/cache/httpd/proxy</filename>.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>LIMIT=</varname></term>
|
||||||
|
|
||||||
|
<listitem><para>Sets the total disk cache space limit, in
|
||||||
|
bytes. Use a <emphasis>K</emphasis> or <emphasis>M</emphasis>
|
||||||
|
suffix to signify kilobytes or megabytes. By default this is
|
||||||
|
set to <emphasis>100M</emphasis>.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><varname>OPTIONS=</varname></term>
|
||||||
|
|
||||||
|
<listitem><para>Any other options to pass to
|
||||||
|
<command>htcacheclean</command>.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Files</title>
|
||||||
|
|
||||||
|
<para><filename>/usr/lib/systemd/system/htcacheclean.service</filename>,
|
||||||
|
<filename>/etc/sysconfig/htcacheclean</filename></para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>See also</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
<citerefentry><refentrytitle>htcacheclean</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>httpd</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>httpd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>8</manvolnum></citerefentry>
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
</refentry>
|
||||||
|
|
||||||
|
<!-- LocalWords: systemd httpd htcacheclean
|
||||||
|
-->
|
16
SOURCES/htcacheclean.sysconf
Normal file
16
SOURCES/htcacheclean.sysconf
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#
|
||||||
|
# Configuration options for systemd service, htcacheclean.service.
|
||||||
|
# See htcacheclean(8) for more information on available options.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Interval between cache clean runs, in minutes
|
||||||
|
INTERVAL=15
|
||||||
|
|
||||||
|
# Default cache root.
|
||||||
|
CACHE_ROOT=/var/cache/httpd/proxy
|
||||||
|
|
||||||
|
# Cache size limit in bytes (K=Kbytes, M=Mbytes)
|
||||||
|
LIMIT=100M
|
||||||
|
|
||||||
|
# Any other options...
|
||||||
|
OPTIONS=
|
58
SOURCES/httpd-2.4.43-apxs.patch
Normal file
58
SOURCES/httpd-2.4.43-apxs.patch
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
diff --git a/support/apxs.in b/support/apxs.in
|
||||||
|
index b2705fa..c331631 100644
|
||||||
|
--- a/support/apxs.in
|
||||||
|
+++ b/support/apxs.in
|
||||||
|
@@ -35,7 +35,18 @@ if ($ddi >= 0) {
|
||||||
|
|
||||||
|
my %config_vars = ();
|
||||||
|
|
||||||
|
-my $installbuilddir = "@exp_installbuilddir@";
|
||||||
|
+# Awful hack to make apxs libdir-agnostic:
|
||||||
|
+my $pkg_config = "/usr/bin/pkg-config";
|
||||||
|
+if (! -x "$pkg_config") {
|
||||||
|
+ error("$pkg_config not found!");
|
||||||
|
+ exit(1);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+my $libdir = `pkg-config --variable=libdir apr-1`;
|
||||||
|
+chomp $libdir;
|
||||||
|
+
|
||||||
|
+my $installbuilddir = $libdir . "/httpd/build";
|
||||||
|
+
|
||||||
|
get_config_vars($destdir . "$installbuilddir/config_vars.mk",\%config_vars);
|
||||||
|
|
||||||
|
# read the configuration variables once
|
||||||
|
@@ -285,7 +296,7 @@ if ($opt_g) {
|
||||||
|
$data =~ s|%NAME%|$name|sg;
|
||||||
|
$data =~ s|%TARGET%|$CFG_TARGET|sg;
|
||||||
|
$data =~ s|%PREFIX%|$prefix|sg;
|
||||||
|
- $data =~ s|%INSTALLBUILDDIR%|$installbuilddir|sg;
|
||||||
|
+ $data =~ s|%LIBDIR%|$libdir|sg;
|
||||||
|
|
||||||
|
my ($mkf, $mods, $src) = ($data =~ m|^(.+)-=#=-\n(.+)-=#=-\n(.+)|s);
|
||||||
|
|
||||||
|
@@ -463,11 +474,11 @@ if ($opt_c) {
|
||||||
|
my $ldflags = "$CFG_LDFLAGS";
|
||||||
|
if ($opt_p == 1) {
|
||||||
|
|
||||||
|
- my $apr_libs=`$apr_config --cflags --ldflags --link-libtool --libs`;
|
||||||
|
+ my $apr_libs=`$apr_config --cflags --ldflags --link-libtool`;
|
||||||
|
chomp($apr_libs);
|
||||||
|
my $apu_libs="";
|
||||||
|
if ($apr_major_version < 2) {
|
||||||
|
- $apu_libs=`$apu_config --ldflags --link-libtool --libs`;
|
||||||
|
+ $apu_libs=`$apu_config --ldflags --link-libtool`;
|
||||||
|
chomp($apu_libs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -682,8 +693,8 @@ __DATA__
|
||||||
|
|
||||||
|
builddir=.
|
||||||
|
top_srcdir=%PREFIX%
|
||||||
|
-top_builddir=%PREFIX%
|
||||||
|
-include %INSTALLBUILDDIR%/special.mk
|
||||||
|
+top_builddir=%LIBDIR%/httpd
|
||||||
|
+include %LIBDIR%/httpd/build/special.mk
|
||||||
|
|
||||||
|
# the used tools
|
||||||
|
APACHECTL=apachectl
|
82
SOURCES/httpd-2.4.43-cachehardmax.patch
Normal file
82
SOURCES/httpd-2.4.43-cachehardmax.patch
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
diff --git a/modules/cache/cache_util.h b/modules/cache/cache_util.h
|
||||||
|
index 6b92151..4c42a8e 100644
|
||||||
|
--- a/modules/cache/cache_util.h
|
||||||
|
+++ b/modules/cache/cache_util.h
|
||||||
|
@@ -195,6 +195,9 @@ typedef struct {
|
||||||
|
unsigned int store_nostore_set:1;
|
||||||
|
unsigned int enable_set:1;
|
||||||
|
unsigned int disable_set:1;
|
||||||
|
+ /* treat maxex as hard limit */
|
||||||
|
+ unsigned int hardmaxex:1;
|
||||||
|
+ unsigned int hardmaxex_set:1;
|
||||||
|
} cache_dir_conf;
|
||||||
|
|
||||||
|
/* A linked-list of authn providers. */
|
||||||
|
diff --git a/modules/cache/mod_cache.c b/modules/cache/mod_cache.c
|
||||||
|
index 3b9aa4f..8268503 100644
|
||||||
|
--- a/modules/cache/mod_cache.c
|
||||||
|
+++ b/modules/cache/mod_cache.c
|
||||||
|
@@ -1455,6 +1455,11 @@ static apr_status_t cache_save_filter(ap_filter_t *f, apr_bucket_brigade *in)
|
||||||
|
exp = date + dconf->defex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ /* else, forcibly cap the expiry date if required */
|
||||||
|
+ else if (dconf->hardmaxex && (date + dconf->maxex) < exp) {
|
||||||
|
+ exp = date + dconf->maxex;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
info->expire = exp;
|
||||||
|
|
||||||
|
/* We found a stale entry which wasn't really stale. */
|
||||||
|
@@ -1954,7 +1959,9 @@ static void *create_dir_config(apr_pool_t *p, char *dummy)
|
||||||
|
|
||||||
|
/* array of providers for this URL space */
|
||||||
|
dconf->cacheenable = apr_array_make(p, 10, sizeof(struct cache_enable));
|
||||||
|
-
|
||||||
|
+ /* flag; treat maxex as hard limit */
|
||||||
|
+ dconf->hardmaxex = 0;
|
||||||
|
+ dconf->hardmaxex_set = 0;
|
||||||
|
return dconf;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2004,7 +2011,10 @@ static void *merge_dir_config(apr_pool_t *p, void *basev, void *addv) {
|
||||||
|
new->enable_set = add->enable_set || base->enable_set;
|
||||||
|
new->disable = (add->disable_set == 0) ? base->disable : add->disable;
|
||||||
|
new->disable_set = add->disable_set || base->disable_set;
|
||||||
|
-
|
||||||
|
+ new->hardmaxex =
|
||||||
|
+ (add->hardmaxex_set == 0)
|
||||||
|
+ ? base->hardmaxex
|
||||||
|
+ : add->hardmaxex;
|
||||||
|
return new;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2332,12 +2342,18 @@ static const char *add_cache_disable(cmd_parms *parms, void *dummy,
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *set_cache_maxex(cmd_parms *parms, void *dummy,
|
||||||
|
- const char *arg)
|
||||||
|
+ const char *arg, const char *hard)
|
||||||
|
{
|
||||||
|
cache_dir_conf *dconf = (cache_dir_conf *)dummy;
|
||||||
|
|
||||||
|
dconf->maxex = (apr_time_t) (atol(arg) * MSEC_ONE_SEC);
|
||||||
|
dconf->maxex_set = 1;
|
||||||
|
+
|
||||||
|
+ if (hard && strcasecmp(hard, "hard") == 0) {
|
||||||
|
+ dconf->hardmaxex = 1;
|
||||||
|
+ dconf->hardmaxex_set = 1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2545,7 +2561,7 @@ static const command_rec cache_cmds[] =
|
||||||
|
"caching is enabled"),
|
||||||
|
AP_INIT_TAKE1("CacheDisable", add_cache_disable, NULL, RSRC_CONF|ACCESS_CONF,
|
||||||
|
"A partial URL prefix below which caching is disabled"),
|
||||||
|
- AP_INIT_TAKE1("CacheMaxExpire", set_cache_maxex, NULL, RSRC_CONF|ACCESS_CONF,
|
||||||
|
+ AP_INIT_TAKE12("CacheMaxExpire", set_cache_maxex, NULL, RSRC_CONF|ACCESS_CONF,
|
||||||
|
"The maximum time in seconds to cache a document"),
|
||||||
|
AP_INIT_TAKE1("CacheMinExpire", set_cache_minex, NULL, RSRC_CONF|ACCESS_CONF,
|
||||||
|
"The minimum time in seconds to cache a document"),
|
30
SOURCES/httpd-2.4.43-corelimit.patch
Normal file
30
SOURCES/httpd-2.4.43-corelimit.patch
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
diff --git a/server/core.c b/server/core.c
|
||||||
|
index 79b2a82..dc0f17a 100644
|
||||||
|
--- a/server/core.c
|
||||||
|
+++ b/server/core.c
|
||||||
|
@@ -4996,6 +4996,25 @@ static int core_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *pte
|
||||||
|
}
|
||||||
|
apr_pool_cleanup_register(pconf, NULL, ap_mpm_end_gen_helper,
|
||||||
|
apr_pool_cleanup_null);
|
||||||
|
+
|
||||||
|
+#ifdef RLIMIT_CORE
|
||||||
|
+ if (ap_coredumpdir_configured) {
|
||||||
|
+ struct rlimit lim;
|
||||||
|
+
|
||||||
|
+ if (getrlimit(RLIMIT_CORE, &lim) == 0 && lim.rlim_cur == 0) {
|
||||||
|
+ lim.rlim_cur = lim.rlim_max;
|
||||||
|
+ if (setrlimit(RLIMIT_CORE, &lim) == 0) {
|
||||||
|
+ ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, NULL,
|
||||||
|
+ "core dump file size limit raised to %lu bytes",
|
||||||
|
+ lim.rlim_cur);
|
||||||
|
+ } else {
|
||||||
|
+ ap_log_error(APLOG_MARK, APLOG_NOTICE, errno, NULL,
|
||||||
|
+ "core dump file size is zero, setrlimit failed");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
16
SOURCES/httpd-2.4.43-deplibs.patch
Normal file
16
SOURCES/httpd-2.4.43-deplibs.patch
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
diff --git a/configure.in b/configure.in
|
||||||
|
index f8f9442..f276550 100644
|
||||||
|
--- a/configure.in
|
||||||
|
+++ b/configure.in
|
||||||
|
@@ -786,9 +786,9 @@ APACHE_SUBST(INSTALL_SUEXEC)
|
||||||
|
|
||||||
|
dnl APR should go after the other libs, so the right symbols can be picked up
|
||||||
|
if test x${apu_found} != xobsolete; then
|
||||||
|
- AP_LIBS="$AP_LIBS `$apu_config --avoid-ldap --link-libtool --libs`"
|
||||||
|
+ AP_LIBS="$AP_LIBS `$apu_config --avoid-ldap --link-libtool`"
|
||||||
|
fi
|
||||||
|
-AP_LIBS="$AP_LIBS `$apr_config --link-libtool --libs`"
|
||||||
|
+AP_LIBS="$AP_LIBS `$apr_config --link-libtool`"
|
||||||
|
APACHE_SUBST(AP_LIBS)
|
||||||
|
APACHE_SUBST(AP_BUILD_SRCLIB_DIRS)
|
||||||
|
APACHE_SUBST(AP_CLEAN_SRCLIB_DIRS)
|
45
SOURCES/httpd-2.4.43-detect-systemd.patch
Normal file
45
SOURCES/httpd-2.4.43-detect-systemd.patch
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
diff --git a/Makefile.in b/Makefile.in
|
||||||
|
index 0b088ac..9eeb5c7 100644
|
||||||
|
--- a/Makefile.in
|
||||||
|
+++ b/Makefile.in
|
||||||
|
@@ -4,7 +4,7 @@ CLEAN_SUBDIRS = test
|
||||||
|
|
||||||
|
PROGRAM_NAME = $(progname)
|
||||||
|
PROGRAM_SOURCES = modules.c
|
||||||
|
-PROGRAM_LDADD = buildmark.o $(HTTPD_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(PCRE_LIBS) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS)
|
||||||
|
+PROGRAM_LDADD = buildmark.o $(HTTPD_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(HTTPD_LIBS) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS)
|
||||||
|
PROGRAM_PRELINK = $(COMPILE) -c $(top_srcdir)/server/buildmark.c
|
||||||
|
PROGRAM_DEPENDENCIES = \
|
||||||
|
server/libmain.la \
|
||||||
|
diff --git a/acinclude.m4 b/acinclude.m4
|
||||||
|
index 2a7e5d1..eb28321 100644
|
||||||
|
--- a/acinclude.m4
|
||||||
|
+++ b/acinclude.m4
|
||||||
|
@@ -624,6 +624,7 @@ case $host in
|
||||||
|
if test "${ac_cv_header_systemd_sd_daemon_h}" = "no" || test -z "${SYSTEMD_LIBS}"; then
|
||||||
|
AC_MSG_WARN([Your system does not support systemd.])
|
||||||
|
else
|
||||||
|
+ APR_ADDTO(HTTPD_LIBS, [$SYSTEMD_LIBS])
|
||||||
|
AC_DEFINE(HAVE_SYSTEMD, 1, [Define if systemd is supported])
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
diff --git a/configure.in b/configure.in
|
||||||
|
index 3618a5a..74a782b 100644
|
||||||
|
--- a/configure.in
|
||||||
|
+++ b/configure.in
|
||||||
|
@@ -234,6 +234,7 @@ if test "$PCRE_CONFIG" != "false"; then
|
||||||
|
AC_MSG_NOTICE([Using external PCRE library from $PCRE_CONFIG])
|
||||||
|
APR_ADDTO(PCRE_INCLUDES, [`$PCRE_CONFIG --cflags`])
|
||||||
|
APR_ADDTO(PCRE_LIBS, [`$PCRE_CONFIG --libs`])
|
||||||
|
+ APR_ADDTO(HTTPD_LIBS, [\$(PCRE_LIBS)])
|
||||||
|
else
|
||||||
|
AC_MSG_ERROR([pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/])
|
||||||
|
fi
|
||||||
|
@@ -710,6 +711,7 @@ APACHE_SUBST(OS_DIR)
|
||||||
|
APACHE_SUBST(BUILTIN_LIBS)
|
||||||
|
APACHE_SUBST(SHLIBPATH_VAR)
|
||||||
|
APACHE_SUBST(OS_SPECIFIC_VARS)
|
||||||
|
+APACHE_SUBST(HTTPD_LIBS)
|
||||||
|
|
||||||
|
PRE_SHARED_CMDS='echo ""'
|
||||||
|
POST_SHARED_CMDS='echo ""'
|
62
SOURCES/httpd-2.4.43-enable-sslv3.patch
Normal file
62
SOURCES/httpd-2.4.43-enable-sslv3.patch
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
diff --git a/modules/ssl/ssl_engine_config.c b/modules/ssl/ssl_engine_config.c
|
||||||
|
index 979489c..3d6443b 100644
|
||||||
|
--- a/modules/ssl/ssl_engine_config.c
|
||||||
|
+++ b/modules/ssl/ssl_engine_config.c
|
||||||
|
@@ -1485,6 +1485,10 @@ static const char *ssl_cmd_protocol_parse(cmd_parms *parms,
|
||||||
|
#endif
|
||||||
|
else if (strcEQ(w, "all")) {
|
||||||
|
thisopt = SSL_PROTOCOL_ALL;
|
||||||
|
+#ifndef OPENSSL_NO_SSL3
|
||||||
|
+ /* by default, ALL kw doesn't turn on SSLv3 */
|
||||||
|
+ thisopt &= ~SSL_PROTOCOL_SSLV3;
|
||||||
|
+#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return apr_pstrcat(parms->temp_pool,
|
||||||
|
diff --git a/modules/ssl/ssl_engine_init.c b/modules/ssl/ssl_engine_init.c
|
||||||
|
index b0fcf81..ab6f263 100644
|
||||||
|
--- a/modules/ssl/ssl_engine_init.c
|
||||||
|
+++ b/modules/ssl/ssl_engine_init.c
|
||||||
|
@@ -568,6 +568,28 @@ static apr_status_t ssl_init_ctx_tls_extensions(server_rec *s,
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Enable/disable SSLProtocol. If the mod_ssl enables protocol
|
||||||
|
+ * which is disabled by default by OpenSSL, show a warning.
|
||||||
|
+ * "option" is for example SSL_OP_NO_SSLv3.
|
||||||
|
+ */
|
||||||
|
+static void ssl_set_ctx_protocol_option(server_rec *s,
|
||||||
|
+ SSL_CTX *ctx,
|
||||||
|
+ long option,
|
||||||
|
+ int enabled,
|
||||||
|
+ const char *name)
|
||||||
|
+{
|
||||||
|
+ if (!enabled) {
|
||||||
|
+ SSL_CTX_set_options(ctx, option);
|
||||||
|
+ }
|
||||||
|
+ else if (SSL_CTX_get_options(ctx) & option) {
|
||||||
|
+ SSL_CTX_clear_options(ctx, option);
|
||||||
|
+ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, APLOGNO(02904)
|
||||||
|
+ "Allowing SSLProtocol %s even though it is disabled "
|
||||||
|
+ "by OpenSSL by default on this system", name);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static apr_status_t ssl_init_ctx_protocol(server_rec *s,
|
||||||
|
apr_pool_t *p,
|
||||||
|
apr_pool_t *ptemp,
|
||||||
|
@@ -735,9 +757,13 @@ static apr_status_t ssl_init_ctx_protocol(server_rec *s,
|
||||||
|
}
|
||||||
|
if (prot == TLS1_1_VERSION && protocol & SSL_PROTOCOL_TLSV1) {
|
||||||
|
prot = TLS1_VERSION;
|
||||||
|
+ ssl_set_ctx_protocol_option(s, ctx, SSL_OP_NO_TLSv1,
|
||||||
|
+ protocol & SSL_PROTOCOL_TLSV1, "TLSv1");
|
||||||
|
}
|
||||||
|
#ifndef OPENSSL_NO_SSL3
|
||||||
|
if (prot == TLS1_VERSION && protocol & SSL_PROTOCOL_SSLV3) {
|
||||||
|
+ ssl_set_ctx_protocol_option(s, ctx, SSL_OP_NO_SSLv3,
|
||||||
|
+ protocol & SSL_PROTOCOL_SSLV3, "SSLv3");
|
||||||
|
prot = SSL3_VERSION;
|
||||||
|
}
|
||||||
|
#endif
|
93
SOURCES/httpd-2.4.43-gettid.patch
Normal file
93
SOURCES/httpd-2.4.43-gettid.patch
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
From d4e5b6e1e5585d341d1e51f1ddc637c099111076 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Joe Orton <jorton@redhat.com>
|
||||||
|
Date: Tue, 7 Jul 2020 09:48:01 +0100
|
||||||
|
Subject: [PATCH] Check and use gettid() directly with glibc 2.30+.
|
||||||
|
|
||||||
|
* configure.in: Check for gettid() and define HAVE_SYS_GETTID if
|
||||||
|
gettid() is only usable via syscall().
|
||||||
|
|
||||||
|
* server/log.c (log_tid): Use gettid() directly if available.
|
||||||
|
---
|
||||||
|
configure.in | 14 +++++++++-----
|
||||||
|
server/log.c | 8 ++++++--
|
||||||
|
2 files changed, 15 insertions(+), 7 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/configure.in b/configure.in
|
||||||
|
index 423d58d4b9a..60cbf7b7f81 100644
|
||||||
|
--- httpd-2.4.43/configure.in.gettid
|
||||||
|
+++ httpd-2.4.43/configure.in
|
||||||
|
@@ -478,7 +500,8 @@
|
||||||
|
timegm \
|
||||||
|
getpgid \
|
||||||
|
fopen64 \
|
||||||
|
-getloadavg
|
||||||
|
+getloadavg \
|
||||||
|
+gettid
|
||||||
|
)
|
||||||
|
|
||||||
|
dnl confirm that a void pointer is large enough to store a long integer
|
||||||
|
@@ -489,16 +512,19 @@
|
||||||
|
APR_ADDTO(HTTPD_LIBS, [-lselinux])
|
||||||
|
])
|
||||||
|
|
||||||
|
-AC_CACHE_CHECK([for gettid()], ac_cv_gettid,
|
||||||
|
+if test $ac_cv_func_gettid = no; then
|
||||||
|
+ # On Linux before glibc 2.30, gettid() is only usable via syscall()
|
||||||
|
+ AC_CACHE_CHECK([for gettid() via syscall], ap_cv_gettid,
|
||||||
|
[AC_TRY_RUN(#define _GNU_SOURCE
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
pid_t t = syscall(SYS_gettid); return t == -1 ? 1 : 0; },
|
||||||
|
-[ac_cv_gettid=yes], [ac_cv_gettid=no], [ac_cv_gettid=no])])
|
||||||
|
-if test "$ac_cv_gettid" = "yes"; then
|
||||||
|
- AC_DEFINE(HAVE_GETTID, 1, [Define if you have gettid()])
|
||||||
|
+ [ap_cv_gettid=yes], [ap_cv_gettid=no], [ap_cv_gettid=no])])
|
||||||
|
+ if test "$ap_cv_gettid" = "yes"; then
|
||||||
|
+ AC_DEFINE(HAVE_SYS_GETTID, 1, [Define if you have gettid() via syscall()])
|
||||||
|
+ fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
dnl ## Check for the tm_gmtoff field in struct tm to get the timezone diffs
|
||||||
|
--- httpd-2.4.43/server/log.c.gettid
|
||||||
|
+++ httpd-2.4.43/server/log.c
|
||||||
|
@@ -55,7 +55,7 @@
|
||||||
|
#include "ap_mpm.h"
|
||||||
|
#include "ap_listen.h"
|
||||||
|
|
||||||
|
-#if HAVE_GETTID
|
||||||
|
+#if HAVE_SYS_GETTID
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
@@ -625,14 +625,18 @@
|
||||||
|
#if APR_HAS_THREADS
|
||||||
|
int result;
|
||||||
|
#endif
|
||||||
|
-#if HAVE_GETTID
|
||||||
|
+#if defined(HAVE_GETTID) || defined(HAVE_SYS_GETTID)
|
||||||
|
if (arg && *arg == 'g') {
|
||||||
|
+#ifdef HAVE_GETTID
|
||||||
|
+ pid_t tid = gettid();
|
||||||
|
+#else
|
||||||
|
pid_t tid = syscall(SYS_gettid);
|
||||||
|
+#endif
|
||||||
|
if (tid == -1)
|
||||||
|
return 0;
|
||||||
|
return apr_snprintf(buf, buflen, "%"APR_PID_T_FMT, tid);
|
||||||
|
}
|
||||||
|
-#endif
|
||||||
|
+#endif /* HAVE_GETTID || HAVE_SYS_GETTID */
|
||||||
|
#if APR_HAS_THREADS
|
||||||
|
if (ap_mpm_query(AP_MPMQ_IS_THREADED, &result) == APR_SUCCESS
|
||||||
|
&& result != AP_MPMQ_NOT_SUPPORTED)
|
||||||
|
@@ -966,7 +970,7 @@
|
||||||
|
#if APR_HAS_THREADS
|
||||||
|
field_start = len;
|
||||||
|
len += cpystrn(buf + len, ":tid ", buflen - len);
|
||||||
|
- item_len = log_tid(info, NULL, buf + len, buflen - len);
|
||||||
|
+ item_len = log_tid(info, "g", buf + len, buflen - len);
|
||||||
|
if (!item_len)
|
||||||
|
len = field_start;
|
||||||
|
else
|
22
SOURCES/httpd-2.4.43-icons.patch
Normal file
22
SOURCES/httpd-2.4.43-icons.patch
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
diff --git a/docs/conf/extra/httpd-autoindex.conf.in b/docs/conf/extra/httpd-autoindex.conf.in
|
||||||
|
index 51b02ed..0e8b626 100644
|
||||||
|
--- a/docs/conf/extra/httpd-autoindex.conf.in
|
||||||
|
+++ b/docs/conf/extra/httpd-autoindex.conf.in
|
||||||
|
@@ -21,7 +21,7 @@ IndexOptions FancyIndexing HTMLTable VersionSort
|
||||||
|
Alias /icons/ "@exp_iconsdir@/"
|
||||||
|
|
||||||
|
<Directory "@exp_iconsdir@">
|
||||||
|
- Options Indexes MultiViews
|
||||||
|
+ Options Indexes MultiViews FollowSymlinks
|
||||||
|
AllowOverride None
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
@@ -53,7 +53,7 @@ AddIcon /icons/dvi.gif .dvi
|
||||||
|
AddIcon /icons/uuencoded.gif .uu
|
||||||
|
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
|
||||||
|
AddIcon /icons/tex.gif .tex
|
||||||
|
-AddIcon /icons/bomb.gif core
|
||||||
|
+AddIcon /icons/bomb.gif core.
|
||||||
|
|
||||||
|
AddIcon /icons/back.gif ..
|
||||||
|
AddIcon /icons/hand.right.gif README
|
87
SOURCES/httpd-2.4.43-logjournal.patch
Normal file
87
SOURCES/httpd-2.4.43-logjournal.patch
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
diff --git a/modules/loggers/config.m4 b/modules/loggers/config.m4
|
||||||
|
index 762e773..0848d2e 100644
|
||||||
|
--- a/modules/loggers/config.m4
|
||||||
|
+++ b/modules/loggers/config.m4
|
||||||
|
@@ -5,6 +5,8 @@ dnl APACHE_MODULE(name, helptext[, objects[, structname[, default[, config]]]])
|
||||||
|
APACHE_MODPATH_INIT(loggers)
|
||||||
|
|
||||||
|
APACHE_MODULE(log_config, logging configuration. You won't be able to log requests to the server without this module., , , yes)
|
||||||
|
+APR_ADDTO(MOD_LOG_CONFIG_LDADD, [$SYSTEMD_LIBS])
|
||||||
|
+
|
||||||
|
APACHE_MODULE(log_debug, configurable debug logging, , , most)
|
||||||
|
APACHE_MODULE(log_forensic, forensic logging)
|
||||||
|
|
||||||
|
diff --git a/modules/loggers/mod_log_config.c b/modules/loggers/mod_log_config.c
|
||||||
|
index 996c09c..50a056a 100644
|
||||||
|
--- a/modules/loggers/mod_log_config.c
|
||||||
|
+++ b/modules/loggers/mod_log_config.c
|
||||||
|
@@ -172,6 +172,10 @@
|
||||||
|
#include <limits.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifdef HAVE_SYSTEMD
|
||||||
|
+#include <systemd/sd-journal.h>
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#define DEFAULT_LOG_FORMAT "%h %l %u %t \"%r\" %>s %b"
|
||||||
|
|
||||||
|
module AP_MODULE_DECLARE_DATA log_config_module;
|
||||||
|
@@ -1638,6 +1642,25 @@ static apr_status_t ap_default_log_writer( request_rec *r,
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+static apr_status_t wrap_journal_stream(apr_pool_t *p, apr_file_t **outfd,
|
||||||
|
+ int priority)
|
||||||
|
+{
|
||||||
|
+#ifdef HAVE_SYSTEMD
|
||||||
|
+ int fd;
|
||||||
|
+
|
||||||
|
+ fd = sd_journal_stream_fd("httpd", priority, 0);
|
||||||
|
+ if (fd < 0) return fd;
|
||||||
|
+
|
||||||
|
+ /* This is an AF_UNIX socket fd so is more pipe-like than
|
||||||
|
+ * file-like (the fd is neither seekable or readable), and use of
|
||||||
|
+ * apr_os_pipe_put_ex() allows cleanup registration. */
|
||||||
|
+ return apr_os_pipe_put_ex(outfd, &fd, 1, p);
|
||||||
|
+#else
|
||||||
|
+ return APR_ENOTIMPL;
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void *ap_default_log_writer_init(apr_pool_t *p, server_rec *s,
|
||||||
|
const char* name)
|
||||||
|
{
|
||||||
|
@@ -1650,6 +1673,32 @@ static void *ap_default_log_writer_init(apr_pool_t *p, server_rec *s,
|
||||||
|
}
|
||||||
|
return ap_piped_log_write_fd(pl);
|
||||||
|
}
|
||||||
|
+ else if (strncasecmp(name, "journald:", 9) == 0) {
|
||||||
|
+ int priority;
|
||||||
|
+ const char *err = ap_parse_log_level(name + 9, &priority);
|
||||||
|
+ apr_status_t rv;
|
||||||
|
+ apr_file_t *fd;
|
||||||
|
+
|
||||||
|
+ if (err == NULL && priority > LOG_DEBUG) {
|
||||||
|
+ err = "TRACE level debugging not supported with journald";
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (err) {
|
||||||
|
+ ap_log_error(APLOG_MARK, APLOG_ERR, APR_EBADPATH, s,
|
||||||
|
+ "invalid journald log priority name %s: %s",
|
||||||
|
+ name, err);
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ rv = wrap_journal_stream(p, &fd, priority);
|
||||||
|
+ if (rv) {
|
||||||
|
+ ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
|
||||||
|
+ "could not open journald log stream");
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return fd;
|
||||||
|
+ }
|
||||||
|
else {
|
||||||
|
const char *fname = ap_server_root_relative(p, name);
|
||||||
|
apr_file_t *fd;
|
96
SOURCES/httpd-2.4.43-mod_systemd.patch
Normal file
96
SOURCES/httpd-2.4.43-mod_systemd.patch
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
|
||||||
|
More verbose startup logging for mod_systemd.
|
||||||
|
|
||||||
|
--- httpd-2.4.43/modules/arch/unix/mod_systemd.c.mod_systemd
|
||||||
|
+++ httpd-2.4.43/modules/arch/unix/mod_systemd.c
|
||||||
|
@@ -29,11 +29,14 @@
|
||||||
|
#include "mpm_common.h"
|
||||||
|
|
||||||
|
#include "systemd/sd-daemon.h"
|
||||||
|
+#include "systemd/sd-journal.h"
|
||||||
|
|
||||||
|
#if APR_HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+static char describe_listeners[30];
|
||||||
|
+
|
||||||
|
static int systemd_pre_config(apr_pool_t *pconf, apr_pool_t *plog,
|
||||||
|
apr_pool_t *ptemp)
|
||||||
|
{
|
||||||
|
@@ -44,6 +47,20 @@
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static char *dump_listener(ap_listen_rec *lr, apr_pool_t *p)
|
||||||
|
+{
|
||||||
|
+ apr_sockaddr_t *sa = lr->bind_addr;
|
||||||
|
+ char addr[128];
|
||||||
|
+
|
||||||
|
+ if (apr_sockaddr_is_wildcard(sa)) {
|
||||||
|
+ return apr_pstrcat(p, "port ", apr_itoa(p, sa->port), NULL);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ apr_sockaddr_ip_getbuf(addr, sizeof addr, sa);
|
||||||
|
+
|
||||||
|
+ return apr_psprintf(p, "%s port %u", addr, sa->port);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* Report the service is ready in post_config, which could be during
|
||||||
|
* startup or after a reload. The server could still hit a fatal
|
||||||
|
* startup error after this point during ap_run_mpm(), so this is
|
||||||
|
@@ -51,19 +68,51 @@
|
||||||
|
* the TCP ports so new connections will not be rejected. There will
|
||||||
|
* always be a possible async failure event simultaneous to the
|
||||||
|
* service reporting "ready", so this should be good enough. */
|
||||||
|
-static int systemd_post_config(apr_pool_t *p, apr_pool_t *plog,
|
||||||
|
+static int systemd_post_config(apr_pool_t *pconf, apr_pool_t *plog,
|
||||||
|
apr_pool_t *ptemp, server_rec *main_server)
|
||||||
|
{
|
||||||
|
+ ap_listen_rec *lr;
|
||||||
|
+ apr_size_t plen = sizeof describe_listeners;
|
||||||
|
+ char *p = describe_listeners;
|
||||||
|
+
|
||||||
|
+ if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG)
|
||||||
|
+ return OK;
|
||||||
|
+
|
||||||
|
+ for (lr = ap_listeners; lr; lr = lr->next) {
|
||||||
|
+ char *s = dump_listener(lr, ptemp);
|
||||||
|
+
|
||||||
|
+ if (strlen(s) + 3 < plen) {
|
||||||
|
+ char *newp = apr_cpystrn(p, s, plen);
|
||||||
|
+ if (lr->next)
|
||||||
|
+ newp = apr_cpystrn(newp, ", ", 3);
|
||||||
|
+ plen -= newp - p;
|
||||||
|
+ p = newp;
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ if (plen < 4) {
|
||||||
|
+ p = describe_listeners + sizeof describe_listeners - 4;
|
||||||
|
+ plen = 4;
|
||||||
|
+ }
|
||||||
|
+ apr_cpystrn(p, "...", plen);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
sd_notify(0, "READY=1\n"
|
||||||
|
"STATUS=Configuration loaded.\n");
|
||||||
|
+
|
||||||
|
+ sd_journal_print(LOG_INFO, "Server configured, listening on: %s",
|
||||||
|
+ describe_listeners);
|
||||||
|
+
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int systemd_pre_mpm(apr_pool_t *p, ap_scoreboard_e sb_type)
|
||||||
|
{
|
||||||
|
sd_notifyf(0, "READY=1\n"
|
||||||
|
- "STATUS=Processing requests...\n"
|
||||||
|
- "MAINPID=%" APR_PID_T_FMT, getpid());
|
||||||
|
+ "STATUS=Started, listening on: %s\n"
|
||||||
|
+ "MAINPID=%" APR_PID_T_FMT,
|
||||||
|
+ describe_listeners, getpid());
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
143
SOURCES/httpd-2.4.43-pr37355.patch
Normal file
143
SOURCES/httpd-2.4.43-pr37355.patch
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c
|
||||||
|
index e599515..154ab21 100644
|
||||||
|
--- a/modules/proxy/mod_proxy.c
|
||||||
|
+++ b/modules/proxy/mod_proxy.c
|
||||||
|
@@ -1200,11 +1200,20 @@ static int proxy_handler(request_rec *r)
|
||||||
|
/* handle the scheme */
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01142)
|
||||||
|
"Trying to run scheme_handler against proxy");
|
||||||
|
+
|
||||||
|
+ if (ents[i].creds) {
|
||||||
|
+ apr_table_set(r->notes, "proxy-basic-creds", ents[i].creds);
|
||||||
|
+ ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, r,
|
||||||
|
+ "Using proxy auth creds %s", ents[i].creds);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
access_status = proxy_run_scheme_handler(r, worker,
|
||||||
|
conf, url,
|
||||||
|
ents[i].hostname,
|
||||||
|
ents[i].port);
|
||||||
|
|
||||||
|
+ if (ents[i].creds) apr_table_unset(r->notes, "proxy-basic-creds");
|
||||||
|
+
|
||||||
|
/* Did the scheme handler process the request? */
|
||||||
|
if (access_status != DECLINED) {
|
||||||
|
const char *cl_a;
|
||||||
|
@@ -1620,8 +1629,8 @@ static void *merge_proxy_dir_config(apr_pool_t *p, void *basev, void *addv)
|
||||||
|
return new;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static const char *
|
||||||
|
- add_proxy(cmd_parms *cmd, void *dummy, const char *f1, const char *r1, int regex)
|
||||||
|
+static const char *add_proxy(cmd_parms *cmd, void *dummy, const char *f1,
|
||||||
|
+ const char *r1, const char *creds, int regex)
|
||||||
|
{
|
||||||
|
server_rec *s = cmd->server;
|
||||||
|
proxy_server_conf *conf =
|
||||||
|
@@ -1679,19 +1688,24 @@ static const char *
|
||||||
|
new->port = port;
|
||||||
|
new->regexp = reg;
|
||||||
|
new->use_regex = regex;
|
||||||
|
+ if (creds) {
|
||||||
|
+ new->creds = apr_pstrcat(cmd->pool, "Basic ",
|
||||||
|
+ ap_pbase64encode(cmd->pool, (char *)creds),
|
||||||
|
+ NULL);
|
||||||
|
+ }
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static const char *
|
||||||
|
- add_proxy_noregex(cmd_parms *cmd, void *dummy, const char *f1, const char *r1)
|
||||||
|
+static const char *add_proxy_noregex(cmd_parms *cmd, void *dummy, const char *f1,
|
||||||
|
+ const char *r1, const char *creds)
|
||||||
|
{
|
||||||
|
- return add_proxy(cmd, dummy, f1, r1, 0);
|
||||||
|
+ return add_proxy(cmd, dummy, f1, r1, creds, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static const char *
|
||||||
|
- add_proxy_regex(cmd_parms *cmd, void *dummy, const char *f1, const char *r1)
|
||||||
|
+static const char *add_proxy_regex(cmd_parms *cmd, void *dummy, const char *f1,
|
||||||
|
+ const char *r1, const char *creds)
|
||||||
|
{
|
||||||
|
- return add_proxy(cmd, dummy, f1, r1, 1);
|
||||||
|
+ return add_proxy(cmd, dummy, f1, r1, creds, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
PROXY_DECLARE(const char *) ap_proxy_de_socketfy(apr_pool_t *p, const char *url)
|
||||||
|
@@ -2637,9 +2651,9 @@ static const command_rec proxy_cmds[] =
|
||||||
|
"location, in regular expression syntax"),
|
||||||
|
AP_INIT_FLAG("ProxyRequests", set_proxy_req, NULL, RSRC_CONF,
|
||||||
|
"on if the true proxy requests should be accepted"),
|
||||||
|
- AP_INIT_TAKE2("ProxyRemote", add_proxy_noregex, NULL, RSRC_CONF,
|
||||||
|
+ AP_INIT_TAKE23("ProxyRemote", add_proxy_noregex, NULL, RSRC_CONF,
|
||||||
|
"a scheme, partial URL or '*' and a proxy server"),
|
||||||
|
- AP_INIT_TAKE2("ProxyRemoteMatch", add_proxy_regex, NULL, RSRC_CONF,
|
||||||
|
+ AP_INIT_TAKE23("ProxyRemoteMatch", add_proxy_regex, NULL, RSRC_CONF,
|
||||||
|
"a regex pattern and a proxy server"),
|
||||||
|
AP_INIT_FLAG("ProxyPassInterpolateEnv", ap_set_flag_slot_char,
|
||||||
|
(void*)APR_OFFSETOF(proxy_dir_conf, interpolate_env),
|
||||||
|
diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h
|
||||||
|
index 895b937..538839f 100644
|
||||||
|
--- a/modules/proxy/mod_proxy.h
|
||||||
|
+++ b/modules/proxy/mod_proxy.h
|
||||||
|
@@ -116,6 +116,7 @@ struct proxy_remote {
|
||||||
|
const char *protocol; /* the scheme used to talk to this proxy */
|
||||||
|
const char *hostname; /* the hostname of this proxy */
|
||||||
|
ap_regex_t *regexp; /* compiled regex (if any) for the remote */
|
||||||
|
+ const char *creds; /* auth credentials (if any) for the proxy */
|
||||||
|
int use_regex; /* simple boolean. True if we have a regex pattern */
|
||||||
|
apr_port_t port; /* the port for this proxy */
|
||||||
|
};
|
||||||
|
diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c
|
||||||
|
index e7ffe33..50561a4 100644
|
||||||
|
--- a/modules/proxy/proxy_util.c
|
||||||
|
+++ b/modules/proxy/proxy_util.c
|
||||||
|
@@ -2474,11 +2474,14 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r,
|
||||||
|
* So let's make it configurable by env.
|
||||||
|
* The logic here is the same used in mod_proxy_http.
|
||||||
|
*/
|
||||||
|
- proxy_auth = apr_table_get(r->headers_in, "Proxy-Authorization");
|
||||||
|
+ proxy_auth = apr_table_get(r->notes, "proxy-basic-creds");
|
||||||
|
+ if (proxy_auth == NULL)
|
||||||
|
+ proxy_auth = apr_table_get(r->headers_in, "Proxy-Authorization");
|
||||||
|
+
|
||||||
|
if (proxy_auth != NULL &&
|
||||||
|
proxy_auth[0] != '\0' &&
|
||||||
|
- r->user == NULL && /* we haven't yet authenticated */
|
||||||
|
- apr_table_get(r->subprocess_env, "Proxy-Chain-Auth")) {
|
||||||
|
+ (r->user == NULL /* we haven't yet authenticated */
|
||||||
|
+ || apr_table_get(r->subprocess_env, "Proxy-Chain-Auth"))) {
|
||||||
|
forward->proxy_auth = apr_pstrdup(conn->pool, proxy_auth);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -2714,7 +2717,8 @@ static apr_status_t send_http_connect(proxy_conn_rec *backend,
|
||||||
|
nbytes = apr_snprintf(buffer, sizeof(buffer),
|
||||||
|
"CONNECT %s:%d HTTP/1.0" CRLF,
|
||||||
|
forward->target_host, forward->target_port);
|
||||||
|
- /* Add proxy authorization from the initial request if necessary */
|
||||||
|
+ /* Add proxy authorization from the configuration, or initial
|
||||||
|
+ * request if necessary */
|
||||||
|
if (forward->proxy_auth != NULL) {
|
||||||
|
nbytes += apr_snprintf(buffer + nbytes, sizeof(buffer) - nbytes,
|
||||||
|
"Proxy-Authorization: %s" CRLF,
|
||||||
|
@@ -3627,6 +3631,7 @@ PROXY_DECLARE(int) ap_proxy_create_hdrbrgd(apr_pool_t *p,
|
||||||
|
apr_bucket *e;
|
||||||
|
int do_100_continue;
|
||||||
|
conn_rec *origin = p_conn->connection;
|
||||||
|
+ const char *creds;
|
||||||
|
proxy_dir_conf *dconf = ap_get_module_config(r->per_dir_config, &proxy_module);
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -3803,6 +3808,11 @@ PROXY_DECLARE(int) ap_proxy_create_hdrbrgd(apr_pool_t *p,
|
||||||
|
return HTTP_BAD_REQUEST;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ creds = apr_table_get(r->notes, "proxy-basic-creds");
|
||||||
|
+ if (creds) {
|
||||||
|
+ apr_table_mergen(r->headers_in, "Proxy-Authorization", creds);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
/* send request headers */
|
||||||
|
headers_in_array = apr_table_elts(r->headers_in);
|
||||||
|
headers_in = (const apr_table_entry_t *) headers_in_array->elts;
|
20
SOURCES/httpd-2.4.43-r1861269.patch
Normal file
20
SOURCES/httpd-2.4.43-r1861269.patch
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
diff --git a/modules/ssl/ssl_engine_config.c b/modules/ssl/ssl_engine_config.c
|
||||||
|
index b53f3f8..979489c 100644
|
||||||
|
--- a/modules/ssl/ssl_engine_config.c
|
||||||
|
+++ b/modules/ssl/ssl_engine_config.c
|
||||||
|
@@ -812,8 +812,14 @@ const char *ssl_cmd_SSLCipherSuite(cmd_parms *cmd,
|
||||||
|
static const char *ssl_cmd_check_file(cmd_parms *parms,
|
||||||
|
const char **file)
|
||||||
|
{
|
||||||
|
- const char *filepath = ap_server_root_relative(parms->pool, *file);
|
||||||
|
+ const char *filepath;
|
||||||
|
|
||||||
|
+ /* If only dumping the config, don't verify the paths */
|
||||||
|
+ if (ap_state_query(AP_SQ_RUN_MODE) == AP_SQ_RM_CONFIG_DUMP) {
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ filepath = ap_server_root_relative(parms->pool, *file);
|
||||||
|
if (!filepath) {
|
||||||
|
return apr_pstrcat(parms->pool, parms->cmd->name,
|
||||||
|
": Invalid file path ", *file, NULL);
|
271
SOURCES/httpd-2.4.43-r1861793+.patch
Normal file
271
SOURCES/httpd-2.4.43-r1861793+.patch
Normal file
@ -0,0 +1,271 @@
|
|||||||
|
diff --git a/configure.in b/configure.in
|
||||||
|
index cb43246..0bb6b0d 100644
|
||||||
|
--- httpd-2.4.43/configure.in.r1861793+
|
||||||
|
+++ httpd-2.4.43/configure.in
|
||||||
|
@@ -465,6 +465,28 @@
|
||||||
|
AC_SEARCH_LIBS(crypt, crypt)
|
||||||
|
CRYPT_LIBS="$LIBS"
|
||||||
|
APACHE_SUBST(CRYPT_LIBS)
|
||||||
|
+
|
||||||
|
+if test "$ac_cv_search_crypt" != "no"; then
|
||||||
|
+ # Test crypt() with the SHA-512 test vector from https://akkadia.org/drepper/SHA-crypt.txt
|
||||||
|
+ AC_CACHE_CHECK([whether crypt() supports SHA-2], [ap_cv_crypt_sha2], [
|
||||||
|
+ AC_RUN_IFELSE([AC_LANG_PROGRAM([[
|
||||||
|
+#include <crypt.h>
|
||||||
|
+#include <stdlib.h>
|
||||||
|
+#include <string.h>
|
||||||
|
+
|
||||||
|
+#define PASSWD_0 "Hello world!"
|
||||||
|
+#define SALT_0 "\$6\$saltstring"
|
||||||
|
+#define EXPECT_0 "\$6\$saltstring\$svn8UoSVapNtMuq1ukKS4tPQd8iKwSMHWjl/O817G3uBnIFNjnQJu" \
|
||||||
|
+ "esI68u4OTLiBFdcbYEdFCoEOfaS35inz1"
|
||||||
|
+]], [char *result = crypt(PASSWD_0, SALT_0);
|
||||||
|
+ if (!result) return 1;
|
||||||
|
+ if (strcmp(result, EXPECT_0)) return 2;
|
||||||
|
+])], [ap_cv_crypt_sha2=yes], [ap_cv_crypt_sha2=no])])
|
||||||
|
+ if test "$ap_cv_crypt_sha2" = yes; then
|
||||||
|
+ AC_DEFINE([HAVE_CRYPT_SHA2], 1, [Define if crypt() supports SHA-2 hashes])
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
LIBS="$saved_LIBS"
|
||||||
|
|
||||||
|
dnl See Comment #Spoon
|
||||||
|
--- httpd-2.4.43/docs/man/htpasswd.1.r1861793+
|
||||||
|
+++ httpd-2.4.43/docs/man/htpasswd.1
|
||||||
|
@@ -27,16 +27,16 @@
|
||||||
|
.SH "SYNOPSIS"
|
||||||
|
|
||||||
|
.PP
|
||||||
|
-\fB\fBhtpasswd\fR [ -\fBc\fR ] [ -\fBi\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIcost\fR ] [ -\fBD\fR ] [ -\fBv\fR ] \fIpasswdfile\fR \fIusername\fR\fR
|
||||||
|
+\fB\fBhtpasswd\fR [ -\fBc\fR ] [ -\fBi\fR ] [ -\fBm\fR | -\fBB\fR | -\fB2\fR | -\fB5\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBr\fR \fIrounds\fR ] [ -\fBC\fR \fIcost\fR ] [ -\fBD\fR ] [ -\fBv\fR ] \fIpasswdfile\fR \fIusername\fR\fR
|
||||||
|
|
||||||
|
.PP
|
||||||
|
-\fB\fBhtpasswd\fR -\fBb\fR [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIcost\fR ] [ -\fBD\fR ] [ -\fBv\fR ] \fIpasswdfile\fR \fIusername\fR \fIpassword\fR\fR
|
||||||
|
+\fB\fBhtpasswd\fR -\fBb\fR [ -\fBc\fR ] [ -\fBm\fR | -\fBB\fR | -\fB2\fR | -\fB5\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBr\fR \fIrounds\fR ] [ -\fBC\fR \fIcost\fR ] [ -\fBD\fR ] [ -\fBv\fR ] \fIpasswdfile\fR \fIusername\fR \fIpassword\fR\fR
|
||||||
|
|
||||||
|
.PP
|
||||||
|
-\fB\fBhtpasswd\fR -\fBn\fR [ -\fBi\fR ] [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIcost\fR ] \fIusername\fR\fR
|
||||||
|
+\fB\fBhtpasswd\fR -\fBn\fR [ -\fBi\fR ] [ -\fBm\fR | -\fBB\fR | -\fB2\fR | -\fB5\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBr\fR \fIrounds\fR ] [ -\fBC\fR \fIcost\fR ] \fIusername\fR\fR
|
||||||
|
|
||||||
|
.PP
|
||||||
|
-\fB\fBhtpasswd\fR -\fBnb\fR [ -\fBm\fR | -\fBB\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBC\fR \fIcost\fR ] \fIusername\fR \fIpassword\fR\fR
|
||||||
|
+\fB\fBhtpasswd\fR -\fBnb\fR [ -\fBm\fR | -\fBB\fR | -\fB2\fR | -\fB5\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] [ -\fBr\fR \fIrounds\fR ] [ -\fBC\fR \fIcost\fR ] \fIusername\fR \fIpassword\fR\fR
|
||||||
|
|
||||||
|
|
||||||
|
.SH "SUMMARY"
|
||||||
|
@@ -48,7 +48,7 @@
|
||||||
|
Resources available from the Apache HTTP server can be restricted to just the users listed in the files created by \fBhtpasswd\fR\&. This program can only manage usernames and passwords stored in a flat-file\&. It can encrypt and display password information for use in other types of data stores, though\&. To use a DBM database see dbmmanage or htdbm\&.
|
||||||
|
|
||||||
|
.PP
|
||||||
|
-\fBhtpasswd\fR encrypts passwords using either bcrypt, a version of MD5 modified for Apache, SHA1, or the system's \fBcrypt()\fR routine\&. Files managed by \fBhtpasswd\fR may contain a mixture of different encoding types of passwords; some user records may have bcrypt or MD5-encrypted passwords while others in the same file may have passwords encrypted with \fBcrypt()\fR\&.
|
||||||
|
+\fBhtpasswd\fR encrypts passwords using either bcrypt, a version of MD5 modified for Apache, SHA-1, or the system's \fBcrypt()\fR routine\&. SHA-2-based hashes (SHA-256 and SHA-512) are supported for \fBcrypt()\fR\&. Files managed by \fBhtpasswd\fR may contain a mixture of different encoding types of passwords; some user records may have bcrypt or MD5-encrypted passwords while others in the same file may have passwords encrypted with \fBcrypt()\fR\&.
|
||||||
|
|
||||||
|
.PP
|
||||||
|
This manual page only lists the command line arguments\&. For details of the directives necessary to configure user authentication in httpd see the Apache manual, which is part of the Apache distribution or can be found at http://httpd\&.apache\&.org/\&.
|
||||||
|
@@ -73,17 +73,26 @@
|
||||||
|
\fB-m\fR
|
||||||
|
Use MD5 encryption for passwords\&. This is the default (since version 2\&.2\&.18)\&.
|
||||||
|
.TP
|
||||||
|
+\fB-2\fR
|
||||||
|
+Use SHA-256 \fBcrypt()\fR based hashes for passwords\&. This is supported on most Unix platforms\&.
|
||||||
|
+.TP
|
||||||
|
+\fB-5\fR
|
||||||
|
+Use SHA-512 \fBcrypt()\fR based hashes for passwords\&. This is supported on most Unix platforms\&.
|
||||||
|
+.TP
|
||||||
|
\fB-B\fR
|
||||||
|
Use bcrypt encryption for passwords\&. This is currently considered to be very secure\&.
|
||||||
|
.TP
|
||||||
|
\fB-C\fR
|
||||||
|
This flag is only allowed in combination with \fB-B\fR (bcrypt encryption)\&. It sets the computing time used for the bcrypt algorithm (higher is more secure but slower, default: 5, valid: 4 to 17)\&.
|
||||||
|
.TP
|
||||||
|
+\fB-r\fR
|
||||||
|
+This flag is only allowed in combination with \fB-2\fR or \fB-5\fR\&. It sets the number of hash rounds used for the SHA-2 algorithms (higher is more secure but slower; the default is 5,000)\&.
|
||||||
|
+.TP
|
||||||
|
\fB-d\fR
|
||||||
|
Use \fBcrypt()\fR encryption for passwords\&. This is not supported by the httpd server on Windows and Netware\&. This algorithm limits the password length to 8 characters\&. This algorithm is \fBinsecure\fR by today's standards\&. It used to be the default algorithm until version 2\&.2\&.17\&.
|
||||||
|
.TP
|
||||||
|
\fB-s\fR
|
||||||
|
-Use SHA encryption for passwords\&. Facilitates migration from/to Netscape servers using the LDAP Directory Interchange Format (ldif)\&. This algorithm is \fBinsecure\fR by today's standards\&.
|
||||||
|
+Use SHA-1 (160-bit) encryption for passwords\&. Facilitates migration from/to Netscape servers using the LDAP Directory Interchange Format (ldif)\&. This algorithm is \fBinsecure\fR by today's standards\&.
|
||||||
|
.TP
|
||||||
|
\fB-p\fR
|
||||||
|
Use plaintext passwords\&. Though \fBhtpasswd\fR will support creation on all platforms, the httpd daemon will only accept plain text passwords on Windows and Netware\&.
|
||||||
|
@@ -152,10 +161,13 @@
|
||||||
|
When using the \fBcrypt()\fR algorithm, note that only the first 8 characters of the password are used to form the password\&. If the supplied password is longer, the extra characters will be silently discarded\&.
|
||||||
|
|
||||||
|
.PP
|
||||||
|
-The SHA encryption format does not use salting: for a given password, there is only one encrypted representation\&. The \fBcrypt()\fR and MD5 formats permute the representation by prepending a random salt string, to make dictionary attacks against the passwords more difficult\&.
|
||||||
|
+The SHA-1 encryption format does not use salting: for a given password, there is only one encrypted representation\&. The \fBcrypt()\fR and MD5 formats permute the representation by prepending a random salt string, to make dictionary attacks against the passwords more difficult\&.
|
||||||
|
+
|
||||||
|
+.PP
|
||||||
|
+The SHA-1 and \fBcrypt()\fR formats are insecure by today's standards\&.
|
||||||
|
|
||||||
|
.PP
|
||||||
|
-The SHA and \fBcrypt()\fR formats are insecure by today's standards\&.
|
||||||
|
+The SHA-2-based \fBcrypt()\fR formats (SHA-256 and SHA-512) are supported on most modern Unix systems, and follow the specification at https://www\&.akkadia\&.org/drepper/SHA-crypt\&.txt\&.
|
||||||
|
|
||||||
|
.SH "RESTRICTIONS"
|
||||||
|
|
||||||
|
--- httpd-2.4.43/support/htpasswd.c.r1861793+
|
||||||
|
+++ httpd-2.4.43/support/htpasswd.c
|
||||||
|
@@ -109,17 +109,21 @@
|
||||||
|
"for it." NL
|
||||||
|
" -i Read password from stdin without verification (for script usage)." NL
|
||||||
|
" -m Force MD5 encryption of the password (default)." NL
|
||||||
|
- " -B Force bcrypt encryption of the password (very secure)." NL
|
||||||
|
+ " -2 Force SHA-256 crypt() hash of the password (very secure)." NL
|
||||||
|
+ " -5 Force SHA-512 crypt() hash of the password (very secure)." NL
|
||||||
|
+ " -B Force bcrypt encryption of the password (very secure)." NL
|
||||||
|
" -C Set the computing time used for the bcrypt algorithm" NL
|
||||||
|
" (higher is more secure but slower, default: %d, valid: 4 to 17)." NL
|
||||||
|
+ " -r Set the number of rounds used for the SHA-256, SHA-512 algorithms" NL
|
||||||
|
+ " (higher is more secure but slower, default: 5000)." NL
|
||||||
|
" -d Force CRYPT encryption of the password (8 chars max, insecure)." NL
|
||||||
|
- " -s Force SHA encryption of the password (insecure)." NL
|
||||||
|
+ " -s Force SHA-1 encryption of the password (insecure)." NL
|
||||||
|
" -p Do not encrypt the password (plaintext, insecure)." NL
|
||||||
|
" -D Delete the specified user." NL
|
||||||
|
" -v Verify password for the specified user." NL
|
||||||
|
"On other systems than Windows and NetWare the '-p' flag will "
|
||||||
|
"probably not work." NL
|
||||||
|
- "The SHA algorithm does not use a salt and is less secure than the "
|
||||||
|
+ "The SHA-1 algorithm does not use a salt and is less secure than the "
|
||||||
|
"MD5 algorithm." NL,
|
||||||
|
BCRYPT_DEFAULT_COST
|
||||||
|
);
|
||||||
|
@@ -178,7 +182,7 @@
|
||||||
|
if (rv != APR_SUCCESS)
|
||||||
|
exit(ERR_SYNTAX);
|
||||||
|
|
||||||
|
- while ((rv = apr_getopt(state, "cnmspdBbDiC:v", &opt, &opt_arg)) == APR_SUCCESS) {
|
||||||
|
+ while ((rv = apr_getopt(state, "cnmspdBbDi25C:r:v", &opt, &opt_arg)) == APR_SUCCESS) {
|
||||||
|
switch (opt) {
|
||||||
|
case 'c':
|
||||||
|
*mask |= APHTP_NEWFILE;
|
||||||
|
--- httpd-2.4.43/support/passwd_common.c.r1861793+
|
||||||
|
+++ httpd-2.4.43/support/passwd_common.c
|
||||||
|
@@ -179,16 +179,21 @@
|
||||||
|
int mkhash(struct passwd_ctx *ctx)
|
||||||
|
{
|
||||||
|
char *pw;
|
||||||
|
- char salt[16];
|
||||||
|
+ char salt[17];
|
||||||
|
apr_status_t rv;
|
||||||
|
int ret = 0;
|
||||||
|
#if CRYPT_ALGO_SUPPORTED
|
||||||
|
char *cbuf;
|
||||||
|
#endif
|
||||||
|
+#ifdef HAVE_CRYPT_SHA2
|
||||||
|
+ const char *setting;
|
||||||
|
+ char method;
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
- if (ctx->cost != 0 && ctx->alg != ALG_BCRYPT) {
|
||||||
|
+ if (ctx->cost != 0 && ctx->alg != ALG_BCRYPT
|
||||||
|
+ && ctx->alg != ALG_CRYPT_SHA256 && ctx->alg != ALG_CRYPT_SHA512 ) {
|
||||||
|
apr_file_printf(errfile,
|
||||||
|
- "Warning: Ignoring -C argument for this algorithm." NL);
|
||||||
|
+ "Warning: Ignoring -C/-r argument for this algorithm." NL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ctx->passwd == NULL) {
|
||||||
|
@@ -246,6 +251,34 @@
|
||||||
|
break;
|
||||||
|
#endif /* CRYPT_ALGO_SUPPORTED */
|
||||||
|
|
||||||
|
+#ifdef HAVE_CRYPT_SHA2
|
||||||
|
+ case ALG_CRYPT_SHA256:
|
||||||
|
+ case ALG_CRYPT_SHA512:
|
||||||
|
+ ret = generate_salt(salt, 16, &ctx->errstr, ctx->pool);
|
||||||
|
+ if (ret != 0)
|
||||||
|
+ break;
|
||||||
|
+
|
||||||
|
+ method = ctx->alg == ALG_CRYPT_SHA256 ? '5': '6';
|
||||||
|
+
|
||||||
|
+ if (ctx->cost)
|
||||||
|
+ setting = apr_psprintf(ctx->pool, "$%c$rounds=%d$%s",
|
||||||
|
+ method, ctx->cost, salt);
|
||||||
|
+ else
|
||||||
|
+ setting = apr_psprintf(ctx->pool, "$%c$%s",
|
||||||
|
+ method, salt);
|
||||||
|
+
|
||||||
|
+ cbuf = crypt(pw, setting);
|
||||||
|
+ if (cbuf == NULL) {
|
||||||
|
+ rv = APR_FROM_OS_ERROR(errno);
|
||||||
|
+ ctx->errstr = apr_psprintf(ctx->pool, "crypt() failed: %pm", &rv);
|
||||||
|
+ ret = ERR_PWMISMATCH;
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ apr_cpystrn(ctx->out, cbuf, ctx->out_len - 1);
|
||||||
|
+ break;
|
||||||
|
+#endif /* HAVE_CRYPT_SHA2 */
|
||||||
|
+
|
||||||
|
#if BCRYPT_ALGO_SUPPORTED
|
||||||
|
case ALG_BCRYPT:
|
||||||
|
rv = apr_generate_random_bytes((unsigned char*)salt, 16);
|
||||||
|
@@ -294,6 +327,19 @@
|
||||||
|
case 's':
|
||||||
|
ctx->alg = ALG_APSHA;
|
||||||
|
break;
|
||||||
|
+#ifdef HAVE_CRYPT_SHA2
|
||||||
|
+ case '2':
|
||||||
|
+ ctx->alg = ALG_CRYPT_SHA256;
|
||||||
|
+ break;
|
||||||
|
+ case '5':
|
||||||
|
+ ctx->alg = ALG_CRYPT_SHA512;
|
||||||
|
+ break;
|
||||||
|
+#else
|
||||||
|
+ case '2':
|
||||||
|
+ case '5':
|
||||||
|
+ ctx->errstr = "SHA-2 crypt() algorithms are not supported on this platform.";
|
||||||
|
+ return ERR_ALG_NOT_SUPP;
|
||||||
|
+#endif
|
||||||
|
case 'p':
|
||||||
|
ctx->alg = ALG_PLAIN;
|
||||||
|
#if !PLAIN_ALGO_SUPPORTED
|
||||||
|
@@ -324,11 +370,12 @@
|
||||||
|
return ERR_ALG_NOT_SUPP;
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
- case 'C': {
|
||||||
|
+ case 'C':
|
||||||
|
+ case 'r': {
|
||||||
|
char *endptr;
|
||||||
|
long num = strtol(opt_arg, &endptr, 10);
|
||||||
|
if (*endptr != '\0' || num <= 0) {
|
||||||
|
- ctx->errstr = "argument to -C must be a positive integer";
|
||||||
|
+ ctx->errstr = "argument to -C/-r must be a positive integer";
|
||||||
|
return ERR_SYNTAX;
|
||||||
|
}
|
||||||
|
ctx->cost = num;
|
||||||
|
--- httpd-2.4.43/support/passwd_common.h.r1861793+
|
||||||
|
+++ httpd-2.4.43/support/passwd_common.h
|
||||||
|
@@ -28,6 +28,8 @@
|
||||||
|
#include "apu_version.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#include "ap_config_auto.h"
|
||||||
|
+
|
||||||
|
#define MAX_STRING_LEN 256
|
||||||
|
|
||||||
|
#define ALG_PLAIN 0
|
||||||
|
@@ -35,6 +37,8 @@
|
||||||
|
#define ALG_APMD5 2
|
||||||
|
#define ALG_APSHA 3
|
||||||
|
#define ALG_BCRYPT 4
|
||||||
|
+#define ALG_CRYPT_SHA256 5
|
||||||
|
+#define ALG_CRYPT_SHA512 6
|
||||||
|
|
||||||
|
#define BCRYPT_DEFAULT_COST 5
|
||||||
|
|
||||||
|
@@ -84,7 +88,7 @@
|
||||||
|
apr_size_t out_len;
|
||||||
|
char *passwd;
|
||||||
|
int alg;
|
||||||
|
- int cost;
|
||||||
|
+ int cost; /* cost for bcrypt, rounds for SHA-2 */
|
||||||
|
enum {
|
||||||
|
PW_PROMPT = 0,
|
||||||
|
PW_ARG,
|
60
SOURCES/httpd-2.4.43-selinux.patch
Normal file
60
SOURCES/httpd-2.4.43-selinux.patch
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
diff --git a/configure.in b/configure.in
|
||||||
|
index c8f9aa2..cb43246 100644
|
||||||
|
--- a/configure.in
|
||||||
|
+++ b/configure.in
|
||||||
|
@@ -484,6 +484,11 @@ getloadavg
|
||||||
|
dnl confirm that a void pointer is large enough to store a long integer
|
||||||
|
APACHE_CHECK_VOID_PTR_LEN
|
||||||
|
|
||||||
|
+AC_CHECK_LIB(selinux, is_selinux_enabled, [
|
||||||
|
+ AC_DEFINE(HAVE_SELINUX, 1, [Defined if SELinux is supported])
|
||||||
|
+ APR_ADDTO(HTTPD_LIBS, [-lselinux])
|
||||||
|
+])
|
||||||
|
+
|
||||||
|
AC_CACHE_CHECK([for gettid()], ac_cv_gettid,
|
||||||
|
[AC_TRY_RUN(#define _GNU_SOURCE
|
||||||
|
#include <unistd.h>
|
||||||
|
diff --git a/server/core.c b/server/core.c
|
||||||
|
index dc0f17a..7ed9527 100644
|
||||||
|
--- a/server/core.c
|
||||||
|
+++ b/server/core.c
|
||||||
|
@@ -59,6 +59,10 @@
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifdef HAVE_SELINUX
|
||||||
|
+#include <selinux/selinux.h>
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/* LimitRequestBody handling */
|
||||||
|
#define AP_LIMIT_REQ_BODY_UNSET ((apr_off_t) -1)
|
||||||
|
#define AP_DEFAULT_LIMIT_REQ_BODY ((apr_off_t) 0)
|
||||||
|
@@ -5015,6 +5019,28 @@ static int core_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *pte
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifdef HAVE_SELINUX
|
||||||
|
+ {
|
||||||
|
+ static int already_warned = 0;
|
||||||
|
+ int is_enabled = is_selinux_enabled() > 0;
|
||||||
|
+
|
||||||
|
+ if (is_enabled && !already_warned) {
|
||||||
|
+ security_context_t con;
|
||||||
|
+
|
||||||
|
+ if (getcon(&con) == 0) {
|
||||||
|
+
|
||||||
|
+ ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, NULL,
|
||||||
|
+ "SELinux policy enabled; "
|
||||||
|
+ "httpd running as context %s", con);
|
||||||
|
+
|
||||||
|
+ already_warned = 1;
|
||||||
|
+
|
||||||
|
+ freecon(con);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
300
SOURCES/httpd-2.4.43-socket-activation.patch
Normal file
300
SOURCES/httpd-2.4.43-socket-activation.patch
Normal file
@ -0,0 +1,300 @@
|
|||||||
|
diff --git a/server/listen.c b/server/listen.c
|
||||||
|
index 5242c2a..e2e028a 100644
|
||||||
|
--- a/server/listen.c
|
||||||
|
+++ b/server/listen.c
|
||||||
|
@@ -34,6 +34,10 @@
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifdef HAVE_SYSTEMD
|
||||||
|
+#include <systemd/sd-daemon.h>
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
/* we know core's module_index is 0 */
|
||||||
|
#undef APLOG_MODULE_INDEX
|
||||||
|
#define APLOG_MODULE_INDEX AP_CORE_MODULE_INDEX
|
||||||
|
@@ -59,9 +63,12 @@ static int ap_listenbacklog;
|
||||||
|
static int ap_listencbratio;
|
||||||
|
static int send_buffer_size;
|
||||||
|
static int receive_buffer_size;
|
||||||
|
+#ifdef HAVE_SYSTEMD
|
||||||
|
+static int use_systemd = -1;
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/* TODO: make_sock is just begging and screaming for APR abstraction */
|
||||||
|
-static apr_status_t make_sock(apr_pool_t *p, ap_listen_rec *server)
|
||||||
|
+static apr_status_t make_sock(apr_pool_t *p, ap_listen_rec *server, int do_bind_listen)
|
||||||
|
{
|
||||||
|
apr_socket_t *s = server->sd;
|
||||||
|
int one = 1;
|
||||||
|
@@ -94,20 +101,6 @@ static apr_status_t make_sock(apr_pool_t *p, ap_listen_rec *server)
|
||||||
|
return stat;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#if APR_HAVE_IPV6
|
||||||
|
- if (server->bind_addr->family == APR_INET6) {
|
||||||
|
- stat = apr_socket_opt_set(s, APR_IPV6_V6ONLY, v6only_setting);
|
||||||
|
- if (stat != APR_SUCCESS && stat != APR_ENOTIMPL) {
|
||||||
|
- ap_log_perror(APLOG_MARK, APLOG_CRIT, stat, p, APLOGNO(00069)
|
||||||
|
- "make_sock: for address %pI, apr_socket_opt_set: "
|
||||||
|
- "(IPV6_V6ONLY)",
|
||||||
|
- server->bind_addr);
|
||||||
|
- apr_socket_close(s);
|
||||||
|
- return stat;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
/*
|
||||||
|
* To send data over high bandwidth-delay connections at full
|
||||||
|
* speed we must force the TCP window to open wide enough to keep the
|
||||||
|
@@ -169,21 +162,37 @@ static apr_status_t make_sock(apr_pool_t *p, ap_listen_rec *server)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
- if ((stat = apr_socket_bind(s, server->bind_addr)) != APR_SUCCESS) {
|
||||||
|
- ap_log_perror(APLOG_MARK, APLOG_STARTUP|APLOG_CRIT, stat, p, APLOGNO(00072)
|
||||||
|
- "make_sock: could not bind to address %pI",
|
||||||
|
- server->bind_addr);
|
||||||
|
- apr_socket_close(s);
|
||||||
|
- return stat;
|
||||||
|
- }
|
||||||
|
+ if (do_bind_listen) {
|
||||||
|
+#if APR_HAVE_IPV6
|
||||||
|
+ if (server->bind_addr->family == APR_INET6) {
|
||||||
|
+ stat = apr_socket_opt_set(s, APR_IPV6_V6ONLY, v6only_setting);
|
||||||
|
+ if (stat != APR_SUCCESS && stat != APR_ENOTIMPL) {
|
||||||
|
+ ap_log_perror(APLOG_MARK, APLOG_CRIT, stat, p, APLOGNO(00069)
|
||||||
|
+ "make_sock: for address %pI, apr_socket_opt_set: "
|
||||||
|
+ "(IPV6_V6ONLY)",
|
||||||
|
+ server->bind_addr);
|
||||||
|
+ apr_socket_close(s);
|
||||||
|
+ return stat;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
- if ((stat = apr_socket_listen(s, ap_listenbacklog)) != APR_SUCCESS) {
|
||||||
|
- ap_log_perror(APLOG_MARK, APLOG_STARTUP|APLOG_ERR, stat, p, APLOGNO(00073)
|
||||||
|
- "make_sock: unable to listen for connections "
|
||||||
|
- "on address %pI",
|
||||||
|
- server->bind_addr);
|
||||||
|
- apr_socket_close(s);
|
||||||
|
- return stat;
|
||||||
|
+ if ((stat = apr_socket_bind(s, server->bind_addr)) != APR_SUCCESS) {
|
||||||
|
+ ap_log_perror(APLOG_MARK, APLOG_STARTUP|APLOG_CRIT, stat, p, APLOGNO(00072)
|
||||||
|
+ "make_sock: could not bind to address %pI",
|
||||||
|
+ server->bind_addr);
|
||||||
|
+ apr_socket_close(s);
|
||||||
|
+ return stat;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if ((stat = apr_socket_listen(s, ap_listenbacklog)) != APR_SUCCESS) {
|
||||||
|
+ ap_log_perror(APLOG_MARK, APLOG_STARTUP|APLOG_ERR, stat, p, APLOGNO(00073)
|
||||||
|
+ "make_sock: unable to listen for connections "
|
||||||
|
+ "on address %pI",
|
||||||
|
+ server->bind_addr);
|
||||||
|
+ apr_socket_close(s);
|
||||||
|
+ return stat;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
@@ -315,6 +324,123 @@ static int find_listeners(ap_listen_rec **from, ap_listen_rec **to,
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef HAVE_SYSTEMD
|
||||||
|
+
|
||||||
|
+static int find_systemd_socket(process_rec * process, apr_port_t port) {
|
||||||
|
+ int fdcount, fd;
|
||||||
|
+ int sdc = sd_listen_fds(0);
|
||||||
|
+
|
||||||
|
+ if (sdc < 0) {
|
||||||
|
+ ap_log_perror(APLOG_MARK, APLOG_CRIT, sdc, process->pool, APLOGNO(02486)
|
||||||
|
+ "find_systemd_socket: Error parsing enviroment, sd_listen_fds returned %d",
|
||||||
|
+ sdc);
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (sdc == 0) {
|
||||||
|
+ ap_log_perror(APLOG_MARK, APLOG_CRIT, sdc, process->pool, APLOGNO(02487)
|
||||||
|
+ "find_systemd_socket: At least one socket must be set.");
|
||||||
|
+ return -1;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ fdcount = atoi(getenv("LISTEN_FDS"));
|
||||||
|
+ for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + fdcount; fd++) {
|
||||||
|
+ if (sd_is_socket_inet(fd, 0, 0, -1, port) > 0) {
|
||||||
|
+ return fd;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return -1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static apr_status_t alloc_systemd_listener(process_rec * process,
|
||||||
|
+ int fd, const char *proto,
|
||||||
|
+ ap_listen_rec **out_rec)
|
||||||
|
+{
|
||||||
|
+ apr_status_t rv;
|
||||||
|
+ struct sockaddr sa;
|
||||||
|
+ socklen_t len = sizeof(struct sockaddr);
|
||||||
|
+ apr_os_sock_info_t si;
|
||||||
|
+ ap_listen_rec *rec;
|
||||||
|
+ *out_rec = NULL;
|
||||||
|
+
|
||||||
|
+ memset(&si, 0, sizeof(si));
|
||||||
|
+
|
||||||
|
+ rv = getsockname(fd, &sa, &len);
|
||||||
|
+
|
||||||
|
+ if (rv != 0) {
|
||||||
|
+ rv = apr_get_netos_error();
|
||||||
|
+ ap_log_perror(APLOG_MARK, APLOG_CRIT, rv, process->pool, APLOGNO(02489)
|
||||||
|
+ "getsockname on %d failed.", fd);
|
||||||
|
+ return rv;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ si.os_sock = &fd;
|
||||||
|
+ si.family = sa.sa_family;
|
||||||
|
+ si.local = &sa;
|
||||||
|
+ si.type = SOCK_STREAM;
|
||||||
|
+ si.protocol = APR_PROTO_TCP;
|
||||||
|
+
|
||||||
|
+ rec = apr_palloc(process->pool, sizeof(ap_listen_rec));
|
||||||
|
+ rec->active = 0;
|
||||||
|
+ rec->next = 0;
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ rv = apr_os_sock_make(&rec->sd, &si, process->pool);
|
||||||
|
+ if (rv != APR_SUCCESS) {
|
||||||
|
+ ap_log_perror(APLOG_MARK, APLOG_CRIT, rv, process->pool, APLOGNO(02490)
|
||||||
|
+ "apr_os_sock_make on %d failed.", fd);
|
||||||
|
+ return rv;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ rv = apr_socket_addr_get(&rec->bind_addr, APR_LOCAL, rec->sd);
|
||||||
|
+ if (rv != APR_SUCCESS) {
|
||||||
|
+ ap_log_perror(APLOG_MARK, APLOG_CRIT, rv, process->pool, APLOGNO(02491)
|
||||||
|
+ "apr_socket_addr_get on %d failed.", fd);
|
||||||
|
+ return rv;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ rec->protocol = apr_pstrdup(process->pool, proto);
|
||||||
|
+
|
||||||
|
+ *out_rec = rec;
|
||||||
|
+
|
||||||
|
+ return make_sock(process->pool, rec, 0);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const char *set_systemd_listener(process_rec *process, apr_port_t port,
|
||||||
|
+ const char *proto)
|
||||||
|
+{
|
||||||
|
+ ap_listen_rec *last, *new;
|
||||||
|
+ apr_status_t rv;
|
||||||
|
+ int fd = find_systemd_socket(process, port);
|
||||||
|
+ if (fd < 0) {
|
||||||
|
+ return "Systemd socket activation is used, but this port is not "
|
||||||
|
+ "configured in systemd";
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ last = ap_listeners;
|
||||||
|
+ while (last && last->next) {
|
||||||
|
+ last = last->next;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ rv = alloc_systemd_listener(process, fd, proto, &new);
|
||||||
|
+ if (rv != APR_SUCCESS) {
|
||||||
|
+ return "Failed to setup socket passed by systemd using socket activation";
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (last == NULL) {
|
||||||
|
+ ap_listeners = last = new;
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ last->next = new;
|
||||||
|
+ last = new;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+#endif /* HAVE_SYSTEMD */
|
||||||
|
+
|
||||||
|
static const char *alloc_listener(process_rec *process, const char *addr,
|
||||||
|
apr_port_t port, const char* proto,
|
||||||
|
void *slave)
|
||||||
|
@@ -495,7 +621,7 @@ static int open_listeners(apr_pool_t *pool)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
- if (make_sock(pool, lr) == APR_SUCCESS) {
|
||||||
|
+ if (make_sock(pool, lr, 1) == APR_SUCCESS) {
|
||||||
|
++num_open;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
@@ -607,8 +733,28 @@ AP_DECLARE(int) ap_setup_listeners(server_rec *s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (open_listeners(s->process->pool)) {
|
||||||
|
- return 0;
|
||||||
|
+#ifdef HAVE_SYSTEMD
|
||||||
|
+ if (use_systemd) {
|
||||||
|
+ const char *userdata_key = "ap_open_systemd_listeners";
|
||||||
|
+ void *data;
|
||||||
|
+ /* clear the enviroment on our second run
|
||||||
|
+ * so that none of our future children get confused.
|
||||||
|
+ */
|
||||||
|
+ apr_pool_userdata_get(&data, userdata_key, s->process->pool);
|
||||||
|
+ if (!data) {
|
||||||
|
+ apr_pool_userdata_set((const void *)1, userdata_key,
|
||||||
|
+ apr_pool_cleanup_null, s->process->pool);
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ sd_listen_fds(1);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+#endif
|
||||||
|
+ {
|
||||||
|
+ if (open_listeners(s->process->pool)) {
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
for (lr = ap_listeners; lr; lr = lr->next) {
|
||||||
|
@@ -698,7 +844,7 @@ AP_DECLARE(apr_status_t) ap_duplicate_listeners(apr_pool_t *p, server_rec *s,
|
||||||
|
duplr->bind_addr);
|
||||||
|
return stat;
|
||||||
|
}
|
||||||
|
- make_sock(p, duplr);
|
||||||
|
+ make_sock(p, duplr, 1);
|
||||||
|
#if AP_NONBLOCK_WHEN_MULTI_LISTEN
|
||||||
|
use_nonblock = (ap_listeners && ap_listeners->next);
|
||||||
|
stat = apr_socket_opt_set(duplr->sd, APR_SO_NONBLOCK, use_nonblock);
|
||||||
|
@@ -825,6 +971,11 @@ AP_DECLARE_NONSTD(const char *) ap_set_listener(cmd_parms *cmd, void *dummy,
|
||||||
|
if (argc < 1 || argc > 2) {
|
||||||
|
return "Listen requires 1 or 2 arguments.";
|
||||||
|
}
|
||||||
|
+#ifdef HAVE_SYSTEMD
|
||||||
|
+ if (use_systemd == -1) {
|
||||||
|
+ use_systemd = sd_listen_fds(0) > 0;
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
rv = apr_parse_addr_port(&host, &scope_id, &port, argv[0], cmd->pool);
|
||||||
|
if (rv != APR_SUCCESS) {
|
||||||
|
@@ -856,6 +1007,12 @@ AP_DECLARE_NONSTD(const char *) ap_set_listener(cmd_parms *cmd, void *dummy,
|
||||||
|
ap_str_tolower(proto);
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef HAVE_SYSTEMD
|
||||||
|
+ if (use_systemd) {
|
||||||
|
+ return set_systemd_listener(cmd->server->process, port, proto);
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
return alloc_listener(cmd->server->process, host, port, proto, NULL);
|
||||||
|
}
|
||||||
|
|
31
SOURCES/httpd-2.4.43-sslciphdefault.patch
Normal file
31
SOURCES/httpd-2.4.43-sslciphdefault.patch
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
diff --git a/modules/ssl/ssl_engine_config.c b/modules/ssl/ssl_engine_config.c
|
||||||
|
index 97778a8..27e7a53 100644
|
||||||
|
--- a/modules/ssl/ssl_engine_config.c
|
||||||
|
+++ b/modules/ssl/ssl_engine_config.c
|
||||||
|
@@ -778,9 +778,11 @@ const char *ssl_cmd_SSLCipherSuite(cmd_parms *cmd,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp("SSL", arg1)) {
|
||||||
|
- /* always disable null and export ciphers */
|
||||||
|
- arg2 = apr_pstrcat(cmd->pool, arg2, ":!aNULL:!eNULL:!EXP", NULL);
|
||||||
|
if (cmd->path) {
|
||||||
|
+ /* Disable null and export ciphers by default, except for PROFILE=
|
||||||
|
+ * configs where the parser doesn't cope. */
|
||||||
|
+ if (strncmp(arg2, "PROFILE=", 8) != 0)
|
||||||
|
+ arg2 = apr_pstrcat(cmd->pool, arg2, ":!aNULL:!eNULL:!EXP", NULL);
|
||||||
|
dc->szCipherSuite = arg2;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
@@ -1544,8 +1546,10 @@ const char *ssl_cmd_SSLProxyCipherSuite(cmd_parms *cmd,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!strcmp("SSL", arg1)) {
|
||||||
|
- /* always disable null and export ciphers */
|
||||||
|
- arg2 = apr_pstrcat(cmd->pool, arg2, ":!aNULL:!eNULL:!EXP", NULL);
|
||||||
|
+ /* Disable null and export ciphers by default, except for PROFILE=
|
||||||
|
+ * configs where the parser doesn't cope. */
|
||||||
|
+ if (strncmp(arg2, "PROFILE=", 8) != 0)
|
||||||
|
+ arg2 = apr_pstrcat(cmd->pool, arg2, ":!aNULL:!eNULL:!EXP", NULL);
|
||||||
|
dc->proxy->auth.cipher_suite = arg2;
|
||||||
|
return NULL;
|
||||||
|
}
|
99
SOURCES/httpd-2.4.43-sslprotdefault.patch
Normal file
99
SOURCES/httpd-2.4.43-sslprotdefault.patch
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
diff --git a/modules/ssl/ssl_engine_config.c b/modules/ssl/ssl_engine_config.c
|
||||||
|
index 27e7a53..b53f3f8 100644
|
||||||
|
--- a/modules/ssl/ssl_engine_config.c
|
||||||
|
+++ b/modules/ssl/ssl_engine_config.c
|
||||||
|
@@ -119,7 +119,7 @@ static void modssl_ctx_init(modssl_ctx_t *mctx, apr_pool_t *p)
|
||||||
|
mctx->ticket_key = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
- mctx->protocol = SSL_PROTOCOL_DEFAULT;
|
||||||
|
+ mctx->protocol = SSL_PROTOCOL_NONE;
|
||||||
|
mctx->protocol_set = 0;
|
||||||
|
|
||||||
|
mctx->pphrase_dialog_type = SSL_PPTYPE_UNSET;
|
||||||
|
@@ -263,6 +263,7 @@ static void modssl_ctx_cfg_merge(apr_pool_t *p,
|
||||||
|
if (add->protocol_set) {
|
||||||
|
mrg->protocol_set = 1;
|
||||||
|
mrg->protocol = add->protocol;
|
||||||
|
+ mrg->protocol_set = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mrg->protocol_set = base->protocol_set;
|
||||||
|
|
||||||
|
diff --git a/modules/ssl/ssl_engine_init.c b/modules/ssl/ssl_engine_init.c
|
||||||
|
index bfad47a..b0fcf81 100644
|
||||||
|
--- a/modules/ssl/ssl_engine_init.c
|
||||||
|
+++ b/modules/ssl/ssl_engine_init.c
|
||||||
|
@@ -577,6 +577,7 @@ static apr_status_t ssl_init_ctx_protocol(server_rec *s,
|
||||||
|
MODSSL_SSL_METHOD_CONST SSL_METHOD *method = NULL;
|
||||||
|
char *cp;
|
||||||
|
int protocol = mctx->protocol;
|
||||||
|
+ int protocol_set = mctx->protocol_set;
|
||||||
|
SSLSrvConfigRec *sc = mySrvConfig(s);
|
||||||
|
#if OPENSSL_VERSION_NUMBER >= 0x10100000L
|
||||||
|
int prot;
|
||||||
|
@@ -586,12 +587,18 @@ static apr_status_t ssl_init_ctx_protocol(server_rec *s,
|
||||||
|
* Create the new per-server SSL context
|
||||||
|
*/
|
||||||
|
if (protocol == SSL_PROTOCOL_NONE) {
|
||||||
|
- ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(02231)
|
||||||
|
- "No SSL protocols available [hint: SSLProtocol]");
|
||||||
|
- return ssl_die(s);
|
||||||
|
- }
|
||||||
|
+ if (protocol_set) {
|
||||||
|
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(02231)
|
||||||
|
+ "No SSL protocols available [hint: SSLProtocol]");
|
||||||
|
+ return ssl_die(s);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- cp = apr_pstrcat(p,
|
||||||
|
+ ap_log_error(APLOG_MARK, APLOG_TRACE3, 0, s,
|
||||||
|
+ "Using OpenSSL/system default SSL/TLS protocols");
|
||||||
|
+ cp = "default";
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ cp = apr_pstrcat(p,
|
||||||
|
#ifndef OPENSSL_NO_SSL3
|
||||||
|
(protocol & SSL_PROTOCOL_SSLV3 ? "SSLv3, " : ""),
|
||||||
|
#endif
|
||||||
|
@@ -604,7 +611,8 @@ static apr_status_t ssl_init_ctx_protocol(server_rec *s,
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
NULL);
|
||||||
|
- cp[strlen(cp)-2] = NUL;
|
||||||
|
+ cp[strlen(cp)-2] = NUL;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
ap_log_error(APLOG_MARK, APLOG_TRACE3, 0, s,
|
||||||
|
"Creating new SSL context (protocols: %s)", cp);
|
||||||
|
@@ -705,13 +713,15 @@ static apr_status_t ssl_init_ctx_protocol(server_rec *s,
|
||||||
|
prot = SSL3_VERSION;
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
- SSL_CTX_free(ctx);
|
||||||
|
- mctx->ssl_ctx = NULL;
|
||||||
|
- ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(03378)
|
||||||
|
- "No SSL protocols available [hint: SSLProtocol]");
|
||||||
|
- return ssl_die(s);
|
||||||
|
+ if (protocol_set) {
|
||||||
|
+ SSL_CTX_free(ctx);
|
||||||
|
+ mctx->ssl_ctx = NULL;
|
||||||
|
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(03378)
|
||||||
|
+ "No SSL protocols available [hint: SSLProtocol]");
|
||||||
|
+ return ssl_die(s);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
- SSL_CTX_set_max_proto_version(ctx, prot);
|
||||||
|
+ if (protocol != SSL_PROTOCOL_NONE) SSL_CTX_set_max_proto_version(ctx, prot);
|
||||||
|
|
||||||
|
/* Next we scan for the minimal protocol version we should provide,
|
||||||
|
* but we do not allow holes between max and min */
|
||||||
|
@@ -731,7 +741,7 @@ static apr_status_t ssl_init_ctx_protocol(server_rec *s,
|
||||||
|
prot = SSL3_VERSION;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
- SSL_CTX_set_min_proto_version(ctx, prot);
|
||||||
|
+ if (protocol != SSL_PROTOCOL_NONE) SSL_CTX_set_min_proto_version(ctx, prot);
|
||||||
|
#endif /* if OPENSSL_VERSION_NUMBER < 0x10100000L */
|
||||||
|
|
||||||
|
#ifdef SSL_OP_CIPHER_SERVER_PREFERENCE
|
124
SOURCES/httpd-2.4.46-freebind.patch
Normal file
124
SOURCES/httpd-2.4.46-freebind.patch
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
diff --git a/docs/manual/mod/mpm_common.html.en b/docs/manual/mod/mpm_common.html.en
|
||||||
|
index e7af21d..01d54b7 100644
|
||||||
|
--- a/docs/manual/mod/mpm_common.html.en
|
||||||
|
+++ b/docs/manual/mod/mpm_common.html.en
|
||||||
|
@@ -42,6 +42,7 @@ more than one multi-processing module (MPM)</td></tr>
|
||||||
|
<li><img alt="" src="../images/down.gif" /> <a href="#enableexceptionhook">EnableExceptionHook</a></li>
|
||||||
|
<li><img alt="" src="../images/down.gif" /> <a href="#gracefulshutdowntimeout">GracefulShutdownTimeout</a></li>
|
||||||
|
<li><img alt="" src="../images/down.gif" /> <a href="#listen">Listen</a></li>
|
||||||
|
+<li><img alt="" src="../images/down.gif" /> <a href="#listenfree">ListenFree</a></li>
|
||||||
|
<li><img alt="" src="../images/down.gif" /> <a href="#listenbacklog">ListenBackLog</a></li>
|
||||||
|
<li><img alt="" src="../images/down.gif" /> <a href="#listencoresbucketsratio">ListenCoresBucketsRatio</a></li>
|
||||||
|
<li><img alt="" src="../images/down.gif" /> <a href="#maxconnectionsperchild">MaxConnectionsPerChild</a></li>
|
||||||
|
@@ -244,6 +245,31 @@ discussion of the <code>Address already in use</code> error message,
|
||||||
|
including other causes.</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
+
|
||||||
|
+<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
|
||||||
|
+<div class="directive-section"><h2><a name="ListenFree" id="ListenFree">ListenFree</a> <a name="listenfree" id="listenfree">Directive</a></h2>
|
||||||
|
+<table class="directive">
|
||||||
|
+<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>IP addresses and ports that the server
|
||||||
|
+listens to. Doesn't require IP address to be up</td></tr>
|
||||||
|
+<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ListenFree [<var>IP-address</var>:]<var>portnumber</var> [<var>protocol</var>]</code></td></tr>
|
||||||
|
+<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config</td></tr>
|
||||||
|
+<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>MPM</td></tr>
|
||||||
|
+<tr><th><a href="directive-dict.html#Module">Module:</a></th><td><code class="module"><a href="../mod/event.html">event</a></code>, <code class="module"><a href="../mod/worker.html">worker</a></code>, <code class="module"><a href="../mod/prefork.html">prefork</a></code>, <code class="module"><a href="../mod/mpm_winnt.html">mpm_winnt</a></code>, <code class="module"><a href="../mod/mpm_netware.html">mpm_netware</a></code>, <code class="module"><a href="../mod/mpmt_os2.html">mpmt_os2</a></code></td></tr>
|
||||||
|
+<tr><th><a href="directive-dict.html#Compatibility">Compatibility:</a></th><td>This directive is currently available only in Red Hat Enterprise Linux</td></tr>
|
||||||
|
+</table>
|
||||||
|
+ <p>The <code class="directive">ListenFree</code> directive is
|
||||||
|
+ identical to the <code class="directive">Listen</code> directive.
|
||||||
|
+ The only difference is in the usage of the IP_FREEBIND socket
|
||||||
|
+ option, which is enabled by default with <code class="directive">ListenFree</code>.
|
||||||
|
+ If IP_FREEBIND is enabled, it allows httpd to bind to an IP
|
||||||
|
+ address that is nonlocal or does not (yet) exist. This allows httpd to
|
||||||
|
+ listen on a socket without requiring the underlying network interface
|
||||||
|
+ or the specified dynamic IP address to be up at the time when httpd
|
||||||
|
+ is trying to bind to it.
|
||||||
|
+ </p>
|
||||||
|
+</div>
|
||||||
|
+
|
||||||
|
+
|
||||||
|
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif" /></a></div>
|
||||||
|
<div class="directive-section"><h2><a name="ListenBackLog" id="ListenBackLog">ListenBackLog</a> <a name="listenbacklog" id="listenbacklog">Directive</a></h2>
|
||||||
|
<table class="directive">
|
||||||
|
diff --git a/include/ap_listen.h b/include/ap_listen.h
|
||||||
|
index 58c2574..1a53292 100644
|
||||||
|
--- a/include/ap_listen.h
|
||||||
|
+++ b/include/ap_listen.h
|
||||||
|
@@ -137,6 +137,9 @@ AP_DECLARE_NONSTD(const char *) ap_set_listenbacklog(cmd_parms *cmd, void *dummy
|
||||||
|
AP_DECLARE_NONSTD(const char *) ap_set_listencbratio(cmd_parms *cmd, void *dummy, const char *arg);
|
||||||
|
AP_DECLARE_NONSTD(const char *) ap_set_listener(cmd_parms *cmd, void *dummy,
|
||||||
|
int argc, char *const argv[]);
|
||||||
|
+AP_DECLARE_NONSTD(const char *) ap_set_freelistener(cmd_parms *cmd, void *dummy,
|
||||||
|
+ int argc, char *const argv[]);
|
||||||
|
+
|
||||||
|
AP_DECLARE_NONSTD(const char *) ap_set_send_buffer_size(cmd_parms *cmd, void *dummy,
|
||||||
|
const char *arg);
|
||||||
|
AP_DECLARE_NONSTD(const char *) ap_set_receive_buffer_size(cmd_parms *cmd,
|
||||||
|
@@ -150,6 +153,8 @@ AP_INIT_TAKE1("ListenCoresBucketsRatio", ap_set_listencbratio, NULL, RSRC_CONF,
|
||||||
|
"Ratio between the number of CPU cores (online) and the number of listeners buckets"), \
|
||||||
|
AP_INIT_TAKE_ARGV("Listen", ap_set_listener, NULL, RSRC_CONF, \
|
||||||
|
"A port number or a numeric IP address and a port number, and an optional protocol"), \
|
||||||
|
+AP_INIT_TAKE_ARGV("ListenFree", ap_set_freelistener, NULL, RSRC_CONF, \
|
||||||
|
+ "A port number or a numeric IP address and a port number, and an optional protocol"), \
|
||||||
|
AP_INIT_TAKE1("SendBufferSize", ap_set_send_buffer_size, NULL, RSRC_CONF, \
|
||||||
|
"Send buffer size in bytes"), \
|
||||||
|
AP_INIT_TAKE1("ReceiveBufferSize", ap_set_receive_buffer_size, NULL, \
|
||||||
|
diff --git a/server/listen.c b/server/listen.c
|
||||||
|
index e2e028a..6ef664b 100644
|
||||||
|
--- a/server/listen.c
|
||||||
|
+++ b/server/listen.c
|
||||||
|
@@ -63,6 +63,7 @@ static int ap_listenbacklog;
|
||||||
|
static int ap_listencbratio;
|
||||||
|
static int send_buffer_size;
|
||||||
|
static int receive_buffer_size;
|
||||||
|
+static int ap_listenfreebind;
|
||||||
|
#ifdef HAVE_SYSTEMD
|
||||||
|
static int use_systemd = -1;
|
||||||
|
#endif
|
||||||
|
@@ -162,6 +163,21 @@ static apr_status_t make_sock(apr_pool_t *p, ap_listen_rec *server, int do_bind_
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+
|
||||||
|
+#if defined(APR_SO_FREEBIND)
|
||||||
|
+ if (ap_listenfreebind) {
|
||||||
|
+ if (apr_socket_opt_set(s, APR_SO_FREEBIND, one) < 0) {
|
||||||
|
+ stat = apr_get_netos_error();
|
||||||
|
+ ap_log_perror(APLOG_MARK, APLOG_CRIT, stat, p, APLOGNO(02182)
|
||||||
|
+ "make_sock: apr_socket_opt_set: "
|
||||||
|
+ "error setting APR_SO_FREEBIND");
|
||||||
|
+ apr_socket_close(s);
|
||||||
|
+ return stat;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
+
|
||||||
|
if (do_bind_listen) {
|
||||||
|
#if APR_HAVE_IPV6
|
||||||
|
if (server->bind_addr->family == APR_INET6) {
|
||||||
|
@@ -956,6 +972,7 @@ AP_DECLARE(void) ap_listen_pre_config(void)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
AP_DECLARE_NONSTD(const char *) ap_set_listener(cmd_parms *cmd, void *dummy,
|
||||||
|
int argc, char *const argv[])
|
||||||
|
{
|
||||||
|
@@ -1016,6 +1033,14 @@ AP_DECLARE_NONSTD(const char *) ap_set_listener(cmd_parms *cmd, void *dummy,
|
||||||
|
return alloc_listener(cmd->server->process, host, port, proto, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
+AP_DECLARE_NONSTD(const char *) ap_set_freelistener(cmd_parms *cmd, void *dummy,
|
||||||
|
+ int argc,
|
||||||
|
+ char *const argv[])
|
||||||
|
+{
|
||||||
|
+ ap_listenfreebind = 1;
|
||||||
|
+ return ap_set_listener(cmd, dummy, argc, argv);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
AP_DECLARE_NONSTD(const char *) ap_set_listenbacklog(cmd_parms *cmd,
|
||||||
|
void *dummy,
|
||||||
|
const char *arg)
|
13
SOURCES/httpd-2.4.46-htcacheclean-dont-break.patch
Normal file
13
SOURCES/httpd-2.4.46-htcacheclean-dont-break.patch
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
diff --git a/support/htcacheclean.c b/support/htcacheclean.c
|
||||||
|
index 958ba6d..0a7fe3c 100644
|
||||||
|
--- a/support/htcacheclean.c
|
||||||
|
+++ b/support/htcacheclean.c
|
||||||
|
@@ -557,8 +557,6 @@ static int list_urls(char *path, apr_pool_t *pool, apr_off_t round)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
63
SOURCES/httpd-2.4.48-export.patch
Normal file
63
SOURCES/httpd-2.4.48-export.patch
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
|
||||||
|
Reduce size of httpd binary by telling linker to export all symbols
|
||||||
|
from libmain.a, rather than bloating the symbol table with ap_hack_*
|
||||||
|
to do so indirectly.
|
||||||
|
|
||||||
|
Upstream: https://svn.apache.org/r1861685 (as new default-off configure option)
|
||||||
|
|
||||||
|
diff --git a/Makefile.in b/Makefile.in
|
||||||
|
index 40c7076..ac98e5f 100644
|
||||||
|
--- a/Makefile.in
|
||||||
|
+++ b/Makefile.in
|
||||||
|
@@ -4,8 +4,15 @@ CLEAN_SUBDIRS = test
|
||||||
|
|
||||||
|
PROGRAM_NAME = $(progname)
|
||||||
|
PROGRAM_SOURCES = modules.c
|
||||||
|
-PROGRAM_LDADD = buildmark.o $(HTTPD_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(HTTPD_LIBS) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS)
|
||||||
|
+PROGRAM_LDADD = buildmark.o $(HTTPD_LDFLAGS) \
|
||||||
|
+ $(PROGRAM_LDDEPS) \
|
||||||
|
+ $(HTTPD_LIBS) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS)
|
||||||
|
PROGRAM_PRELINK = $(COMPILE) -c $(top_srcdir)/server/buildmark.c
|
||||||
|
+PROGRAM_LDDEPS = \
|
||||||
|
+ $(BUILTIN_LIBS) \
|
||||||
|
+ $(MPM_LIB) \
|
||||||
|
+ -Wl,--whole-archive,server/.libs/libmain.a,--no-whole-archive \
|
||||||
|
+ os/$(OS_DIR)/libos.la
|
||||||
|
PROGRAM_DEPENDENCIES = \
|
||||||
|
server/libmain.la \
|
||||||
|
$(BUILTIN_LIBS) \
|
||||||
|
diff --git a/server/Makefile.in b/server/Makefile.in
|
||||||
|
index 8111877..f00bb3f 100644
|
||||||
|
--- a/server/Makefile.in
|
||||||
|
+++ b/server/Makefile.in
|
||||||
|
@@ -12,7 +12,7 @@ LTLIBRARY_SOURCES = \
|
||||||
|
connection.c listen.c util_mutex.c \
|
||||||
|
mpm_common.c mpm_unix.c mpm_fdqueue.c \
|
||||||
|
util_charset.c util_cookies.c util_debug.c util_xml.c \
|
||||||
|
- util_filter.c util_pcre.c util_regex.c exports.c \
|
||||||
|
+ util_filter.c util_pcre.c util_regex.c \
|
||||||
|
scoreboard.c error_bucket.c protocol.c core.c request.c ssl.c provider.c \
|
||||||
|
eoc_bucket.c eor_bucket.c core_filters.c \
|
||||||
|
util_expr_parse.c util_expr_scan.c util_expr_eval.c
|
||||||
|
diff --git a/server/main.c b/server/main.c
|
||||||
|
index 62e06df..17c09ee 100644
|
||||||
|
--- a/server/main.c
|
||||||
|
+++ b/server/main.c
|
||||||
|
@@ -835,17 +835,3 @@ int main(int argc, const char * const argv[])
|
||||||
|
return !OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
-#ifdef AP_USING_AUTOCONF
|
||||||
|
-/* This ugly little hack pulls any function referenced in exports.c into
|
||||||
|
- * the web server. exports.c is generated during the build, and it
|
||||||
|
- * has all of the APR functions specified by the apr/apr.exports and
|
||||||
|
- * apr-util/aprutil.exports files.
|
||||||
|
- */
|
||||||
|
-const void *ap_suck_in_APR(void);
|
||||||
|
-const void *ap_suck_in_APR(void)
|
||||||
|
-{
|
||||||
|
- extern const void *ap_ugly_hack;
|
||||||
|
-
|
||||||
|
- return ap_ugly_hack;
|
||||||
|
-}
|
||||||
|
-#endif
|
46
SOURCES/httpd-2.4.48-full-release.patch
Normal file
46
SOURCES/httpd-2.4.48-full-release.patch
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
diff --git a/server/core.c b/server/core.c
|
||||||
|
index c36ff26..621c82a 100644
|
||||||
|
--- a/server/core.c
|
||||||
|
+++ b/server/core.c
|
||||||
|
@@ -3569,6 +3569,7 @@ enum server_token_type {
|
||||||
|
SrvTk_MINIMAL, /* eg: Apache/2.0.41 */
|
||||||
|
SrvTk_OS, /* eg: Apache/2.0.41 (UNIX) */
|
||||||
|
SrvTk_FULL, /* eg: Apache/2.0.41 (UNIX) PHP/4.2.2 FooBar/1.2b */
|
||||||
|
+ SrvTk_FULL_RELEASE, /* eg: Apache/2.0.41 (UNIX) (Release 32.el7) PHP/4.2.2 FooBar/1.2b */
|
||||||
|
SrvTk_PRODUCT_ONLY /* eg: Apache */
|
||||||
|
};
|
||||||
|
static enum server_token_type ap_server_tokens = SrvTk_FULL;
|
||||||
|
@@ -3645,7 +3646,10 @@ static void set_banner(apr_pool_t *pconf)
|
||||||
|
else if (ap_server_tokens == SrvTk_MAJOR) {
|
||||||
|
ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MAJORVERSION);
|
||||||
|
}
|
||||||
|
- else {
|
||||||
|
+ else if (ap_server_tokens == SrvTk_FULL_RELEASE) {
|
||||||
|
+ ap_add_version_component(pconf, AP_SERVER_BASEVERSION " (" PLATFORM ") (Release @RELEASE@)");
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
ap_add_version_component(pconf, AP_SERVER_BASEVERSION " (" PLATFORM ")");
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -3653,7 +3657,7 @@ static void set_banner(apr_pool_t *pconf)
|
||||||
|
* Lock the server_banner string if we're not displaying
|
||||||
|
* the full set of tokens
|
||||||
|
*/
|
||||||
|
- if (ap_server_tokens != SrvTk_FULL) {
|
||||||
|
+ if (ap_server_tokens != SrvTk_FULL && ap_server_tokens != SrvTk_FULL_RELEASE) {
|
||||||
|
banner_locked++;
|
||||||
|
}
|
||||||
|
server_description = AP_SERVER_BASEVERSION " (" PLATFORM ")";
|
||||||
|
@@ -3686,8 +3690,11 @@ static const char *set_serv_tokens(cmd_parms *cmd, void *dummy,
|
||||||
|
else if (!ap_cstr_casecmp(arg, "Full")) {
|
||||||
|
ap_server_tokens = SrvTk_FULL;
|
||||||
|
}
|
||||||
|
+ else if (!strcasecmp(arg, "Full-Release")) {
|
||||||
|
+ ap_server_tokens = SrvTk_FULL_RELEASE;
|
||||||
|
+ }
|
||||||
|
else {
|
||||||
|
- return "ServerTokens takes 1 argument: 'Prod(uctOnly)', 'Major', 'Minor', 'Min(imal)', 'OS', or 'Full'";
|
||||||
|
+ return "ServerTokens takes 1 argument: 'Prod(uctOnly)', 'Major', 'Minor', 'Min(imal)', 'OS', 'Full' or 'Full-Release'";
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
109
SOURCES/httpd-2.4.48-proxy-ws-idle-timeout.patch
Normal file
109
SOURCES/httpd-2.4.48-proxy-ws-idle-timeout.patch
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
diff --git a/docs/manual/mod/mod_proxy_wstunnel.html.en b/docs/manual/mod/mod_proxy_wstunnel.html.en
|
||||||
|
index 9f2c120..61ff7de 100644
|
||||||
|
--- a/docs/manual/mod/mod_proxy_wstunnel.html.en
|
||||||
|
+++ b/docs/manual/mod/mod_proxy_wstunnel.html.en
|
||||||
|
@@ -83,6 +83,7 @@ in the response <code>Upgrade</code></p>
|
||||||
|
<div id="quickview"><a href="https://www.apache.org/foundation/contributing.html" class="badge"><img src="https://www.apache.org/images/SupportApache-small.png" alt="Support Apache!" /></a><h3 class="directives">Directives</h3>
|
||||||
|
<ul id="toc">
|
||||||
|
<li><img alt="" src="../images/down.gif" /> <a href="#proxywebsocketfallbacktoproxyhttp">ProxyWebsocketFallbackToProxyHttp</a></li>
|
||||||
|
+<li><img alt="" src="../images/down.gif" /> <a href="#proxywebsocketidletimeout">ProxyWebsocketIdleTimeout</a></li>
|
||||||
|
</ul>
|
||||||
|
<h3>Bugfix checklist</h3><ul class="seealso"><li><a href="https://www.apache.org/dist/httpd/CHANGES_2.4">httpd changelog</a></li><li><a href="https://bz.apache.org/bugzilla/buglist.cgi?bug_status=__open__&list_id=144532&product=Apache%20httpd-2&query_format=specific&order=changeddate%20DESC%2Cpriority%2Cbug_severity&component=mod_proxy_wstunnel">Known issues</a></li><li><a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2&component=mod_proxy_wstunnel">Report a bug</a></li></ul><h3>See also</h3>
|
||||||
|
<ul class="seealso">
|
||||||
|
@@ -108,6 +109,23 @@ in the response <code>Upgrade</code></p>
|
||||||
|
WebSocket requests as in httpd 2.4.46 and earlier.</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
+
|
||||||
|
+<div class="directive-section"><h2><a name="ProxyWebsocketIdleTimeout" id="ProxyWebsocketIdleTimeout">ProxyWebsocketIdleTimeout</a> <a name="proxywebsocketidletimeout" id="proxywebsocketidletimeout">Directive</a> <a title="Permanent link" href="#proxywebsocketidletimeout" class="permalink">¶</a></h2>
|
||||||
|
+<table class="directive">
|
||||||
|
+<tr><th><a href="directive-dict.html#Description">Description:</a></th><td>Sets the maximum amount of time to wait for data on the websockets tunnel</td></tr>
|
||||||
|
+<tr><th><a href="directive-dict.html#Syntax">Syntax:</a></th><td><code>ProxyWebsocketIdleTimeout <var>num</var>[ms]</code></td></tr>
|
||||||
|
+<tr><th><a href="directive-dict.html#Default">Default:</a></th><td><code>ProxyWebsocketIdleTimeout 0</code></td></tr>
|
||||||
|
+<tr><th><a href="directive-dict.html#Context">Context:</a></th><td>server config, virtual host</td></tr>
|
||||||
|
+<tr><th><a href="directive-dict.html#Status">Status:</a></th><td>Extension</td></tr>
|
||||||
|
+<tr><th><a href="directive-dict.html#Module">Module:</a></th><td>mod_proxy_wstunnel</td></tr>
|
||||||
|
+</table>
|
||||||
|
+ <p>This directive imposes a maximum amount of time for the tunnel to be
|
||||||
|
+ left open while idle. The timeout is considered in seconds by default, but
|
||||||
|
+ it is possible to increase the time resolution to milliseconds
|
||||||
|
+ adding the <em>ms</em> suffix.</p>
|
||||||
|
+
|
||||||
|
+</div>
|
||||||
|
+
|
||||||
|
</div>
|
||||||
|
<div class="bottomlang">
|
||||||
|
<p><span>Available Languages: </span><a href="../en/mod/mod_proxy_wstunnel.html" title="English"> en </a> |
|
||||||
|
diff --git a/modules/proxy/mod_proxy_wstunnel.c b/modules/proxy/mod_proxy_wstunnel.c
|
||||||
|
index bcbba42..c29ded1 100644
|
||||||
|
--- a/modules/proxy/mod_proxy_wstunnel.c
|
||||||
|
+++ b/modules/proxy/mod_proxy_wstunnel.c
|
||||||
|
@@ -22,6 +22,7 @@ module AP_MODULE_DECLARE_DATA proxy_wstunnel_module;
|
||||||
|
typedef struct {
|
||||||
|
unsigned int fallback_to_proxy_http :1,
|
||||||
|
fallback_to_proxy_http_set :1;
|
||||||
|
+ apr_time_t idle_timeout;
|
||||||
|
} proxyws_dir_conf;
|
||||||
|
|
||||||
|
static int can_fallback_to_proxy_http;
|
||||||
|
@@ -152,6 +153,8 @@ static int proxy_wstunnel_request(apr_pool_t *p, request_rec *r,
|
||||||
|
conn_rec *c = r->connection;
|
||||||
|
apr_socket_t *sock = conn->sock;
|
||||||
|
conn_rec *backconn = conn->connection;
|
||||||
|
+ proxyws_dir_conf *dconf = ap_get_module_config(r->per_dir_config,
|
||||||
|
+ &proxy_wstunnel_module);
|
||||||
|
char *buf;
|
||||||
|
apr_bucket_brigade *header_brigade;
|
||||||
|
apr_bucket *e;
|
||||||
|
@@ -229,10 +232,13 @@ static int proxy_wstunnel_request(apr_pool_t *p, request_rec *r,
|
||||||
|
c->keepalive = AP_CONN_CLOSE;
|
||||||
|
|
||||||
|
do { /* Loop until done (one side closes the connection, or an error) */
|
||||||
|
- rv = apr_pollset_poll(pollset, -1, &pollcnt, &signalled);
|
||||||
|
+ rv = apr_pollset_poll(pollset, dconf->idle_timeout, &pollcnt, &signalled);
|
||||||
|
if (rv != APR_SUCCESS) {
|
||||||
|
if (APR_STATUS_IS_EINTR(rv)) {
|
||||||
|
continue;
|
||||||
|
+ } else if(APR_STATUS_IS_TIMEUP(rv)){
|
||||||
|
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "RH: the connection has timed out");
|
||||||
|
+ return HTTP_REQUEST_TIME_OUT;
|
||||||
|
}
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(02444) "error apr_poll()");
|
||||||
|
return HTTP_INTERNAL_SERVER_ERROR;
|
||||||
|
@@ -418,11 +424,26 @@ cleanup:
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static const char * proxyws_set_idle(cmd_parms *cmd, void *conf, const char *val)
|
||||||
|
+{
|
||||||
|
+ proxyws_dir_conf *dconf = conf;
|
||||||
|
+ if (ap_timeout_parameter_parse(val, &(dconf->idle_timeout), "s") != APR_SUCCESS)
|
||||||
|
+ return "ProxyWebsocketIdleTimeout timeout has wrong format";
|
||||||
|
+
|
||||||
|
+ if (dconf->idle_timeout < 0)
|
||||||
|
+ return "ProxyWebsocketIdleTimeout timeout has to be a non-negative number";
|
||||||
|
+
|
||||||
|
+ if (!dconf->idle_timeout) dconf->idle_timeout = -1; /* loop indefinitely */
|
||||||
|
+
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void *create_proxyws_dir_config(apr_pool_t *p, char *dummy)
|
||||||
|
{
|
||||||
|
proxyws_dir_conf *new =
|
||||||
|
(proxyws_dir_conf *) apr_pcalloc(p, sizeof(proxyws_dir_conf));
|
||||||
|
|
||||||
|
+ new->idle_timeout = -1; /* no timeout */
|
||||||
|
new->fallback_to_proxy_http = 1;
|
||||||
|
|
||||||
|
return (void *) new;
|
||||||
|
@@ -465,7 +486,8 @@ static const command_rec ws_proxy_cmds[] =
|
||||||
|
proxyws_fallback_to_proxy_http, NULL, RSRC_CONF|ACCESS_CONF,
|
||||||
|
"whether to let mod_proxy_http handle the upgrade and tunneling, "
|
||||||
|
"On by default"),
|
||||||
|
-
|
||||||
|
+ AP_INIT_TAKE1("ProxyWebsocketIdleTimeout", proxyws_set_idle, NULL, RSRC_CONF|ACCESS_CONF,
|
||||||
|
+ "timeout for activity in either direction, unlimited by default."),
|
||||||
|
{NULL}
|
||||||
|
};
|
||||||
|
|
99
SOURCES/httpd-2.4.48-r1825120.patch
Normal file
99
SOURCES/httpd-2.4.48-r1825120.patch
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
diff --git a/modules/ssl/ssl_engine_init.c b/modules/ssl/ssl_engine_init.c
|
||||||
|
index 4e2e80d..10a2c86 100644
|
||||||
|
--- a/modules/ssl/ssl_engine_init.c
|
||||||
|
+++ b/modules/ssl/ssl_engine_init.c
|
||||||
|
@@ -2256,51 +2256,6 @@ int ssl_proxy_section_post_config(apr_pool_t *p, apr_pool_t *plog,
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int ssl_init_FindCAList_X509NameCmp(const X509_NAME * const *a,
|
||||||
|
- const X509_NAME * const *b)
|
||||||
|
-{
|
||||||
|
- return(X509_NAME_cmp(*a, *b));
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static void ssl_init_PushCAList(STACK_OF(X509_NAME) *ca_list,
|
||||||
|
- server_rec *s, apr_pool_t *ptemp,
|
||||||
|
- const char *file)
|
||||||
|
-{
|
||||||
|
- int n;
|
||||||
|
- STACK_OF(X509_NAME) *sk;
|
||||||
|
-
|
||||||
|
- sk = (STACK_OF(X509_NAME) *)
|
||||||
|
- SSL_load_client_CA_file(file);
|
||||||
|
-
|
||||||
|
- if (!sk) {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- for (n = 0; n < sk_X509_NAME_num(sk); n++) {
|
||||||
|
- X509_NAME *name = sk_X509_NAME_value(sk, n);
|
||||||
|
-
|
||||||
|
- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(02209)
|
||||||
|
- "CA certificate: %s",
|
||||||
|
- modssl_X509_NAME_to_string(ptemp, name, 0));
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * note that SSL_load_client_CA_file() checks for duplicates,
|
||||||
|
- * but since we call it multiple times when reading a directory
|
||||||
|
- * we must also check for duplicates ourselves.
|
||||||
|
- */
|
||||||
|
-
|
||||||
|
- if (sk_X509_NAME_find(ca_list, name) < 0) {
|
||||||
|
- /* this will be freed when ca_list is */
|
||||||
|
- sk_X509_NAME_push(ca_list, name);
|
||||||
|
- }
|
||||||
|
- else {
|
||||||
|
- /* need to free this ourselves, else it will leak */
|
||||||
|
- X509_NAME_free(name);
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- sk_X509_NAME_free(sk);
|
||||||
|
-}
|
||||||
|
|
||||||
|
static apr_status_t ssl_init_ca_cert_path(server_rec *s,
|
||||||
|
apr_pool_t *ptemp,
|
||||||
|
@@ -2324,7 +2279,7 @@ static apr_status_t ssl_init_ca_cert_path(server_rec *s,
|
||||||
|
}
|
||||||
|
file = apr_pstrcat(ptemp, path, "/", direntry.name, NULL);
|
||||||
|
if (ca_list) {
|
||||||
|
- ssl_init_PushCAList(ca_list, s, ptemp, file);
|
||||||
|
+ SSL_add_file_cert_subjects_to_stack(ca_list, file);
|
||||||
|
}
|
||||||
|
if (xi_list) {
|
||||||
|
load_x509_info(ptemp, xi_list, file);
|
||||||
|
@@ -2341,19 +2296,13 @@ STACK_OF(X509_NAME) *ssl_init_FindCAList(server_rec *s,
|
||||||
|
const char *ca_file,
|
||||||
|
const char *ca_path)
|
||||||
|
{
|
||||||
|
- STACK_OF(X509_NAME) *ca_list;
|
||||||
|
-
|
||||||
|
- /*
|
||||||
|
- * Start with a empty stack/list where new
|
||||||
|
- * entries get added in sorted order.
|
||||||
|
- */
|
||||||
|
- ca_list = sk_X509_NAME_new(ssl_init_FindCAList_X509NameCmp);
|
||||||
|
+ STACK_OF(X509_NAME) *ca_list = sk_X509_NAME_new_null();;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Process CA certificate bundle file
|
||||||
|
*/
|
||||||
|
if (ca_file) {
|
||||||
|
- ssl_init_PushCAList(ca_list, s, ptemp, ca_file);
|
||||||
|
+ SSL_add_file_cert_subjects_to_stack(ca_list, ca_file);
|
||||||
|
/*
|
||||||
|
* If ca_list is still empty after trying to load ca_file
|
||||||
|
* then the file failed to load, and users should hear about that.
|
||||||
|
@@ -2377,11 +2326,6 @@ STACK_OF(X509_NAME) *ssl_init_FindCAList(server_rec *s,
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * Cleanup
|
||||||
|
- */
|
||||||
|
- (void) sk_X509_NAME_set_cmp_func(ca_list, NULL);
|
||||||
|
-
|
||||||
|
return ca_list;
|
||||||
|
}
|
||||||
|
|
1411
SOURCES/httpd-2.4.48-r1828172+.patch
Normal file
1411
SOURCES/httpd-2.4.48-r1828172+.patch
Normal file
File diff suppressed because it is too large
Load Diff
229
SOURCES/httpd-2.4.48-r1842929+.patch
Normal file
229
SOURCES/httpd-2.4.48-r1842929+.patch
Normal file
@ -0,0 +1,229 @@
|
|||||||
|
diff --git a/Makefile.in b/Makefile.in
|
||||||
|
index 6747aea..40c7076 100644
|
||||||
|
--- a/Makefile.in
|
||||||
|
+++ b/Makefile.in
|
||||||
|
@@ -233,6 +233,7 @@ install-cgi:
|
||||||
|
install-other:
|
||||||
|
@test -d $(DESTDIR)$(logfiledir) || $(MKINSTALLDIRS) $(DESTDIR)$(logfiledir)
|
||||||
|
@test -d $(DESTDIR)$(runtimedir) || $(MKINSTALLDIRS) $(DESTDIR)$(runtimedir)
|
||||||
|
+ @test -d $(DESTDIR)$(statedir) || $(MKINSTALLDIRS) $(DESTDIR)$(statedir)
|
||||||
|
@for ext in dll x; do \
|
||||||
|
file=apachecore.$$ext; \
|
||||||
|
if test -f $$file; then \
|
||||||
|
diff --git a/acinclude.m4 b/acinclude.m4
|
||||||
|
index b6ef442..98f1441 100644
|
||||||
|
--- a/acinclude.m4
|
||||||
|
+++ b/acinclude.m4
|
||||||
|
@@ -45,6 +45,7 @@ AC_DEFUN([APACHE_GEN_CONFIG_VARS],[
|
||||||
|
APACHE_SUBST(installbuilddir)
|
||||||
|
APACHE_SUBST(runtimedir)
|
||||||
|
APACHE_SUBST(proxycachedir)
|
||||||
|
+ APACHE_SUBST(statedir)
|
||||||
|
APACHE_SUBST(other_targets)
|
||||||
|
APACHE_SUBST(progname)
|
||||||
|
APACHE_SUBST(prefix)
|
||||||
|
@@ -665,6 +666,7 @@ AC_DEFUN([APACHE_EXPORT_ARGUMENTS],[
|
||||||
|
APACHE_SUBST_EXPANDED_ARG(runtimedir)
|
||||||
|
APACHE_SUBST_EXPANDED_ARG(logfiledir)
|
||||||
|
APACHE_SUBST_EXPANDED_ARG(proxycachedir)
|
||||||
|
+ APACHE_SUBST_EXPANDED_ARG(statedir)
|
||||||
|
])
|
||||||
|
|
||||||
|
dnl
|
||||||
|
diff --git a/configure.in b/configure.in
|
||||||
|
index 37346b2..f303784 100644
|
||||||
|
--- a/configure.in
|
||||||
|
+++ b/configure.in
|
||||||
|
@@ -41,7 +41,7 @@ dnl Something seems broken here.
|
||||||
|
AC_PREFIX_DEFAULT(/usr/local/apache2)
|
||||||
|
|
||||||
|
dnl Get the layout here, so we can pass the required variables to apr
|
||||||
|
-APR_ENABLE_LAYOUT(Apache, [errordir iconsdir htdocsdir cgidir])
|
||||||
|
+APR_ENABLE_LAYOUT(Apache, [errordir iconsdir htdocsdir cgidir statedir])
|
||||||
|
|
||||||
|
dnl reparse the configure arguments.
|
||||||
|
APR_PARSE_ARGUMENTS
|
||||||
|
diff --git a/include/ap_config_layout.h.in b/include/ap_config_layout.h.in
|
||||||
|
index 2b4a70c..e076f41 100644
|
||||||
|
--- a/include/ap_config_layout.h.in
|
||||||
|
+++ b/include/ap_config_layout.h.in
|
||||||
|
@@ -60,5 +60,7 @@
|
||||||
|
#define DEFAULT_REL_LOGFILEDIR "@rel_logfiledir@"
|
||||||
|
#define DEFAULT_EXP_PROXYCACHEDIR "@exp_proxycachedir@"
|
||||||
|
#define DEFAULT_REL_PROXYCACHEDIR "@rel_proxycachedir@"
|
||||||
|
+#define DEFAULT_EXP_STATEDIR "@exp_statedir@"
|
||||||
|
+#define DEFAULT_REL_STATEDIR "@rel_statedir@"
|
||||||
|
|
||||||
|
#endif /* AP_CONFIG_LAYOUT_H */
|
||||||
|
diff --git a/include/http_config.h b/include/http_config.h
|
||||||
|
index 77657ae..384a90f 100644
|
||||||
|
--- a/include/http_config.h
|
||||||
|
+++ b/include/http_config.h
|
||||||
|
@@ -757,6 +757,14 @@ AP_DECLARE(char *) ap_server_root_relative(apr_pool_t *p, const char *fname);
|
||||||
|
*/
|
||||||
|
AP_DECLARE(char *) ap_runtime_dir_relative(apr_pool_t *p, const char *fname);
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ * Compute the name of a persistent state file (e.g. a database or
|
||||||
|
+ * long-lived cache) relative to the appropriate state directory.
|
||||||
|
+ * Absolute paths are returned as-is. The state directory is
|
||||||
|
+ * configured via the DefaultStateDir directive or at build time.
|
||||||
|
+ */
|
||||||
|
+AP_DECLARE(char *) ap_state_dir_relative(apr_pool_t *p, const char *fname);
|
||||||
|
+
|
||||||
|
/* Finally, the hook for dynamically loading modules in... */
|
||||||
|
|
||||||
|
/**
|
||||||
|
diff --git a/modules/dav/fs/mod_dav_fs.c b/modules/dav/fs/mod_dav_fs.c
|
||||||
|
index addfd7e..2389f8f 100644
|
||||||
|
--- a/modules/dav/fs/mod_dav_fs.c
|
||||||
|
+++ b/modules/dav/fs/mod_dav_fs.c
|
||||||
|
@@ -29,6 +29,10 @@ typedef struct {
|
||||||
|
|
||||||
|
extern module AP_MODULE_DECLARE_DATA dav_fs_module;
|
||||||
|
|
||||||
|
+#ifndef DEFAULT_DAV_LOCKDB
|
||||||
|
+#define DEFAULT_DAV_LOCKDB "davlockdb"
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
const char *dav_get_lockdb_path(const request_rec *r)
|
||||||
|
{
|
||||||
|
dav_fs_server_conf *conf;
|
||||||
|
@@ -57,6 +61,24 @@ static void *dav_fs_merge_server_config(apr_pool_t *p,
|
||||||
|
return newconf;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static apr_status_t dav_fs_post_config(apr_pool_t *p, apr_pool_t *plog,
|
||||||
|
+ apr_pool_t *ptemp, server_rec *base_server)
|
||||||
|
+{
|
||||||
|
+ server_rec *s;
|
||||||
|
+
|
||||||
|
+ for (s = base_server; s; s = s->next) {
|
||||||
|
+ dav_fs_server_conf *conf;
|
||||||
|
+
|
||||||
|
+ conf = ap_get_module_config(s->module_config, &dav_fs_module);
|
||||||
|
+
|
||||||
|
+ if (!conf->lockdb_path) {
|
||||||
|
+ conf->lockdb_path = ap_state_dir_relative(p, DEFAULT_DAV_LOCKDB);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return OK;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Command handler for the DAVLockDB directive, which is TAKE1
|
||||||
|
*/
|
||||||
|
@@ -87,6 +109,8 @@ static const command_rec dav_fs_cmds[] =
|
||||||
|
|
||||||
|
static void register_hooks(apr_pool_t *p)
|
||||||
|
{
|
||||||
|
+ ap_hook_post_config(dav_fs_post_config, NULL, NULL, APR_HOOK_MIDDLE);
|
||||||
|
+
|
||||||
|
dav_hook_gather_propsets(dav_fs_gather_propsets, NULL, NULL,
|
||||||
|
APR_HOOK_MIDDLE);
|
||||||
|
dav_hook_find_liveprop(dav_fs_find_liveprop, NULL, NULL, APR_HOOK_MIDDLE);
|
||||||
|
diff --git a/server/core.c b/server/core.c
|
||||||
|
index d135764..c2176b9 100644
|
||||||
|
--- a/server/core.c
|
||||||
|
+++ b/server/core.c
|
||||||
|
@@ -142,6 +142,8 @@ AP_DECLARE_DATA int ap_main_state = AP_SQ_MS_INITIAL_STARTUP;
|
||||||
|
AP_DECLARE_DATA int ap_run_mode = AP_SQ_RM_UNKNOWN;
|
||||||
|
AP_DECLARE_DATA int ap_config_generation = 0;
|
||||||
|
|
||||||
|
+static const char *core_state_dir;
|
||||||
|
+
|
||||||
|
static void *create_core_dir_config(apr_pool_t *a, char *dir)
|
||||||
|
{
|
||||||
|
core_dir_config *conf;
|
||||||
|
@@ -1444,13 +1446,16 @@ AP_DECLARE(const char *) ap_resolve_env(apr_pool_t *p, const char * word)
|
||||||
|
return res_buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static int reset_config_defines(void *dummy)
|
||||||
|
+/* pconf cleanup - clear global variables set from config here. */
|
||||||
|
+static apr_status_t reset_config(void *dummy)
|
||||||
|
{
|
||||||
|
ap_server_config_defines = saved_server_config_defines;
|
||||||
|
saved_server_config_defines = NULL;
|
||||||
|
server_config_defined_vars = NULL;
|
||||||
|
ap_runtime_dir = NULL;
|
||||||
|
- return OK;
|
||||||
|
+ core_state_dir = NULL;
|
||||||
|
+
|
||||||
|
+ return APR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -3220,6 +3225,24 @@ static const char *set_runtime_dir(cmd_parms *cmd, void *dummy, const char *arg)
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static const char *set_state_dir(cmd_parms *cmd, void *dummy, const char *arg)
|
||||||
|
+{
|
||||||
|
+ const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
|
||||||
|
+
|
||||||
|
+ if (err != NULL) {
|
||||||
|
+ return err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if ((apr_filepath_merge((char**)&core_state_dir, NULL,
|
||||||
|
+ ap_server_root_relative(cmd->temp_pool, arg),
|
||||||
|
+ APR_FILEPATH_TRUENAME, cmd->pool) != APR_SUCCESS)
|
||||||
|
+ || !ap_is_directory(cmd->temp_pool, core_state_dir)) {
|
||||||
|
+ return "DefaultStateDir must be a valid directory, absolute or relative to ServerRoot";
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return NULL;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static const char *set_timeout(cmd_parms *cmd, void *dummy, const char *arg)
|
||||||
|
{
|
||||||
|
const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_CONTEXT);
|
||||||
|
@@ -4521,6 +4544,8 @@ AP_INIT_TAKE1("ServerRoot", set_server_root, NULL, RSRC_CONF | EXEC_ON_READ,
|
||||||
|
"Common directory of server-related files (logs, confs, etc.)"),
|
||||||
|
AP_INIT_TAKE1("DefaultRuntimeDir", set_runtime_dir, NULL, RSRC_CONF | EXEC_ON_READ,
|
||||||
|
"Common directory for run-time files (shared memory, locks, etc.)"),
|
||||||
|
+AP_INIT_TAKE1("DefaultStateDir", set_state_dir, NULL, RSRC_CONF | EXEC_ON_READ,
|
||||||
|
+ "Common directory for persistent state (databases, long-lived caches, etc.)"),
|
||||||
|
AP_INIT_TAKE1("ErrorLog", set_server_string_slot,
|
||||||
|
(void *)APR_OFFSETOF(server_rec, error_fname), RSRC_CONF,
|
||||||
|
"The filename of the error log"),
|
||||||
|
@@ -5055,8 +5080,7 @@ static int core_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptem
|
||||||
|
|
||||||
|
if (!saved_server_config_defines)
|
||||||
|
init_config_defines(pconf);
|
||||||
|
- apr_pool_cleanup_register(pconf, NULL, reset_config_defines,
|
||||||
|
- apr_pool_cleanup_null);
|
||||||
|
+ apr_pool_cleanup_register(pconf, NULL, reset_config, apr_pool_cleanup_null);
|
||||||
|
|
||||||
|
ap_regcomp_set_default_cflags(AP_REG_DEFAULT);
|
||||||
|
|
||||||
|
@@ -5303,6 +5327,27 @@ AP_DECLARE(int) ap_state_query(int query)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+AP_DECLARE(char *) ap_state_dir_relative(apr_pool_t *p, const char *file)
|
||||||
|
+{
|
||||||
|
+ char *newpath = NULL;
|
||||||
|
+ apr_status_t rv;
|
||||||
|
+ const char *state_dir;
|
||||||
|
+
|
||||||
|
+ state_dir = core_state_dir
|
||||||
|
+ ? core_state_dir
|
||||||
|
+ : ap_server_root_relative(p, DEFAULT_REL_STATEDIR);
|
||||||
|
+
|
||||||
|
+ rv = apr_filepath_merge(&newpath, state_dir, file, APR_FILEPATH_TRUENAME, p);
|
||||||
|
+ if (newpath && (rv == APR_SUCCESS || APR_STATUS_IS_EPATHWILD(rv)
|
||||||
|
+ || APR_STATUS_IS_ENOENT(rv)
|
||||||
|
+ || APR_STATUS_IS_ENOTDIR(rv))) {
|
||||||
|
+ return newpath;
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static apr_random_t *rng = NULL;
|
||||||
|
#if APR_HAS_THREADS
|
||||||
|
static apr_thread_mutex_t *rng_mutex = NULL;
|
79
SOURCES/httpd-2.4.48-ssl-proxy-chains.patch
Normal file
79
SOURCES/httpd-2.4.48-ssl-proxy-chains.patch
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
diff --git a/modules/ssl/ssl_engine_init.c b/modules/ssl/ssl_engine_init.c
|
||||||
|
index 15f68f9..e67c81d 100644
|
||||||
|
--- a/modules/ssl/ssl_engine_init.c
|
||||||
|
+++ b/modules/ssl/ssl_engine_init.c
|
||||||
|
@@ -1682,6 +1682,10 @@ static apr_status_t ssl_init_proxy_certs(server_rec *s,
|
||||||
|
STACK_OF(X509) *chain;
|
||||||
|
X509_STORE_CTX *sctx;
|
||||||
|
X509_STORE *store = SSL_CTX_get_cert_store(mctx->ssl_ctx);
|
||||||
|
+ int addl_chain = 0; /* non-zero if additional chain certs were
|
||||||
|
+ * added to store */
|
||||||
|
+
|
||||||
|
+ ap_assert(store != NULL); /* safe to assume always non-NULL? */
|
||||||
|
|
||||||
|
#if OPENSSL_VERSION_NUMBER >= 0x1010100fL
|
||||||
|
/* For OpenSSL >=1.1.1, turn on client cert support which is
|
||||||
|
@@ -1707,20 +1711,28 @@ static apr_status_t ssl_init_proxy_certs(server_rec *s,
|
||||||
|
ssl_init_ca_cert_path(s, ptemp, pkp->cert_path, NULL, sk);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if ((ncerts = sk_X509_INFO_num(sk)) <= 0) {
|
||||||
|
- sk_X509_INFO_free(sk);
|
||||||
|
- ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, APLOGNO(02206)
|
||||||
|
- "no client certs found for SSL proxy");
|
||||||
|
- return APR_SUCCESS;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
/* Check that all client certs have got certificates and private
|
||||||
|
- * keys. */
|
||||||
|
- for (n = 0; n < ncerts; n++) {
|
||||||
|
+ * keys. Note the number of certs in the stack may decrease
|
||||||
|
+ * during the loop. */
|
||||||
|
+ for (n = 0; n < sk_X509_INFO_num(sk); n++) {
|
||||||
|
X509_INFO *inf = sk_X509_INFO_value(sk, n);
|
||||||
|
+ int has_privkey = inf->x_pkey && inf->x_pkey->dec_pkey;
|
||||||
|
|
||||||
|
- if (!inf->x509 || !inf->x_pkey || !inf->x_pkey->dec_pkey ||
|
||||||
|
- inf->enc_data) {
|
||||||
|
+ /* For a lone certificate in the file, trust it as a
|
||||||
|
+ * CA/intermediate certificate. */
|
||||||
|
+ if (inf->x509 && !has_privkey && !inf->enc_data) {
|
||||||
|
+ ssl_log_xerror(SSLLOG_MARK, APLOG_DEBUG, 0, ptemp, s, inf->x509,
|
||||||
|
+ APLOGNO(10261) "Trusting non-leaf certificate");
|
||||||
|
+ X509_STORE_add_cert(store, inf->x509); /* increments inf->x509 */
|
||||||
|
+ /* Delete from the stack and iterate again. */
|
||||||
|
+ X509_INFO_free(inf);
|
||||||
|
+ sk_X509_INFO_delete(sk, n);
|
||||||
|
+ n--;
|
||||||
|
+ addl_chain = 1;
|
||||||
|
+ continue;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (!has_privkey || inf->enc_data) {
|
||||||
|
sk_X509_INFO_free(sk);
|
||||||
|
ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, s, APLOGNO(02252)
|
||||||
|
"incomplete client cert configured for SSL proxy "
|
||||||
|
@@ -1737,13 +1749,21 @@ static apr_status_t ssl_init_proxy_certs(server_rec *s,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if ((ncerts = sk_X509_INFO_num(sk)) <= 0) {
|
||||||
|
+ sk_X509_INFO_free(sk);
|
||||||
|
+ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, APLOGNO(02206)
|
||||||
|
+ "no client certs found for SSL proxy");
|
||||||
|
+ return APR_SUCCESS;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(02207)
|
||||||
|
"loaded %d client certs for SSL proxy",
|
||||||
|
ncerts);
|
||||||
|
pkp->certs = sk;
|
||||||
|
|
||||||
|
-
|
||||||
|
- if (!pkp->ca_cert_file || !store) {
|
||||||
|
+ /* If any chain certs are configured, build the ->ca_certs chains
|
||||||
|
+ * corresponding to the loaded keypairs. */
|
||||||
|
+ if (!pkp->ca_cert_file && !addl_chain) {
|
||||||
|
return APR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
252
SOURCES/httpd-2.4.51-CVE-2021-44224.patch
Normal file
252
SOURCES/httpd-2.4.51-CVE-2021-44224.patch
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
diff --git a/include/http_protocol.h b/include/http_protocol.h
|
||||||
|
index 9ccac89..20bd202 100644
|
||||||
|
--- a/include/http_protocol.h
|
||||||
|
+++ b/include/http_protocol.h
|
||||||
|
@@ -96,6 +96,13 @@ AP_DECLARE(void) ap_get_mime_headers(request_rec *r);
|
||||||
|
AP_DECLARE(void) ap_get_mime_headers_core(request_rec *r,
|
||||||
|
apr_bucket_brigade *bb);
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ * Run post_read_request hook and validate.
|
||||||
|
+ * @param r The current request
|
||||||
|
+ * @return OK or HTTP_...
|
||||||
|
+ */
|
||||||
|
+AP_DECLARE(int) ap_post_read_request(request_rec *r);
|
||||||
|
+
|
||||||
|
/* Finish up stuff after a request */
|
||||||
|
|
||||||
|
/**
|
||||||
|
diff --git a/modules/http/http_request.c b/modules/http/http_request.c
|
||||||
|
index c9ae5af..d59cfe2 100644
|
||||||
|
--- a/modules/http/http_request.c
|
||||||
|
+++ b/modules/http/http_request.c
|
||||||
|
@@ -680,7 +680,7 @@ static request_rec *internal_internal_redirect(const char *new_uri,
|
||||||
|
* to do their thing on internal redirects as well. Perhaps this is a
|
||||||
|
* misnamed function.
|
||||||
|
*/
|
||||||
|
- if ((access_status = ap_run_post_read_request(new))) {
|
||||||
|
+ if ((access_status = ap_post_read_request(new))) {
|
||||||
|
ap_die(access_status, new);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c
|
||||||
|
index ee4f1fb..ff9f81d 100644
|
||||||
|
--- a/modules/proxy/mod_proxy.c
|
||||||
|
+++ b/modules/proxy/mod_proxy.c
|
||||||
|
@@ -777,11 +777,12 @@ static int proxy_detect(request_rec *r)
|
||||||
|
|
||||||
|
if (conf->req && r->parsed_uri.scheme) {
|
||||||
|
/* but it might be something vhosted */
|
||||||
|
- if (!(r->parsed_uri.hostname
|
||||||
|
- && !ap_cstr_casecmp(r->parsed_uri.scheme, ap_http_scheme(r))
|
||||||
|
- && ap_matches_request_vhost(r, r->parsed_uri.hostname,
|
||||||
|
- (apr_port_t)(r->parsed_uri.port_str ? r->parsed_uri.port
|
||||||
|
- : ap_default_port(r))))) {
|
||||||
|
+ if (!r->parsed_uri.hostname
|
||||||
|
+ || ap_cstr_casecmp(r->parsed_uri.scheme, ap_http_scheme(r)) != 0
|
||||||
|
+ || !ap_matches_request_vhost(r, r->parsed_uri.hostname,
|
||||||
|
+ (apr_port_t)(r->parsed_uri.port_str
|
||||||
|
+ ? r->parsed_uri.port
|
||||||
|
+ : ap_default_port(r)))) {
|
||||||
|
r->proxyreq = PROXYREQ_PROXY;
|
||||||
|
r->uri = r->unparsed_uri;
|
||||||
|
r->filename = apr_pstrcat(r->pool, "proxy:", r->uri, NULL);
|
||||||
|
@@ -2021,6 +2022,7 @@ static const char *
|
||||||
|
struct proxy_alias *new;
|
||||||
|
char *f = cmd->path;
|
||||||
|
char *r = NULL;
|
||||||
|
+ const char *real;
|
||||||
|
char *word;
|
||||||
|
apr_table_t *params = apr_table_make(cmd->pool, 5);
|
||||||
|
const apr_array_header_t *arr;
|
||||||
|
@@ -2107,6 +2109,10 @@ static const char *
|
||||||
|
if (r == NULL) {
|
||||||
|
return "ProxyPass|ProxyPassMatch needs a path when not defined in a location";
|
||||||
|
}
|
||||||
|
+ if (!(real = ap_proxy_de_socketfy(cmd->temp_pool, r))) {
|
||||||
|
+ return "ProxyPass|ProxyPassMatch uses an invalid \"unix:\" URL";
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
|
||||||
|
/* if per directory, save away the single alias */
|
||||||
|
if (cmd->path) {
|
||||||
|
@@ -2123,7 +2129,7 @@ static const char *
|
||||||
|
}
|
||||||
|
|
||||||
|
new->fake = apr_pstrdup(cmd->pool, f);
|
||||||
|
- new->real = apr_pstrdup(cmd->pool, ap_proxy_de_socketfy(cmd->pool, r));
|
||||||
|
+ new->real = apr_pstrdup(cmd->pool, real);
|
||||||
|
new->flags = flags;
|
||||||
|
if (worker_type & AP_PROXY_WORKER_IS_MATCH) {
|
||||||
|
new->regex = ap_pregcomp(cmd->pool, f, AP_REG_EXTENDED);
|
||||||
|
@@ -2649,6 +2655,7 @@ static const char *add_member(cmd_parms *cmd, void *dummy, const char *arg)
|
||||||
|
proxy_worker *worker;
|
||||||
|
char *path = cmd->path;
|
||||||
|
char *name = NULL;
|
||||||
|
+ const char *real;
|
||||||
|
char *word;
|
||||||
|
apr_table_t *params = apr_table_make(cmd->pool, 5);
|
||||||
|
const apr_array_header_t *arr;
|
||||||
|
@@ -2689,6 +2696,9 @@ static const char *add_member(cmd_parms *cmd, void *dummy, const char *arg)
|
||||||
|
return "BalancerMember must define balancer name when outside <Proxy > section";
|
||||||
|
if (!name)
|
||||||
|
return "BalancerMember must define remote proxy server";
|
||||||
|
+ if (!(real = ap_proxy_de_socketfy(cmd->temp_pool, name))) {
|
||||||
|
+ return "BalancerMember uses an invalid \"unix:\" URL";
|
||||||
|
+ }
|
||||||
|
|
||||||
|
ap_str_tolower(path); /* lowercase scheme://hostname */
|
||||||
|
|
||||||
|
@@ -2701,8 +2711,7 @@ static const char *add_member(cmd_parms *cmd, void *dummy, const char *arg)
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Try to find existing worker */
|
||||||
|
- worker = ap_proxy_get_worker(cmd->temp_pool, balancer, conf,
|
||||||
|
- ap_proxy_de_socketfy(cmd->temp_pool, name));
|
||||||
|
+ worker = ap_proxy_get_worker(cmd->temp_pool, balancer, conf, real);
|
||||||
|
if (!worker) {
|
||||||
|
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, cmd->server, APLOGNO(01147)
|
||||||
|
"Defining worker '%s' for balancer '%s'",
|
||||||
|
@@ -2799,9 +2808,14 @@ static const char *
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
+ const char *real;
|
||||||
|
+
|
||||||
|
+ if (!(real = ap_proxy_de_socketfy(cmd->temp_pool, name))) {
|
||||||
|
+ return "ProxySet uses an invalid \"unix:\" URL";
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
worker = ap_proxy_get_worker_ex(cmd->temp_pool, NULL, conf,
|
||||||
|
- ap_proxy_de_socketfy(cmd->temp_pool, name),
|
||||||
|
- worker_type);
|
||||||
|
+ real, worker_type);
|
||||||
|
if (!worker) {
|
||||||
|
if (in_proxy_section) {
|
||||||
|
err = ap_proxy_define_worker_ex(cmd->pool, &worker, NULL,
|
||||||
|
@@ -2944,9 +2958,14 @@ static const char *proxysection(cmd_parms *cmd, void *mconfig, const char *arg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
+ const char *real;
|
||||||
|
+
|
||||||
|
+ if (!(real = ap_proxy_de_socketfy(cmd->temp_pool, conf->p))) {
|
||||||
|
+ return "<Proxy/ProxyMatch > uses an invalid \"unix:\" URL";
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
worker = ap_proxy_get_worker_ex(cmd->temp_pool, NULL, sconf,
|
||||||
|
- ap_proxy_de_socketfy(cmd->temp_pool, conf->p),
|
||||||
|
- worker_type);
|
||||||
|
+ real, worker_type);
|
||||||
|
if (!worker) {
|
||||||
|
err = ap_proxy_define_worker_ex(cmd->pool, &worker, NULL, sconf,
|
||||||
|
conf->p, worker_type);
|
||||||
|
diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h
|
||||||
|
index 044a6c4..c21c4d8 100644
|
||||||
|
--- a/modules/proxy/mod_proxy.h
|
||||||
|
+++ b/modules/proxy/mod_proxy.h
|
||||||
|
@@ -751,6 +751,7 @@ PROXY_DECLARE(int) ap_proxy_worker_can_upgrade(apr_pool_t *p,
|
||||||
|
#define AP_PROXY_WORKER_IS_PREFIX (1u << 0)
|
||||||
|
#define AP_PROXY_WORKER_IS_MATCH (1u << 1)
|
||||||
|
#define AP_PROXY_WORKER_IS_MALLOCED (1u << 2)
|
||||||
|
+#define AP_PROXY_WORKER_NO_UDS (1u << 3)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the worker from proxy configuration, looking for either PREFIXED or
|
||||||
|
diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c
|
||||||
|
index 8225045..cbe300f 100644
|
||||||
|
--- a/modules/proxy/proxy_util.c
|
||||||
|
+++ b/modules/proxy/proxy_util.c
|
||||||
|
@@ -1741,7 +1741,12 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_get_worker_ex(apr_pool_t *p,
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ if (!(mask & AP_PROXY_WORKER_NO_UDS)) {
|
||||||
|
url = ap_proxy_de_socketfy(p, url);
|
||||||
|
+ if (!url) {
|
||||||
|
+ return NULL;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
|
||||||
|
c = ap_strchr_c(url, ':');
|
||||||
|
if (c == NULL || c[1] != '/' || c[2] != '/' || c[3] == '\0') {
|
||||||
|
@@ -2323,22 +2328,22 @@ PROXY_DECLARE(int) ap_proxy_pre_request(proxy_worker **worker,
|
||||||
|
|
||||||
|
access_status = proxy_run_pre_request(worker, balancer, r, conf, url);
|
||||||
|
if (access_status == DECLINED && *balancer == NULL) {
|
||||||
|
- *worker = ap_proxy_get_worker(r->pool, NULL, conf, *url);
|
||||||
|
+ const int forward = (r->proxyreq == PROXYREQ_PROXY);
|
||||||
|
+ *worker = ap_proxy_get_worker_ex(r->pool, NULL, conf, *url,
|
||||||
|
+ forward ? AP_PROXY_WORKER_NO_UDS : 0);
|
||||||
|
if (*worker) {
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r,
|
||||||
|
"%s: found worker %s for %s",
|
||||||
|
(*worker)->s->scheme, (*worker)->s->name, *url);
|
||||||
|
- *balancer = NULL;
|
||||||
|
- if (!fix_uds_filename(r, url)) {
|
||||||
|
+ if (!forward && !fix_uds_filename(r, url)) {
|
||||||
|
return HTTP_INTERNAL_SERVER_ERROR;
|
||||||
|
}
|
||||||
|
access_status = OK;
|
||||||
|
}
|
||||||
|
- else if (r->proxyreq == PROXYREQ_PROXY) {
|
||||||
|
+ else if (forward) {
|
||||||
|
if (conf->forward) {
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r,
|
||||||
|
"*: found forward proxy worker for %s", *url);
|
||||||
|
- *balancer = NULL;
|
||||||
|
*worker = conf->forward;
|
||||||
|
access_status = OK;
|
||||||
|
/*
|
||||||
|
@@ -2352,8 +2357,8 @@ PROXY_DECLARE(int) ap_proxy_pre_request(proxy_worker **worker,
|
||||||
|
else if (r->proxyreq == PROXYREQ_REVERSE) {
|
||||||
|
if (conf->reverse) {
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r,
|
||||||
|
- "*: using default reverse proxy worker for %s (no keepalive)", *url);
|
||||||
|
- *balancer = NULL;
|
||||||
|
+ "*: using default reverse proxy worker for %s "
|
||||||
|
+ "(no keepalive)", *url);
|
||||||
|
*worker = conf->reverse;
|
||||||
|
access_status = OK;
|
||||||
|
/*
|
||||||
|
diff --git a/server/protocol.c b/server/protocol.c
|
||||||
|
index 3d74c5b..2214f72 100644
|
||||||
|
--- a/server/protocol.c
|
||||||
|
+++ b/server/protocol.c
|
||||||
|
@@ -1548,7 +1548,7 @@ request_rec *ap_read_request(conn_rec *conn)
|
||||||
|
/* we may have switched to another server */
|
||||||
|
apply_server_config(r);
|
||||||
|
|
||||||
|
- if ((access_status = ap_run_post_read_request(r))) {
|
||||||
|
+ if ((access_status = ap_post_read_request(r))) {
|
||||||
|
goto die;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1603,6 +1603,27 @@ ignore:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+AP_DECLARE(int) ap_post_read_request(request_rec *r)
|
||||||
|
+{
|
||||||
|
+ int status;
|
||||||
|
+
|
||||||
|
+ if ((status = ap_run_post_read_request(r))) {
|
||||||
|
+ return status;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /* Enforce http(s) only scheme for non-forward-proxy requests */
|
||||||
|
+ if (!r->proxyreq
|
||||||
|
+ && r->parsed_uri.scheme
|
||||||
|
+ && (ap_cstr_casecmpn(r->parsed_uri.scheme, "http", 4) != 0
|
||||||
|
+ || (r->parsed_uri.scheme[4] != '\0'
|
||||||
|
+ && (apr_tolower(r->parsed_uri.scheme[4]) != 's'
|
||||||
|
+ || r->parsed_uri.scheme[5] != '\0')))) {
|
||||||
|
+ return HTTP_BAD_REQUEST;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return OK;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/* if a request with a body creates a subrequest, remove original request's
|
||||||
|
* input headers which pertain to the body which has already been read.
|
||||||
|
* out-of-line helper function for ap_set_sub_req_protocol.
|
10
SOURCES/httpd-2.4.51-CVE-2021-44790.patch
Normal file
10
SOURCES/httpd-2.4.51-CVE-2021-44790.patch
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
--- a/modules/lua/lua_request.c 2021/12/16 11:09:40 1896038
|
||||||
|
+++ b/modules/lua/lua_request.c 2021/12/16 11:15:47 1896039
|
||||||
|
@@ -410,6 +410,7 @@
|
||||||
|
if (end == NULL) break;
|
||||||
|
key = (char *) apr_pcalloc(r->pool, 256);
|
||||||
|
filename = (char *) apr_pcalloc(r->pool, 256);
|
||||||
|
+ if (end - crlf <= 8) break;
|
||||||
|
vlen = end - crlf - 8;
|
||||||
|
buffer = (char *) apr_pcalloc(r->pool, vlen+1);
|
||||||
|
memcpy(buffer, crlf + 4, vlen);
|
154
SOURCES/httpd-2.4.51-CVE-2022-22720.patch
Normal file
154
SOURCES/httpd-2.4.51-CVE-2022-22720.patch
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
diff --git a/modules/http/http_filters.c b/modules/http/http_filters.c
|
||||||
|
index b10d2b7..5659c4b 100644
|
||||||
|
--- a/modules/http/http_filters.c
|
||||||
|
+++ b/modules/http/http_filters.c
|
||||||
|
@@ -1595,9 +1595,9 @@ AP_DECLARE(int) ap_map_http_request_error(apr_status_t rv, int status)
|
||||||
|
*/
|
||||||
|
AP_DECLARE(int) ap_discard_request_body(request_rec *r)
|
||||||
|
{
|
||||||
|
+ int rc = OK;
|
||||||
|
+ conn_rec *c = r->connection;
|
||||||
|
apr_bucket_brigade *bb;
|
||||||
|
- int seen_eos;
|
||||||
|
- apr_status_t rv;
|
||||||
|
|
||||||
|
/* Sometimes we'll get in a state where the input handling has
|
||||||
|
* detected an error where we want to drop the connection, so if
|
||||||
|
@@ -1606,54 +1606,57 @@ AP_DECLARE(int) ap_discard_request_body(request_rec *r)
|
||||||
|
*
|
||||||
|
* This function is also a no-op on a subrequest.
|
||||||
|
*/
|
||||||
|
- if (r->main || r->connection->keepalive == AP_CONN_CLOSE ||
|
||||||
|
- ap_status_drops_connection(r->status)) {
|
||||||
|
+ if (r->main || c->keepalive == AP_CONN_CLOSE) {
|
||||||
|
+ return OK;
|
||||||
|
+ }
|
||||||
|
+ if (ap_status_drops_connection(r->status)) {
|
||||||
|
+ c->keepalive = AP_CONN_CLOSE;
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
|
||||||
|
- seen_eos = 0;
|
||||||
|
- do {
|
||||||
|
- apr_bucket *bucket;
|
||||||
|
+ for (;;) {
|
||||||
|
+ apr_status_t rv;
|
||||||
|
|
||||||
|
rv = ap_get_brigade(r->input_filters, bb, AP_MODE_READBYTES,
|
||||||
|
APR_BLOCK_READ, HUGE_STRING_LEN);
|
||||||
|
-
|
||||||
|
if (rv != APR_SUCCESS) {
|
||||||
|
- apr_brigade_destroy(bb);
|
||||||
|
- return ap_map_http_request_error(rv, HTTP_BAD_REQUEST);
|
||||||
|
+ rc = ap_map_http_request_error(rv, HTTP_BAD_REQUEST);
|
||||||
|
+ goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
- for (bucket = APR_BRIGADE_FIRST(bb);
|
||||||
|
- bucket != APR_BRIGADE_SENTINEL(bb);
|
||||||
|
- bucket = APR_BUCKET_NEXT(bucket))
|
||||||
|
- {
|
||||||
|
- const char *data;
|
||||||
|
- apr_size_t len;
|
||||||
|
+ while (!APR_BRIGADE_EMPTY(bb)) {
|
||||||
|
+ apr_bucket *b = APR_BRIGADE_FIRST(bb);
|
||||||
|
|
||||||
|
- if (APR_BUCKET_IS_EOS(bucket)) {
|
||||||
|
- seen_eos = 1;
|
||||||
|
- break;
|
||||||
|
+ if (APR_BUCKET_IS_EOS(b)) {
|
||||||
|
+ goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* These are metadata buckets. */
|
||||||
|
- if (bucket->length == 0) {
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* We MUST read because in case we have an unknown-length
|
||||||
|
- * bucket or one that morphs, we want to exhaust it.
|
||||||
|
+ /* There is no need to read empty or metadata buckets or
|
||||||
|
+ * buckets of known length, but we MUST read buckets of
|
||||||
|
+ * unknown length in order to exhaust them.
|
||||||
|
*/
|
||||||
|
- rv = apr_bucket_read(bucket, &data, &len, APR_BLOCK_READ);
|
||||||
|
+ if (b->length == (apr_size_t)-1) {
|
||||||
|
+ apr_size_t len;
|
||||||
|
+ const char *data;
|
||||||
|
+
|
||||||
|
+ rv = apr_bucket_read(b, &data, &len, APR_BLOCK_READ);
|
||||||
|
if (rv != APR_SUCCESS) {
|
||||||
|
- apr_brigade_destroy(bb);
|
||||||
|
- return HTTP_BAD_REQUEST;
|
||||||
|
+ rc = HTTP_BAD_REQUEST;
|
||||||
|
+ goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
- apr_brigade_cleanup(bb);
|
||||||
|
- } while (!seen_eos);
|
||||||
|
|
||||||
|
- return OK;
|
||||||
|
+ apr_bucket_delete(b);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+cleanup:
|
||||||
|
+ apr_brigade_cleanup(bb);
|
||||||
|
+ if (rc != OK) {
|
||||||
|
+ c->keepalive = AP_CONN_CLOSE;
|
||||||
|
+ }
|
||||||
|
+ return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Here we deal with getting the request message body from the client.
|
||||||
|
diff --git a/server/protocol.c b/server/protocol.c
|
||||||
|
index 3d74c5b..03b5419 100644
|
||||||
|
--- a/server/protocol.c
|
||||||
|
+++ b/server/protocol.c
|
||||||
|
@@ -1666,23 +1666,29 @@ AP_DECLARE(void) ap_set_sub_req_protocol(request_rec *rnew,
|
||||||
|
rnew->main = (request_rec *) r;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void end_output_stream(request_rec *r)
|
||||||
|
+static void end_output_stream(request_rec *r, int status)
|
||||||
|
{
|
||||||
|
conn_rec *c = r->connection;
|
||||||
|
apr_bucket_brigade *bb;
|
||||||
|
apr_bucket *b;
|
||||||
|
|
||||||
|
bb = apr_brigade_create(r->pool, c->bucket_alloc);
|
||||||
|
+ if (status != OK) {
|
||||||
|
+ b = ap_bucket_error_create(status, NULL, r->pool, c->bucket_alloc);
|
||||||
|
+ APR_BRIGADE_INSERT_TAIL(bb, b);
|
||||||
|
+ }
|
||||||
|
b = apr_bucket_eos_create(c->bucket_alloc);
|
||||||
|
APR_BRIGADE_INSERT_TAIL(bb, b);
|
||||||
|
+
|
||||||
|
ap_pass_brigade(r->output_filters, bb);
|
||||||
|
+ apr_brigade_cleanup(bb);
|
||||||
|
}
|
||||||
|
|
||||||
|
AP_DECLARE(void) ap_finalize_sub_req_protocol(request_rec *sub)
|
||||||
|
{
|
||||||
|
/* tell the filter chain there is no more content coming */
|
||||||
|
if (!sub->eos_sent) {
|
||||||
|
- end_output_stream(sub);
|
||||||
|
+ end_output_stream(sub, OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1693,11 +1699,11 @@ AP_DECLARE(void) ap_finalize_sub_req_protocol(request_rec *sub)
|
||||||
|
*/
|
||||||
|
AP_DECLARE(void) ap_finalize_request_protocol(request_rec *r)
|
||||||
|
{
|
||||||
|
- (void) ap_discard_request_body(r);
|
||||||
|
+ int status = ap_discard_request_body(r);
|
||||||
|
|
||||||
|
/* tell the filter chain there is no more content coming */
|
||||||
|
if (!r->eos_sent) {
|
||||||
|
- end_output_stream(r);
|
||||||
|
+ end_output_stream(r, status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
505
SOURCES/httpd-2.4.51-openssl3.patch
Normal file
505
SOURCES/httpd-2.4.51-openssl3.patch
Normal file
@ -0,0 +1,505 @@
|
|||||||
|
|
||||||
|
https://github.com/apache/httpd/pull/258
|
||||||
|
|
||||||
|
--- httpd-2.4.51/modules/ssl/ssl_engine_init.c.openssl3
|
||||||
|
+++ httpd-2.4.51/modules/ssl/ssl_engine_init.c
|
||||||
|
@@ -91,7 +91,6 @@
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
-#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Grab well-defined DH parameters from OpenSSL, see the BN_get_rfc*
|
||||||
|
@@ -171,6 +170,7 @@
|
||||||
|
|
||||||
|
return NULL; /* impossible to reach. */
|
||||||
|
}
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
static void ssl_add_version_components(apr_pool_t *ptemp, apr_pool_t *pconf,
|
||||||
|
server_rec *s)
|
||||||
|
@@ -440,8 +440,9 @@
|
||||||
|
|
||||||
|
modssl_init_app_data2_idx(); /* for modssl_get_app_data2() at request time */
|
||||||
|
|
||||||
|
+#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||||
|
init_dh_params();
|
||||||
|
-#if !MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||||
|
+#else
|
||||||
|
init_bio_methods();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
@@ -862,7 +863,11 @@
|
||||||
|
{
|
||||||
|
SSL_CTX *ctx = mctx->ssl_ctx;
|
||||||
|
|
||||||
|
+#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||||
|
+ /* Note that for OpenSSL>=1.1, auto selection is enabled via
|
||||||
|
+ * SSL_CTX_set_dh_auto(,1) if no parameter is configured. */
|
||||||
|
SSL_CTX_set_tmp_dh_callback(ctx, ssl_callback_TmpDH);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
SSL_CTX_set_info_callback(ctx, ssl_callback_Info);
|
||||||
|
|
||||||
|
@@ -871,6 +876,23 @@
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
+static APR_INLINE
|
||||||
|
+int modssl_CTX_load_verify_locations(SSL_CTX *ctx,
|
||||||
|
+ const char *file,
|
||||||
|
+ const char *path)
|
||||||
|
+{
|
||||||
|
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||||
|
+ if (!SSL_CTX_load_verify_locations(ctx, file, path))
|
||||||
|
+ return 0;
|
||||||
|
+#else
|
||||||
|
+ if (file && !SSL_CTX_load_verify_file(ctx, file))
|
||||||
|
+ return 0;
|
||||||
|
+ if (path && !SSL_CTX_load_verify_dir(ctx, path))
|
||||||
|
+ return 0;
|
||||||
|
+#endif
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static apr_status_t ssl_init_ctx_verify(server_rec *s,
|
||||||
|
apr_pool_t *p,
|
||||||
|
apr_pool_t *ptemp,
|
||||||
|
@@ -911,10 +933,8 @@
|
||||||
|
ap_log_error(APLOG_MARK, APLOG_TRACE1, 0, s,
|
||||||
|
"Configuring client authentication");
|
||||||
|
|
||||||
|
- if (!SSL_CTX_load_verify_locations(ctx,
|
||||||
|
- mctx->auth.ca_cert_file,
|
||||||
|
- mctx->auth.ca_cert_path))
|
||||||
|
- {
|
||||||
|
+ if (!modssl_CTX_load_verify_locations(ctx, mctx->auth.ca_cert_file,
|
||||||
|
+ mctx->auth.ca_cert_path)) {
|
||||||
|
ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(01895)
|
||||||
|
"Unable to configure verify locations "
|
||||||
|
"for client authentication");
|
||||||
|
@@ -999,6 +1019,23 @@
|
||||||
|
return APR_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static APR_INLINE
|
||||||
|
+int modssl_X509_STORE_load_locations(X509_STORE *store,
|
||||||
|
+ const char *file,
|
||||||
|
+ const char *path)
|
||||||
|
+{
|
||||||
|
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||||
|
+ if (!X509_STORE_load_locations(store, file, path))
|
||||||
|
+ return 0;
|
||||||
|
+#else
|
||||||
|
+ if (file && !X509_STORE_load_file(store, file))
|
||||||
|
+ return 0;
|
||||||
|
+ if (path && !X509_STORE_load_path(store, path))
|
||||||
|
+ return 0;
|
||||||
|
+#endif
|
||||||
|
+ return 1;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static apr_status_t ssl_init_ctx_crl(server_rec *s,
|
||||||
|
apr_pool_t *p,
|
||||||
|
apr_pool_t *ptemp,
|
||||||
|
@@ -1037,8 +1074,8 @@
|
||||||
|
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(01900)
|
||||||
|
"Configuring certificate revocation facility");
|
||||||
|
|
||||||
|
- if (!store || !X509_STORE_load_locations(store, mctx->crl_file,
|
||||||
|
- mctx->crl_path)) {
|
||||||
|
+ if (!store || !modssl_X509_STORE_load_locations(store, mctx->crl_file,
|
||||||
|
+ mctx->crl_path)) {
|
||||||
|
ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(01901)
|
||||||
|
"Host %s: unable to configure X.509 CRL storage "
|
||||||
|
"for certificate revocation", mctx->sc->vhost_id);
|
||||||
|
@@ -1267,6 +1304,31 @@
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static APR_INLINE int modssl_DH_bits(DH *dh)
|
||||||
|
+{
|
||||||
|
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||||
|
+ return DH_bits(dh);
|
||||||
|
+#else
|
||||||
|
+ return BN_num_bits(DH_get0_p(dh));
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/* SSL_CTX_use_PrivateKey_file() can fail either because the private
|
||||||
|
+ * key was encrypted, or due to a mismatch between an already-loaded
|
||||||
|
+ * cert and the key - a common misconfiguration - from calling
|
||||||
|
+ * X509_check_private_key(). This macro is passed the last error code
|
||||||
|
+ * off the OpenSSL stack and evaluates to true only for the first
|
||||||
|
+ * case. With OpenSSL < 3 the second case is identifiable by the
|
||||||
|
+ * function code, but function codes are not used from 3.0. */
|
||||||
|
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||||
|
+#define CHECK_PRIVKEY_ERROR(ec) (ERR_GET_FUNC(ec) != X509_F_X509_CHECK_PRIVATE_KEY)
|
||||||
|
+#else
|
||||||
|
+#define CHECK_PRIVKEY_ERROR(ec) (ERR_GET_LIB != ERR_LIB_X509 \
|
||||||
|
+ || (ERR_GET_REASON(ec) != X509_R_KEY_TYPE_MISMATCH \
|
||||||
|
+ && ERR_GET_REASON(ec) != X509_R_KEY_VALUES_MISMATCH \
|
||||||
|
+ && ERR_GET_REASON(ec) != X509_R_UNKNOWN_KEY_TYPE))
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
static apr_status_t ssl_init_server_certs(server_rec *s,
|
||||||
|
apr_pool_t *p,
|
||||||
|
apr_pool_t *ptemp,
|
||||||
|
@@ -1277,7 +1339,7 @@
|
||||||
|
const char *vhost_id = mctx->sc->vhost_id, *key_id, *certfile, *keyfile;
|
||||||
|
int i;
|
||||||
|
X509 *cert;
|
||||||
|
- DH *dhparams;
|
||||||
|
+ DH *dh;
|
||||||
|
#ifdef HAVE_ECC
|
||||||
|
EC_GROUP *ecparams = NULL;
|
||||||
|
int nid;
|
||||||
|
@@ -1372,8 +1434,7 @@
|
||||||
|
}
|
||||||
|
else if ((SSL_CTX_use_PrivateKey_file(mctx->ssl_ctx, keyfile,
|
||||||
|
SSL_FILETYPE_PEM) < 1)
|
||||||
|
- && (ERR_GET_FUNC(ERR_peek_last_error())
|
||||||
|
- != X509_F_X509_CHECK_PRIVATE_KEY)) {
|
||||||
|
+ && CHECK_PRIVKEY_ERROR(ERR_peek_last_error())) {
|
||||||
|
ssl_asn1_t *asn1;
|
||||||
|
const unsigned char *ptr;
|
||||||
|
|
||||||
|
@@ -1462,13 +1523,22 @@
|
||||||
|
*/
|
||||||
|
certfile = APR_ARRAY_IDX(mctx->pks->cert_files, 0, const char *);
|
||||||
|
if (certfile && !modssl_is_engine_id(certfile)
|
||||||
|
- && (dhparams = ssl_dh_GetParamFromFile(certfile))) {
|
||||||
|
- SSL_CTX_set_tmp_dh(mctx->ssl_ctx, dhparams);
|
||||||
|
+ && (dh = ssl_dh_GetParamFromFile(certfile))) {
|
||||||
|
+ /* ### This should be replaced with SSL_CTX_set0_tmp_dh_pkey()
|
||||||
|
+ * for OpenSSL 3.0+. */
|
||||||
|
+ SSL_CTX_set_tmp_dh(mctx->ssl_ctx, dh);
|
||||||
|
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(02540)
|
||||||
|
"Custom DH parameters (%d bits) for %s loaded from %s",
|
||||||
|
- DH_bits(dhparams), vhost_id, certfile);
|
||||||
|
- DH_free(dhparams);
|
||||||
|
+ modssl_DH_bits(dh), vhost_id, certfile);
|
||||||
|
+ DH_free(dh);
|
||||||
|
}
|
||||||
|
+#if !MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||||
|
+ else {
|
||||||
|
+ /* If no parameter is manually configured, enable auto
|
||||||
|
+ * selection. */
|
||||||
|
+ SSL_CTX_set_dh_auto(mctx->ssl_ctx, 1);
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_ECC
|
||||||
|
/*
|
||||||
|
@@ -1518,6 +1588,7 @@
|
||||||
|
char buf[TLSEXT_TICKET_KEY_LEN];
|
||||||
|
char *path;
|
||||||
|
modssl_ticket_key_t *ticket_key = mctx->ticket_key;
|
||||||
|
+ int res;
|
||||||
|
|
||||||
|
if (!ticket_key->file_path) {
|
||||||
|
return APR_SUCCESS;
|
||||||
|
@@ -1545,11 +1616,22 @@
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(ticket_key->key_name, buf, 16);
|
||||||
|
- memcpy(ticket_key->hmac_secret, buf + 16, 16);
|
||||||
|
memcpy(ticket_key->aes_key, buf + 32, 16);
|
||||||
|
-
|
||||||
|
- if (!SSL_CTX_set_tlsext_ticket_key_cb(mctx->ssl_ctx,
|
||||||
|
- ssl_callback_SessionTicket)) {
|
||||||
|
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||||
|
+ memcpy(ticket_key->hmac_secret, buf + 16, 16);
|
||||||
|
+ res = SSL_CTX_set_tlsext_ticket_key_cb(mctx->ssl_ctx,
|
||||||
|
+ ssl_callback_SessionTicket);
|
||||||
|
+#else
|
||||||
|
+ ticket_key->mac_params[0] =
|
||||||
|
+ OSSL_PARAM_construct_octet_string(OSSL_MAC_PARAM_KEY, buf + 16, 16);
|
||||||
|
+ ticket_key->mac_params[1] =
|
||||||
|
+ OSSL_PARAM_construct_utf8_string(OSSL_MAC_PARAM_DIGEST, "sha256", 0);
|
||||||
|
+ ticket_key->mac_params[2] =
|
||||||
|
+ OSSL_PARAM_construct_end();
|
||||||
|
+ res = SSL_CTX_set_tlsext_ticket_key_evp_cb(mctx->ssl_ctx,
|
||||||
|
+ ssl_callback_SessionTicket);
|
||||||
|
+#endif
|
||||||
|
+ if (!res) {
|
||||||
|
ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(01913)
|
||||||
|
"Unable to initialize TLS session ticket key callback "
|
||||||
|
"(incompatible OpenSSL version?)");
|
||||||
|
@@ -1680,7 +1762,7 @@
|
||||||
|
return ssl_die(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
- X509_STORE_load_locations(store, pkp->ca_cert_file, NULL);
|
||||||
|
+ modssl_X509_STORE_load_locations(store, pkp->ca_cert_file, NULL);
|
||||||
|
|
||||||
|
for (n = 0; n < ncerts; n++) {
|
||||||
|
int i;
|
||||||
|
@@ -2277,10 +2359,11 @@
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
-#if !MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||||
|
+#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||||
|
+ free_dh_params();
|
||||||
|
+#else
|
||||||
|
free_bio_methods();
|
||||||
|
#endif
|
||||||
|
- free_dh_params();
|
||||||
|
|
||||||
|
return APR_SUCCESS;
|
||||||
|
}
|
||||||
|
--- httpd-2.4.51/modules/ssl/ssl_engine_io.c.openssl3
|
||||||
|
+++ httpd-2.4.51/modules/ssl/ssl_engine_io.c
|
||||||
|
@@ -194,6 +194,10 @@
|
||||||
|
static int bio_filter_out_read(BIO *bio, char *out, int outl)
|
||||||
|
{
|
||||||
|
/* this is never called */
|
||||||
|
+ bio_filter_out_ctx_t *outctx = (bio_filter_out_ctx_t *)BIO_get_data(bio);
|
||||||
|
+ ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, outctx->c,
|
||||||
|
+ "BUG: %s() should not be called", "bio_filter_out_read");
|
||||||
|
+ AP_DEBUG_ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -293,12 +297,20 @@
|
||||||
|
static int bio_filter_out_gets(BIO *bio, char *buf, int size)
|
||||||
|
{
|
||||||
|
/* this is never called */
|
||||||
|
+ bio_filter_out_ctx_t *outctx = (bio_filter_out_ctx_t *)BIO_get_data(bio);
|
||||||
|
+ ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, outctx->c,
|
||||||
|
+ "BUG: %s() should not be called", "bio_filter_out_gets");
|
||||||
|
+ AP_DEBUG_ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int bio_filter_out_puts(BIO *bio, const char *str)
|
||||||
|
{
|
||||||
|
/* this is never called */
|
||||||
|
+ bio_filter_out_ctx_t *outctx = (bio_filter_out_ctx_t *)BIO_get_data(bio);
|
||||||
|
+ ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, outctx->c,
|
||||||
|
+ "BUG: %s() should not be called", "bio_filter_out_puts");
|
||||||
|
+ AP_DEBUG_ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -533,22 +545,47 @@
|
||||||
|
|
||||||
|
static int bio_filter_in_write(BIO *bio, const char *in, int inl)
|
||||||
|
{
|
||||||
|
+ bio_filter_in_ctx_t *inctx = (bio_filter_in_ctx_t *)BIO_get_data(bio);
|
||||||
|
+ ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, inctx->f->c,
|
||||||
|
+ "BUG: %s() should not be called", "bio_filter_in_write");
|
||||||
|
+ AP_DEBUG_ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int bio_filter_in_puts(BIO *bio, const char *str)
|
||||||
|
{
|
||||||
|
+ bio_filter_in_ctx_t *inctx = (bio_filter_in_ctx_t *)BIO_get_data(bio);
|
||||||
|
+ ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, inctx->f->c,
|
||||||
|
+ "BUG: %s() should not be called", "bio_filter_in_puts");
|
||||||
|
+ AP_DEBUG_ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int bio_filter_in_gets(BIO *bio, char *buf, int size)
|
||||||
|
{
|
||||||
|
+ bio_filter_in_ctx_t *inctx = (bio_filter_in_ctx_t *)BIO_get_data(bio);
|
||||||
|
+ ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, inctx->f->c,
|
||||||
|
+ "BUG: %s() should not be called", "bio_filter_in_gets");
|
||||||
|
+ AP_DEBUG_ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static long bio_filter_in_ctrl(BIO *bio, int cmd, long num, void *ptr)
|
||||||
|
{
|
||||||
|
- return -1;
|
||||||
|
+ bio_filter_in_ctx_t *inctx = (bio_filter_in_ctx_t *)BIO_get_data(bio);
|
||||||
|
+ switch (cmd) {
|
||||||
|
+#ifdef BIO_CTRL_EOF
|
||||||
|
+ case BIO_CTRL_EOF:
|
||||||
|
+ return inctx->rc == APR_EOF;
|
||||||
|
+#endif
|
||||||
|
+ default:
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ ap_log_cerror(APLOG_MARK, APLOG_TRACE1, 0, inctx->f->c,
|
||||||
|
+ "BUG: bio_filter_in_ctrl() should not be called with cmd=%i",
|
||||||
|
+ cmd);
|
||||||
|
+ AP_DEBUG_ASSERT(0);
|
||||||
|
+ return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||||
|
@@ -573,7 +610,7 @@
|
||||||
|
bio_filter_in_read,
|
||||||
|
bio_filter_in_puts, /* puts is never called */
|
||||||
|
bio_filter_in_gets, /* gets is never called */
|
||||||
|
- bio_filter_in_ctrl, /* ctrl is never called */
|
||||||
|
+ bio_filter_in_ctrl, /* ctrl is called for EOF check */
|
||||||
|
bio_filter_create,
|
||||||
|
bio_filter_destroy,
|
||||||
|
NULL
|
||||||
|
--- httpd-2.4.51/modules/ssl/ssl_engine_kernel.c.openssl3
|
||||||
|
+++ httpd-2.4.51/modules/ssl/ssl_engine_kernel.c
|
||||||
|
@@ -1685,6 +1685,7 @@
|
||||||
|
** _________________________________________________________________
|
||||||
|
*/
|
||||||
|
|
||||||
|
+#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||||
|
/*
|
||||||
|
* Hand out standard DH parameters, based on the authentication strength
|
||||||
|
*/
|
||||||
|
@@ -1730,6 +1731,7 @@
|
||||||
|
|
||||||
|
return modssl_get_dh_params(keylen);
|
||||||
|
}
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This OpenSSL callback function is called when OpenSSL
|
||||||
|
@@ -2614,7 +2616,11 @@
|
||||||
|
unsigned char *keyname,
|
||||||
|
unsigned char *iv,
|
||||||
|
EVP_CIPHER_CTX *cipher_ctx,
|
||||||
|
- HMAC_CTX *hctx,
|
||||||
|
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||||
|
+ HMAC_CTX *hmac_ctx,
|
||||||
|
+#else
|
||||||
|
+ EVP_MAC_CTX *mac_ctx,
|
||||||
|
+#endif
|
||||||
|
int mode)
|
||||||
|
{
|
||||||
|
conn_rec *c = (conn_rec *)SSL_get_app_data(ssl);
|
||||||
|
@@ -2640,7 +2646,13 @@
|
||||||
|
}
|
||||||
|
EVP_EncryptInit_ex(cipher_ctx, EVP_aes_128_cbc(), NULL,
|
||||||
|
ticket_key->aes_key, iv);
|
||||||
|
- HMAC_Init_ex(hctx, ticket_key->hmac_secret, 16, tlsext_tick_md(), NULL);
|
||||||
|
+
|
||||||
|
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||||
|
+ HMAC_Init_ex(hmac_ctx, ticket_key->hmac_secret, 16,
|
||||||
|
+ tlsext_tick_md(), NULL);
|
||||||
|
+#else
|
||||||
|
+ EVP_MAC_CTX_set_params(mac_ctx, ticket_key->mac_params);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, c, APLOGNO(02289)
|
||||||
|
"TLS session ticket key for %s successfully set, "
|
||||||
|
@@ -2661,7 +2673,13 @@
|
||||||
|
|
||||||
|
EVP_DecryptInit_ex(cipher_ctx, EVP_aes_128_cbc(), NULL,
|
||||||
|
ticket_key->aes_key, iv);
|
||||||
|
- HMAC_Init_ex(hctx, ticket_key->hmac_secret, 16, tlsext_tick_md(), NULL);
|
||||||
|
+
|
||||||
|
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||||
|
+ HMAC_Init_ex(hmac_ctx, ticket_key->hmac_secret, 16,
|
||||||
|
+ tlsext_tick_md(), NULL);
|
||||||
|
+#else
|
||||||
|
+ EVP_MAC_CTX_set_params(mac_ctx, ticket_key->mac_params);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
ap_log_cerror(APLOG_MARK, APLOG_DEBUG, 0, c, APLOGNO(02290)
|
||||||
|
"TLS session ticket key for %s successfully set, "
|
||||||
|
--- httpd-2.4.51/modules/ssl/ssl_engine_log.c.openssl3
|
||||||
|
+++ httpd-2.4.51/modules/ssl/ssl_engine_log.c
|
||||||
|
@@ -78,6 +78,16 @@
|
||||||
|
return APR_EGENERAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static APR_INLINE
|
||||||
|
+unsigned long modssl_ERR_peek_error_data(const char **data, int *flags)
|
||||||
|
+{
|
||||||
|
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||||
|
+ return ERR_peek_error_line_data(NULL, NULL, data, flags);
|
||||||
|
+#else
|
||||||
|
+ return ERR_peek_error_data(data, flags);
|
||||||
|
+#endif
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Prints the SSL library error information.
|
||||||
|
*/
|
||||||
|
@@ -87,7 +97,7 @@
|
||||||
|
const char *data;
|
||||||
|
int flags;
|
||||||
|
|
||||||
|
- while ((e = ERR_peek_error_line_data(NULL, NULL, &data, &flags))) {
|
||||||
|
+ while ((e = modssl_ERR_peek_error_data(&data, &flags))) {
|
||||||
|
const char *annotation;
|
||||||
|
char err[256];
|
||||||
|
|
||||||
|
--- httpd-2.4.51/modules/ssl/ssl_private.h.openssl3
|
||||||
|
+++ httpd-2.4.51/modules/ssl/ssl_private.h
|
||||||
|
@@ -89,6 +89,9 @@
|
||||||
|
/* must be defined before including ssl.h */
|
||||||
|
#define OPENSSL_NO_SSL_INTERN
|
||||||
|
#endif
|
||||||
|
+#if OPENSSL_VERSION_NUMBER >= 0x30000000
|
||||||
|
+#include <openssl/core_names.h>
|
||||||
|
+#endif
|
||||||
|
#include <openssl/ssl.h>
|
||||||
|
#include <openssl/err.h>
|
||||||
|
#include <openssl/x509.h>
|
||||||
|
@@ -134,13 +137,12 @@
|
||||||
|
SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MIN_PROTO_VERSION, version, NULL)
|
||||||
|
#define SSL_CTX_set_max_proto_version(ctx, version) \
|
||||||
|
SSL_CTX_ctrl(ctx, SSL_CTRL_SET_MAX_PROTO_VERSION, version, NULL)
|
||||||
|
-#elif LIBRESSL_VERSION_NUMBER < 0x2070000f
|
||||||
|
+#endif /* LIBRESSL_VERSION_NUMBER < 0x2060000f */
|
||||||
|
/* LibreSSL before 2.7 declares OPENSSL_VERSION_NUMBER == 2.0 but does not
|
||||||
|
* include most changes from OpenSSL >= 1.1 (new functions, macros,
|
||||||
|
* deprecations, ...), so we have to work around this...
|
||||||
|
*/
|
||||||
|
-#define MODSSL_USE_OPENSSL_PRE_1_1_API (1)
|
||||||
|
-#endif /* LIBRESSL_VERSION_NUMBER < 0x2060000f */
|
||||||
|
+#define MODSSL_USE_OPENSSL_PRE_1_1_API (LIBRESSL_VERSION_NUMBER < 0x2070000f)
|
||||||
|
#else /* defined(LIBRESSL_VERSION_NUMBER) */
|
||||||
|
#define MODSSL_USE_OPENSSL_PRE_1_1_API (OPENSSL_VERSION_NUMBER < 0x10100000L)
|
||||||
|
#endif
|
||||||
|
@@ -681,7 +683,11 @@
|
||||||
|
typedef struct {
|
||||||
|
const char *file_path;
|
||||||
|
unsigned char key_name[16];
|
||||||
|
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||||
|
unsigned char hmac_secret[16];
|
||||||
|
+#else
|
||||||
|
+ OSSL_PARAM mac_params[3];
|
||||||
|
+#endif
|
||||||
|
unsigned char aes_key[16];
|
||||||
|
} modssl_ticket_key_t;
|
||||||
|
#endif
|
||||||
|
@@ -945,8 +951,16 @@
|
||||||
|
int ssl_callback_ClientHello(SSL *, int *, void *);
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_TLS_SESSION_TICKETS
|
||||||
|
-int ssl_callback_SessionTicket(SSL *, unsigned char *, unsigned char *,
|
||||||
|
- EVP_CIPHER_CTX *, HMAC_CTX *, int);
|
||||||
|
+int ssl_callback_SessionTicket(SSL *ssl,
|
||||||
|
+ unsigned char *keyname,
|
||||||
|
+ unsigned char *iv,
|
||||||
|
+ EVP_CIPHER_CTX *cipher_ctx,
|
||||||
|
+#if OPENSSL_VERSION_NUMBER < 0x30000000L
|
||||||
|
+ HMAC_CTX *hmac_ctx,
|
||||||
|
+#else
|
||||||
|
+ EVP_MAC_CTX *mac_ctx,
|
||||||
|
+#endif
|
||||||
|
+ int mode);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_TLS_ALPN
|
||||||
|
@@ -1124,10 +1138,12 @@
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#if MODSSL_USE_OPENSSL_PRE_1_1_API
|
||||||
|
/* Retrieve DH parameters for given key length. Return value should
|
||||||
|
* be treated as unmutable, since it is stored in process-global
|
||||||
|
* memory. */
|
||||||
|
DH *modssl_get_dh_params(unsigned keylen);
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
/* Returns non-zero if the request was made over SSL/TLS. If sslconn
|
||||||
|
* is non-NULL and the request is using SSL/TLS, sets *sslconn to the
|
249
SOURCES/httpd-2.4.51-r1877397.patch
Normal file
249
SOURCES/httpd-2.4.51-r1877397.patch
Normal file
@ -0,0 +1,249 @@
|
|||||||
|
diff --git a/modules/ssl/ssl_engine_init.c b/modules/ssl/ssl_engine_init.c
|
||||||
|
index 211ebff..c8cb1af 100644
|
||||||
|
--- a/modules/ssl/ssl_engine_init.c
|
||||||
|
+++ b/modules/ssl/ssl_engine_init.c
|
||||||
|
@@ -871,6 +871,13 @@ static apr_status_t ssl_init_ctx_protocol(server_rec *s,
|
||||||
|
SSL_CTX_set_keylog_callback(ctx, modssl_callback_keylog);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
+
|
||||||
|
+#ifdef SSL_OP_NO_RENEGOTIATION
|
||||||
|
+ /* For server-side SSL_CTX, disable renegotiation by default.. */
|
||||||
|
+ if (!mctx->pkp) {
|
||||||
|
+ SSL_CTX_set_options(ctx, SSL_OP_NO_RENEGOTIATION);
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
return APR_SUCCESS;
|
||||||
|
}
|
||||||
|
@@ -892,6 +899,14 @@ static void ssl_init_ctx_session_cache(server_rec *s,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+#ifdef SSL_OP_NO_RENEGOTIATION
|
||||||
|
+/* OpenSSL-level renegotiation protection. */
|
||||||
|
+#define MODSSL_BLOCKS_RENEG (0)
|
||||||
|
+#else
|
||||||
|
+/* mod_ssl-level renegotiation protection. */
|
||||||
|
+#define MODSSL_BLOCKS_RENEG (1)
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
static void ssl_init_ctx_callbacks(server_rec *s,
|
||||||
|
apr_pool_t *p,
|
||||||
|
apr_pool_t *ptemp,
|
||||||
|
@@ -905,7 +920,13 @@ static void ssl_init_ctx_callbacks(server_rec *s,
|
||||||
|
SSL_CTX_set_tmp_dh_callback(ctx, ssl_callback_TmpDH);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
- SSL_CTX_set_info_callback(ctx, ssl_callback_Info);
|
||||||
|
+ /* The info callback is used for debug-level tracing. For OpenSSL
|
||||||
|
+ * versions where SSL_OP_NO_RENEGOTIATION is not available, the
|
||||||
|
+ * callback is also used to prevent use of client-initiated
|
||||||
|
+ * renegotiation. Enable it in either case. */
|
||||||
|
+ if (APLOGdebug(s) || MODSSL_BLOCKS_RENEG) {
|
||||||
|
+ SSL_CTX_set_info_callback(ctx, ssl_callback_Info);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
#ifdef HAVE_TLS_ALPN
|
||||||
|
SSL_CTX_set_alpn_select_cb(ctx, ssl_callback_alpn_select, NULL);
|
||||||
|
diff --git a/modules/ssl/ssl_engine_io.c b/modules/ssl/ssl_engine_io.c
|
||||||
|
index 79b9a70..3a0c22a 100644
|
||||||
|
--- a/modules/ssl/ssl_engine_io.c
|
||||||
|
+++ b/modules/ssl/ssl_engine_io.c
|
||||||
|
@@ -209,11 +209,13 @@ static int bio_filter_out_write(BIO *bio, const char *in, int inl)
|
||||||
|
|
||||||
|
BIO_clear_retry_flags(bio);
|
||||||
|
|
||||||
|
+#ifndef SSL_OP_NO_RENEGOTIATION
|
||||||
|
/* Abort early if the client has initiated a renegotiation. */
|
||||||
|
if (outctx->filter_ctx->config->reneg_state == RENEG_ABORT) {
|
||||||
|
outctx->rc = APR_ECONNABORTED;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
ap_log_cerror(APLOG_MARK, APLOG_TRACE6, 0, outctx->c,
|
||||||
|
"bio_filter_out_write: %i bytes", inl);
|
||||||
|
@@ -474,11 +476,13 @@ static int bio_filter_in_read(BIO *bio, char *in, int inlen)
|
||||||
|
|
||||||
|
BIO_clear_retry_flags(bio);
|
||||||
|
|
||||||
|
+#ifndef SSL_OP_NO_RENEGOTIATION
|
||||||
|
/* Abort early if the client has initiated a renegotiation. */
|
||||||
|
if (inctx->filter_ctx->config->reneg_state == RENEG_ABORT) {
|
||||||
|
inctx->rc = APR_ECONNABORTED;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
if (!inctx->bb) {
|
||||||
|
inctx->rc = APR_EOF;
|
||||||
|
diff --git a/modules/ssl/ssl_engine_kernel.c b/modules/ssl/ssl_engine_kernel.c
|
||||||
|
index 591f6ae..8416864 100644
|
||||||
|
--- a/modules/ssl/ssl_engine_kernel.c
|
||||||
|
+++ b/modules/ssl/ssl_engine_kernel.c
|
||||||
|
@@ -992,7 +992,7 @@ static int ssl_hook_Access_classic(request_rec *r, SSLSrvConfigRec *sc, SSLDirCo
|
||||||
|
|
||||||
|
/* Toggle the renegotiation state to allow the new
|
||||||
|
* handshake to proceed. */
|
||||||
|
- sslconn->reneg_state = RENEG_ALLOW;
|
||||||
|
+ modssl_set_reneg_state(sslconn, RENEG_ALLOW);
|
||||||
|
|
||||||
|
SSL_renegotiate(ssl);
|
||||||
|
SSL_do_handshake(ssl);
|
||||||
|
@@ -1019,7 +1019,7 @@ static int ssl_hook_Access_classic(request_rec *r, SSLSrvConfigRec *sc, SSLDirCo
|
||||||
|
*/
|
||||||
|
SSL_peek(ssl, peekbuf, 0);
|
||||||
|
|
||||||
|
- sslconn->reneg_state = RENEG_REJECT;
|
||||||
|
+ modssl_set_reneg_state(sslconn, RENEG_REJECT);
|
||||||
|
|
||||||
|
if (!SSL_is_init_finished(ssl)) {
|
||||||
|
ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, APLOGNO(02261)
|
||||||
|
@@ -1078,7 +1078,7 @@ static int ssl_hook_Access_modern(request_rec *r, SSLSrvConfigRec *sc, SSLDirCon
|
||||||
|
(sc->server->auth.verify_mode != SSL_CVERIFY_UNSET)) {
|
||||||
|
int vmode_inplace, vmode_needed;
|
||||||
|
int change_vmode = FALSE;
|
||||||
|
- int old_state, n, rc;
|
||||||
|
+ int n, rc;
|
||||||
|
|
||||||
|
vmode_inplace = SSL_get_verify_mode(ssl);
|
||||||
|
vmode_needed = SSL_VERIFY_NONE;
|
||||||
|
@@ -1180,8 +1180,6 @@ static int ssl_hook_Access_modern(request_rec *r, SSLSrvConfigRec *sc, SSLDirCon
|
||||||
|
return HTTP_FORBIDDEN;
|
||||||
|
}
|
||||||
|
|
||||||
|
- old_state = sslconn->reneg_state;
|
||||||
|
- sslconn->reneg_state = RENEG_ALLOW;
|
||||||
|
modssl_set_app_data2(ssl, r);
|
||||||
|
|
||||||
|
SSL_do_handshake(ssl);
|
||||||
|
@@ -1191,7 +1189,6 @@ static int ssl_hook_Access_modern(request_rec *r, SSLSrvConfigRec *sc, SSLDirCon
|
||||||
|
*/
|
||||||
|
SSL_peek(ssl, peekbuf, 0);
|
||||||
|
|
||||||
|
- sslconn->reneg_state = old_state;
|
||||||
|
modssl_set_app_data2(ssl, NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -2263,8 +2260,8 @@ static void log_tracing_state(const SSL *ssl, conn_rec *c,
|
||||||
|
/*
|
||||||
|
* This callback function is executed while OpenSSL processes the SSL
|
||||||
|
* handshake and does SSL record layer stuff. It's used to trap
|
||||||
|
- * client-initiated renegotiations, and for dumping everything to the
|
||||||
|
- * log.
|
||||||
|
+ * client-initiated renegotiations (where SSL_OP_NO_RENEGOTIATION is
|
||||||
|
+ * not available), and for dumping everything to the log.
|
||||||
|
*/
|
||||||
|
void ssl_callback_Info(const SSL *ssl, int where, int rc)
|
||||||
|
{
|
||||||
|
@@ -2276,14 +2273,12 @@ void ssl_callback_Info(const SSL *ssl, int where, int rc)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- /* With TLS 1.3 this callback may be called multiple times on the first
|
||||||
|
- * negotiation, so the below logic to detect renegotiations can't work.
|
||||||
|
- * Fortunately renegotiations are forbidden starting with TLS 1.3, and
|
||||||
|
- * this is enforced by OpenSSL so there's nothing to be done here.
|
||||||
|
- */
|
||||||
|
-#if SSL_HAVE_PROTOCOL_TLSV1_3
|
||||||
|
- if (SSL_version(ssl) < TLS1_3_VERSION)
|
||||||
|
-#endif
|
||||||
|
+#ifndef SSL_OP_NO_RENEGOTIATION
|
||||||
|
+ /* With OpenSSL < 1.1.1 (implying TLS v1.2 or earlier), this
|
||||||
|
+ * callback is used to block client-initiated renegotiation. With
|
||||||
|
+ * TLSv1.3 it is unnecessary since renegotiation is forbidden at
|
||||||
|
+ * protocol level. Otherwise (TLSv1.2 with OpenSSL >=1.1.1),
|
||||||
|
+ * SSL_OP_NO_RENEGOTIATION is used to block renegotiation. */
|
||||||
|
{
|
||||||
|
SSLConnRec *sslconn;
|
||||||
|
|
||||||
|
@@ -2308,6 +2303,7 @@ void ssl_callback_Info(const SSL *ssl, int where, int rc)
|
||||||
|
sslconn->reneg_state = RENEG_REJECT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
s = mySrvFromConn(c);
|
||||||
|
if (s && APLOGdebug(s)) {
|
||||||
|
diff --git a/modules/ssl/ssl_private.h b/modules/ssl/ssl_private.h
|
||||||
|
index a329d99..7666c31 100644
|
||||||
|
--- a/modules/ssl/ssl_private.h
|
||||||
|
+++ b/modules/ssl/ssl_private.h
|
||||||
|
@@ -512,6 +512,16 @@ typedef struct {
|
||||||
|
apr_time_t source_mtime;
|
||||||
|
} ssl_asn1_t;
|
||||||
|
|
||||||
|
+typedef enum {
|
||||||
|
+ RENEG_INIT = 0, /* Before initial handshake */
|
||||||
|
+ RENEG_REJECT, /* After initial handshake; any client-initiated
|
||||||
|
+ * renegotiation should be rejected */
|
||||||
|
+ RENEG_ALLOW, /* A server-initiated renegotiation is taking
|
||||||
|
+ * place (as dictated by configuration) */
|
||||||
|
+ RENEG_ABORT /* Renegotiation initiated by client, abort the
|
||||||
|
+ * connection */
|
||||||
|
+} modssl_reneg_state;
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* Define the mod_ssl per-module configuration structure
|
||||||
|
* (i.e. the global configuration for each httpd process)
|
||||||
|
@@ -543,18 +553,13 @@ typedef struct {
|
||||||
|
NON_SSL_SET_ERROR_MSG /* Need to set the error message */
|
||||||
|
} non_ssl_request;
|
||||||
|
|
||||||
|
- /* Track the handshake/renegotiation state for the connection so
|
||||||
|
- * that all client-initiated renegotiations can be rejected, as a
|
||||||
|
- * partial fix for CVE-2009-3555. */
|
||||||
|
- enum {
|
||||||
|
- RENEG_INIT = 0, /* Before initial handshake */
|
||||||
|
- RENEG_REJECT, /* After initial handshake; any client-initiated
|
||||||
|
- * renegotiation should be rejected */
|
||||||
|
- RENEG_ALLOW, /* A server-initiated renegotiation is taking
|
||||||
|
- * place (as dictated by configuration) */
|
||||||
|
- RENEG_ABORT /* Renegotiation initiated by client, abort the
|
||||||
|
- * connection */
|
||||||
|
- } reneg_state;
|
||||||
|
+#ifndef SSL_OP_NO_RENEGOTIATION
|
||||||
|
+ /* For OpenSSL < 1.1.1, track the handshake/renegotiation state
|
||||||
|
+ * for the connection to block client-initiated renegotiations.
|
||||||
|
+ * For OpenSSL >=1.1.1, the SSL_OP_NO_RENEGOTIATION flag is used in
|
||||||
|
+ * the SSL * options state with equivalent effect. */
|
||||||
|
+ modssl_reneg_state reneg_state;
|
||||||
|
+#endif
|
||||||
|
|
||||||
|
server_rec *server;
|
||||||
|
SSLDirConfigRec *dc;
|
||||||
|
@@ -1158,6 +1163,9 @@ int ssl_is_challenge(conn_rec *c, const char *servername,
|
||||||
|
* the configured ENGINE. */
|
||||||
|
int modssl_is_engine_id(const char *name);
|
||||||
|
|
||||||
|
+/* Set the renegotation state for connection. */
|
||||||
|
+void modssl_set_reneg_state(SSLConnRec *sslconn, modssl_reneg_state state);
|
||||||
|
+
|
||||||
|
#endif /* SSL_PRIVATE_H */
|
||||||
|
/** @} */
|
||||||
|
|
||||||
|
diff --git a/modules/ssl/ssl_util_ssl.c b/modules/ssl/ssl_util_ssl.c
|
||||||
|
index 38079a9..dafb833 100644
|
||||||
|
--- a/modules/ssl/ssl_util_ssl.c
|
||||||
|
+++ b/modules/ssl/ssl_util_ssl.c
|
||||||
|
@@ -589,3 +589,19 @@ cleanup:
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+void modssl_set_reneg_state(SSLConnRec *sslconn, modssl_reneg_state state)
|
||||||
|
+{
|
||||||
|
+#ifdef SSL_OP_NO_RENEGOTIATION
|
||||||
|
+ switch (state) {
|
||||||
|
+ case RENEG_ALLOW:
|
||||||
|
+ SSL_clear_options(sslconn->ssl, SSL_OP_NO_RENEGOTIATION);
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ SSL_set_options(sslconn->ssl, SSL_OP_NO_RENEGOTIATION);
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+#else
|
||||||
|
+ sslconn->reneg_state = state;
|
||||||
|
+#endif
|
||||||
|
+}
|
156
SOURCES/httpd-2.4.51-r1892413+.patch
Normal file
156
SOURCES/httpd-2.4.51-r1892413+.patch
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
# ./pullrev.sh 1892413 1895552
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1938740
|
||||||
|
|
||||||
|
http://svn.apache.org/viewvc?view=revision&revision=1892413
|
||||||
|
http://svn.apache.org/viewvc?view=revision&revision=1895552
|
||||||
|
|
||||||
|
- also mod_cgi/mod_cgid log_flags fix from r1881559
|
||||||
|
|
||||||
|
--- httpd-2.4.51/modules/filters/mod_deflate.c.r1892413+
|
||||||
|
+++ httpd-2.4.51/modules/filters/mod_deflate.c
|
||||||
|
@@ -1275,44 +1275,46 @@
|
||||||
|
if (APR_BUCKET_IS_FLUSH(bkt)) {
|
||||||
|
apr_bucket *tmp_b;
|
||||||
|
|
||||||
|
- ctx->inflate_total += ctx->stream.avail_out;
|
||||||
|
- zRC = inflate(&(ctx->stream), Z_SYNC_FLUSH);
|
||||||
|
- ctx->inflate_total -= ctx->stream.avail_out;
|
||||||
|
- if (zRC != Z_OK) {
|
||||||
|
- inflateEnd(&ctx->stream);
|
||||||
|
- ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(01391)
|
||||||
|
- "Zlib error %d inflating data (%s)", zRC,
|
||||||
|
- ctx->stream.msg);
|
||||||
|
- return APR_EGENERAL;
|
||||||
|
- }
|
||||||
|
+ if (!ctx->done) {
|
||||||
|
+ ctx->inflate_total += ctx->stream.avail_out;
|
||||||
|
+ zRC = inflate(&(ctx->stream), Z_SYNC_FLUSH);
|
||||||
|
+ ctx->inflate_total -= ctx->stream.avail_out;
|
||||||
|
+ if (zRC != Z_OK) {
|
||||||
|
+ inflateEnd(&ctx->stream);
|
||||||
|
+ ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(01391)
|
||||||
|
+ "Zlib error %d inflating data (%s)", zRC,
|
||||||
|
+ ctx->stream.msg);
|
||||||
|
+ return APR_EGENERAL;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (inflate_limit && ctx->inflate_total > inflate_limit) {
|
||||||
|
- inflateEnd(&ctx->stream);
|
||||||
|
- ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(02647)
|
||||||
|
- "Inflated content length of %" APR_OFF_T_FMT
|
||||||
|
- " is larger than the configured limit"
|
||||||
|
- " of %" APR_OFF_T_FMT,
|
||||||
|
- ctx->inflate_total, inflate_limit);
|
||||||
|
- return APR_ENOSPC;
|
||||||
|
- }
|
||||||
|
+ if (inflate_limit && ctx->inflate_total > inflate_limit) {
|
||||||
|
+ inflateEnd(&ctx->stream);
|
||||||
|
+ ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(02647)
|
||||||
|
+ "Inflated content length of %" APR_OFF_T_FMT
|
||||||
|
+ " is larger than the configured limit"
|
||||||
|
+ " of %" APR_OFF_T_FMT,
|
||||||
|
+ ctx->inflate_total, inflate_limit);
|
||||||
|
+ return APR_ENOSPC;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (!check_ratio(r, ctx, dc)) {
|
||||||
|
- inflateEnd(&ctx->stream);
|
||||||
|
- ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(02805)
|
||||||
|
- "Inflated content ratio is larger than the "
|
||||||
|
- "configured limit %i by %i time(s)",
|
||||||
|
- dc->ratio_limit, dc->ratio_burst);
|
||||||
|
- return APR_EINVAL;
|
||||||
|
- }
|
||||||
|
+ if (!check_ratio(r, ctx, dc)) {
|
||||||
|
+ inflateEnd(&ctx->stream);
|
||||||
|
+ ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, APLOGNO(02805)
|
||||||
|
+ "Inflated content ratio is larger than the "
|
||||||
|
+ "configured limit %i by %i time(s)",
|
||||||
|
+ dc->ratio_limit, dc->ratio_burst);
|
||||||
|
+ return APR_EINVAL;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- len = c->bufferSize - ctx->stream.avail_out;
|
||||||
|
- ctx->crc = crc32(ctx->crc, (const Bytef *)ctx->buffer, len);
|
||||||
|
- tmp_b = apr_bucket_heap_create((char *)ctx->buffer, len,
|
||||||
|
- NULL, f->c->bucket_alloc);
|
||||||
|
- APR_BRIGADE_INSERT_TAIL(ctx->proc_bb, tmp_b);
|
||||||
|
+ len = c->bufferSize - ctx->stream.avail_out;
|
||||||
|
+ ctx->crc = crc32(ctx->crc, (const Bytef *)ctx->buffer, len);
|
||||||
|
+ tmp_b = apr_bucket_heap_create((char *)ctx->buffer, len,
|
||||||
|
+ NULL, f->c->bucket_alloc);
|
||||||
|
+ APR_BRIGADE_INSERT_TAIL(ctx->proc_bb, tmp_b);
|
||||||
|
|
||||||
|
- ctx->stream.next_out = ctx->buffer;
|
||||||
|
- ctx->stream.avail_out = c->bufferSize;
|
||||||
|
+ ctx->stream.next_out = ctx->buffer;
|
||||||
|
+ ctx->stream.avail_out = c->bufferSize;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
/* Flush everything so far in the returning brigade, but continue
|
||||||
|
* reading should EOS/more follow (don't lose them).
|
||||||
|
--- httpd-2.4.51/modules/generators/mod_cgi.c.r1892413+
|
||||||
|
+++ httpd-2.4.51/modules/generators/mod_cgi.c
|
||||||
|
@@ -191,11 +191,10 @@
|
||||||
|
apr_file_t *f = NULL;
|
||||||
|
apr_finfo_t finfo;
|
||||||
|
char time_str[APR_CTIME_LEN];
|
||||||
|
- int log_flags = rv ? APLOG_ERR : APLOG_ERR;
|
||||||
|
|
||||||
|
/* Intentional no APLOGNO */
|
||||||
|
/* Callee provides APLOGNO in error text */
|
||||||
|
- ap_log_rerror(APLOG_MARK, log_flags, rv, r,
|
||||||
|
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
|
||||||
|
"%s%s: %s", logno ? logno : "", error, r->filename);
|
||||||
|
|
||||||
|
/* XXX Very expensive mainline case! Open, then getfileinfo! */
|
||||||
|
--- httpd-2.4.51/modules/generators/mod_cgid.c.r1892413+
|
||||||
|
+++ httpd-2.4.51/modules/generators/mod_cgid.c
|
||||||
|
@@ -1190,11 +1190,10 @@
|
||||||
|
apr_file_t *f = NULL;
|
||||||
|
struct stat finfo;
|
||||||
|
char time_str[APR_CTIME_LEN];
|
||||||
|
- int log_flags = rv ? APLOG_ERR : APLOG_ERR;
|
||||||
|
|
||||||
|
/* Intentional no APLOGNO */
|
||||||
|
/* Callee provides APLOGNO in error text */
|
||||||
|
- ap_log_rerror(APLOG_MARK, log_flags, rv, r,
|
||||||
|
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
|
||||||
|
"%s: %s", error, r->filename);
|
||||||
|
|
||||||
|
/* XXX Very expensive mainline case! Open, then getfileinfo! */
|
||||||
|
--- httpd-2.4.51/server/mpm_unix.c.r1892413+
|
||||||
|
+++ httpd-2.4.51/server/mpm_unix.c
|
||||||
|
@@ -259,10 +259,12 @@
|
||||||
|
while (cur_extra) {
|
||||||
|
ap_generation_t old_gen;
|
||||||
|
extra_process_t *next = cur_extra->next;
|
||||||
|
+ pid_t pid = cur_extra->pid;
|
||||||
|
|
||||||
|
- if (reclaim_one_pid(cur_extra->pid, action_table[cur_action].action)) {
|
||||||
|
- if (ap_unregister_extra_mpm_process(cur_extra->pid, &old_gen) == 1) {
|
||||||
|
- mpm_callback(-1, cur_extra->pid, old_gen);
|
||||||
|
+ if (reclaim_one_pid(pid, action_table[cur_action].action)) {
|
||||||
|
+ if (ap_unregister_extra_mpm_process(pid, &old_gen) == 1) {
|
||||||
|
+ /* cur_extra dangling pointer from here. */
|
||||||
|
+ mpm_callback(-1, pid, old_gen);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AP_DEBUG_ASSERT(1 == 0);
|
||||||
|
@@ -307,10 +309,12 @@
|
||||||
|
while (cur_extra) {
|
||||||
|
ap_generation_t old_gen;
|
||||||
|
extra_process_t *next = cur_extra->next;
|
||||||
|
+ pid_t pid = cur_extra->pid;
|
||||||
|
|
||||||
|
- if (reclaim_one_pid(cur_extra->pid, DO_NOTHING)) {
|
||||||
|
- if (ap_unregister_extra_mpm_process(cur_extra->pid, &old_gen) == 1) {
|
||||||
|
- mpm_callback(-1, cur_extra->pid, old_gen);
|
||||||
|
+ if (reclaim_one_pid(pid, DO_NOTHING)) {
|
||||||
|
+ if (ap_unregister_extra_mpm_process(pid, &old_gen) == 1) {
|
||||||
|
+ /* cur_extra dangling pointer from here. */
|
||||||
|
+ mpm_callback(-1, pid, old_gen);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
AP_DEBUG_ASSERT(1 == 0);
|
17
SOURCES/httpd-2.4.51.tar.bz2.asc
Normal file
17
SOURCES/httpd-2.4.51.tar.bz2.asc
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
Comment: GPGTools - https://gpgtools.org
|
||||||
|
|
||||||
|
iQIzBAABCgAdFiEEJvUe+agvSstD8ZA+03fJ59GUTGYFAmFe8kEACgkQ03fJ59GU
|
||||||
|
TGatthAAtWzeOD1TCIEvf5f9bAIZDK9vjEEnBZDeYMMrH1wVJGNJm48XP08O/Kbq
|
||||||
|
qhvc9201RUwkAtWEUX811ZBAYd5A8lAqetfmIuCSHerYSOU0CbhvBjKsuIJVIKWD
|
||||||
|
Wo1uPUDWk068V0HBquQtW6AEB4oo16fKPMEr1aOOxFpR+F806daJN1gt3ubPzkNJ
|
||||||
|
rZd4E6dV00eEymeUIfk0BjDqSWKHmUr+08/dtWqc7kGYGcnJzu0e5pr6cc0hOV2o
|
||||||
|
mqYm28F7eMSe5JCnAOd1LnnqtOwV81mZLxiAxR40PoFhV7IoBLo0zAJ99AHxJfA2
|
||||||
|
9RjCmZ/WYtleeDT7mC1cdATHKOPRaubklzK6Ntf7tMaRIO07hnIfIRXQveKG7h+G
|
||||||
|
Og6PGtfR9bwDGrg2f5Dr+R2fwUJO7EL31IxTYQFBUDe2Q82aNIWpdIFdte93nc+S
|
||||||
|
HqjWq3w6zq+jdSm3xvyLB0LLSOguXhcjj5VEqV+aExZPASbf+Q8bG51mSbMQhkaq
|
||||||
|
fEheFcdhu3Sm0x5xQXvEM3gX5XUr8vmrPWaacayPYfS7MinWukV0hXe5/DoYkFTt
|
||||||
|
a1pt6bHcyVfR0tB0Q3bvm59EeaxLVfogb6Eq74RlrfYiCU/Qx7bMUs3tSeIkHGmY
|
||||||
|
cNhpxzc/36i4Cf+fBDPKuJroXYV5wFoQmpnXVLAqRd6jWZcOizY=
|
||||||
|
=f5dx
|
||||||
|
-----END PGP SIGNATURE-----
|
12
SOURCES/httpd-init.service
Normal file
12
SOURCES/httpd-init.service
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=One-time temporary TLS key generation for httpd.service
|
||||||
|
Documentation=man:httpd-init.service(8)
|
||||||
|
|
||||||
|
ConditionPathExists=|!/etc/pki/tls/certs/localhost.crt
|
||||||
|
ConditionPathExists=|!/etc/pki/tls/private/localhost.key
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=no
|
||||||
|
|
||||||
|
ExecStart=/usr/libexec/httpd-ssl-gencerts
|
39
SOURCES/httpd-ssl-gencerts
Executable file
39
SOURCES/httpd-ssl-gencerts
Executable file
@ -0,0 +1,39 @@
|
|||||||
|
#!/usr/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
FQDN=`hostname`
|
||||||
|
ssldotconf=/etc/httpd/conf.d/ssl.conf
|
||||||
|
|
||||||
|
if test -f /etc/pki/tls/certs/localhost.crt -a \
|
||||||
|
-f /etc/pki/tls/private/localhost.key; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test -f /etc/pki/tls/certs/localhost.crt -a \
|
||||||
|
! -f /etc/pki/tls/private/localhost.key; then
|
||||||
|
echo "Missing certificate key!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if test ! -f /etc/pki/tls/certs/localhost.crt -a \
|
||||||
|
-f /etc/pki/tls/private/localhost.key; then
|
||||||
|
echo "Missing certificate, but key is present!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! test -f ${ssldotconf} || \
|
||||||
|
! grep -q '^SSLCertificateFile /etc/pki/tls/certs/localhost.crt' ${ssldotconf} || \
|
||||||
|
! grep -q '^SSLCertificateKeyFile /etc/pki/tls/private/localhost.key' ${ssldotconf}; then
|
||||||
|
# Non-default configuration, do nothing.
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
sscg -q \
|
||||||
|
--cert-file /etc/pki/tls/certs/localhost.crt \
|
||||||
|
--cert-key-file /etc/pki/tls/private/localhost.key \
|
||||||
|
--ca-file /etc/pki/tls/certs/localhost.crt \
|
||||||
|
--lifetime 365 \
|
||||||
|
--hostname $FQDN \
|
||||||
|
--email root@$FQDN
|
||||||
|
|
3
SOURCES/httpd-ssl-pass-dialog
Executable file
3
SOURCES/httpd-ssl-pass-dialog
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
exec /bin/systemd-ask-password "Enter TLS private key passphrase for $1 ($2) : "
|
358
SOURCES/httpd.conf
Normal file
358
SOURCES/httpd.conf
Normal file
@ -0,0 +1,358 @@
|
|||||||
|
#
|
||||||
|
# This is the main Apache HTTP server configuration file. It contains the
|
||||||
|
# configuration directives that give the server its instructions.
|
||||||
|
# See <URL:http://httpd.apache.org/docs/2.4/> for detailed information.
|
||||||
|
# In particular, see
|
||||||
|
# <URL:http://httpd.apache.org/docs/2.4/mod/directives.html>
|
||||||
|
# for a discussion of each configuration directive.
|
||||||
|
#
|
||||||
|
# See the httpd.conf(5) man page for more information on this configuration,
|
||||||
|
# and httpd.service(8) on using and configuring the httpd service.
|
||||||
|
#
|
||||||
|
# Do NOT simply read the instructions in here without understanding
|
||||||
|
# what they do. They're here only as hints or reminders. If you are unsure
|
||||||
|
# consult the online docs. You have been warned.
|
||||||
|
#
|
||||||
|
# Configuration and logfile names: If the filenames you specify for many
|
||||||
|
# of the server's control files begin with "/" (or "drive:/" for Win32), the
|
||||||
|
# server will use that explicit path. If the filenames do *not* begin
|
||||||
|
# with "/", the value of ServerRoot is prepended -- so 'log/access_log'
|
||||||
|
# with ServerRoot set to '/www' will be interpreted by the
|
||||||
|
# server as '/www/log/access_log', where as '/log/access_log' will be
|
||||||
|
# interpreted as '/log/access_log'.
|
||||||
|
|
||||||
|
#
|
||||||
|
# ServerRoot: The top of the directory tree under which the server's
|
||||||
|
# configuration, error, and log files are kept.
|
||||||
|
#
|
||||||
|
# Do not add a slash at the end of the directory path. If you point
|
||||||
|
# ServerRoot at a non-local disk, be sure to specify a local disk on the
|
||||||
|
# Mutex directive, if file-based mutexes are used. If you wish to share the
|
||||||
|
# same ServerRoot for multiple httpd daemons, you will need to change at
|
||||||
|
# least PidFile.
|
||||||
|
#
|
||||||
|
ServerRoot "/etc/httpd"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Listen: Allows you to bind Apache to specific IP addresses and/or
|
||||||
|
# ports, instead of the default. See also the <VirtualHost>
|
||||||
|
# directive.
|
||||||
|
#
|
||||||
|
# Change this to Listen on a specific IP address, but note that if
|
||||||
|
# httpd.service is enabled to run at boot time, the address may not be
|
||||||
|
# available when the service starts. See the httpd.service(8) man
|
||||||
|
# page for more information.
|
||||||
|
#
|
||||||
|
#Listen 12.34.56.78:80
|
||||||
|
Listen 80
|
||||||
|
|
||||||
|
#
|
||||||
|
# Dynamic Shared Object (DSO) Support
|
||||||
|
#
|
||||||
|
# To be able to use the functionality of a module which was built as a DSO you
|
||||||
|
# have to place corresponding `LoadModule' lines at this location so the
|
||||||
|
# directives contained in it are actually available _before_ they are used.
|
||||||
|
# Statically compiled modules (those listed by `httpd -l') do not need
|
||||||
|
# to be loaded here.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
# LoadModule foo_module modules/mod_foo.so
|
||||||
|
#
|
||||||
|
Include conf.modules.d/*.conf
|
||||||
|
|
||||||
|
#
|
||||||
|
# If you wish httpd to run as a different user or group, you must run
|
||||||
|
# httpd as root initially and it will switch.
|
||||||
|
#
|
||||||
|
# User/Group: The name (or #number) of the user/group to run httpd as.
|
||||||
|
# It is usually good practice to create a dedicated user and group for
|
||||||
|
# running httpd, as with most system services.
|
||||||
|
#
|
||||||
|
User apache
|
||||||
|
Group apache
|
||||||
|
|
||||||
|
# 'Main' server configuration
|
||||||
|
#
|
||||||
|
# The directives in this section set up the values used by the 'main'
|
||||||
|
# server, which responds to any requests that aren't handled by a
|
||||||
|
# <VirtualHost> definition. These values also provide defaults for
|
||||||
|
# any <VirtualHost> containers you may define later in the file.
|
||||||
|
#
|
||||||
|
# All of these directives may appear inside <VirtualHost> containers,
|
||||||
|
# in which case these default settings will be overridden for the
|
||||||
|
# virtual host being defined.
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# ServerAdmin: Your address, where problems with the server should be
|
||||||
|
# e-mailed. This address appears on some server-generated pages, such
|
||||||
|
# as error documents. e.g. admin@your-domain.com
|
||||||
|
#
|
||||||
|
ServerAdmin root@localhost
|
||||||
|
|
||||||
|
#
|
||||||
|
# ServerName gives the name and port that the server uses to identify itself.
|
||||||
|
# This can often be determined automatically, but we recommend you specify
|
||||||
|
# it explicitly to prevent problems during startup.
|
||||||
|
#
|
||||||
|
# If your host doesn't have a registered DNS name, enter its IP address here.
|
||||||
|
#
|
||||||
|
#ServerName www.example.com:80
|
||||||
|
|
||||||
|
#
|
||||||
|
# Deny access to the entirety of your server's filesystem. You must
|
||||||
|
# explicitly permit access to web content directories in other
|
||||||
|
# <Directory> blocks below.
|
||||||
|
#
|
||||||
|
<Directory />
|
||||||
|
AllowOverride none
|
||||||
|
Require all denied
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
#
|
||||||
|
# Note that from this point forward you must specifically allow
|
||||||
|
# particular features to be enabled - so if something's not working as
|
||||||
|
# you might expect, make sure that you have specifically enabled it
|
||||||
|
# below.
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# DocumentRoot: The directory out of which you will serve your
|
||||||
|
# documents. By default, all requests are taken from this directory, but
|
||||||
|
# symbolic links and aliases may be used to point to other locations.
|
||||||
|
#
|
||||||
|
DocumentRoot "/var/www/html"
|
||||||
|
|
||||||
|
#
|
||||||
|
# Relax access to content within /var/www.
|
||||||
|
#
|
||||||
|
<Directory "/var/www">
|
||||||
|
AllowOverride None
|
||||||
|
# Allow open access:
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
# Further relax access to the default document root:
|
||||||
|
<Directory "/var/www/html">
|
||||||
|
#
|
||||||
|
# Possible values for the Options directive are "None", "All",
|
||||||
|
# or any combination of:
|
||||||
|
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
|
||||||
|
#
|
||||||
|
# Note that "MultiViews" must be named *explicitly* --- "Options All"
|
||||||
|
# doesn't give it to you.
|
||||||
|
#
|
||||||
|
# The Options directive is both complicated and important. Please see
|
||||||
|
# http://httpd.apache.org/docs/2.4/mod/core.html#options
|
||||||
|
# for more information.
|
||||||
|
#
|
||||||
|
Options Indexes FollowSymLinks
|
||||||
|
|
||||||
|
#
|
||||||
|
# AllowOverride controls what directives may be placed in .htaccess files.
|
||||||
|
# It can be "All", "None", or any combination of the keywords:
|
||||||
|
# Options FileInfo AuthConfig Limit
|
||||||
|
#
|
||||||
|
AllowOverride None
|
||||||
|
|
||||||
|
#
|
||||||
|
# Controls who can get stuff from this server.
|
||||||
|
#
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
#
|
||||||
|
# DirectoryIndex: sets the file that Apache will serve if a directory
|
||||||
|
# is requested.
|
||||||
|
#
|
||||||
|
<IfModule dir_module>
|
||||||
|
DirectoryIndex index.html
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
#
|
||||||
|
# The following lines prevent .htaccess and .htpasswd files from being
|
||||||
|
# viewed by Web clients.
|
||||||
|
#
|
||||||
|
<Files ".ht*">
|
||||||
|
Require all denied
|
||||||
|
</Files>
|
||||||
|
|
||||||
|
#
|
||||||
|
# ErrorLog: The location of the error log file.
|
||||||
|
# If you do not specify an ErrorLog directive within a <VirtualHost>
|
||||||
|
# container, error messages relating to that virtual host will be
|
||||||
|
# logged here. If you *do* define an error logfile for a <VirtualHost>
|
||||||
|
# container, that host's errors will be logged there and not here.
|
||||||
|
#
|
||||||
|
ErrorLog "logs/error_log"
|
||||||
|
|
||||||
|
#
|
||||||
|
# LogLevel: Control the number of messages logged to the error_log.
|
||||||
|
# Possible values include: debug, info, notice, warn, error, crit,
|
||||||
|
# alert, emerg.
|
||||||
|
#
|
||||||
|
LogLevel warn
|
||||||
|
|
||||||
|
<IfModule log_config_module>
|
||||||
|
#
|
||||||
|
# The following directives define some format nicknames for use with
|
||||||
|
# a CustomLog directive (see below).
|
||||||
|
#
|
||||||
|
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
|
||||||
|
LogFormat "%h %l %u %t \"%r\" %>s %b" common
|
||||||
|
|
||||||
|
<IfModule logio_module>
|
||||||
|
# You need to enable mod_logio.c to use %I and %O
|
||||||
|
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
#
|
||||||
|
# The location and format of the access logfile (Common Logfile Format).
|
||||||
|
# If you do not define any access logfiles within a <VirtualHost>
|
||||||
|
# container, they will be logged here. Contrariwise, if you *do*
|
||||||
|
# define per-<VirtualHost> access logfiles, transactions will be
|
||||||
|
# logged therein and *not* in this file.
|
||||||
|
#
|
||||||
|
#CustomLog "logs/access_log" common
|
||||||
|
|
||||||
|
#
|
||||||
|
# If you prefer a logfile with access, agent, and referer information
|
||||||
|
# (Combined Logfile Format) you can use the following directive.
|
||||||
|
#
|
||||||
|
CustomLog "logs/access_log" combined
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
<IfModule alias_module>
|
||||||
|
#
|
||||||
|
# Redirect: Allows you to tell clients about documents that used to
|
||||||
|
# exist in your server's namespace, but do not anymore. The client
|
||||||
|
# will make a new request for the document at its new location.
|
||||||
|
# Example:
|
||||||
|
# Redirect permanent /foo http://www.example.com/bar
|
||||||
|
|
||||||
|
#
|
||||||
|
# Alias: Maps web paths into filesystem paths and is used to
|
||||||
|
# access content that does not live under the DocumentRoot.
|
||||||
|
# Example:
|
||||||
|
# Alias /webpath /full/filesystem/path
|
||||||
|
#
|
||||||
|
# If you include a trailing / on /webpath then the server will
|
||||||
|
# require it to be present in the URL. You will also likely
|
||||||
|
# need to provide a <Directory> section to allow access to
|
||||||
|
# the filesystem path.
|
||||||
|
|
||||||
|
#
|
||||||
|
# ScriptAlias: This controls which directories contain server scripts.
|
||||||
|
# ScriptAliases are essentially the same as Aliases, except that
|
||||||
|
# documents in the target directory are treated as applications and
|
||||||
|
# run by the server when requested rather than as documents sent to the
|
||||||
|
# client. The same rules about trailing "/" apply to ScriptAlias
|
||||||
|
# directives as to Alias.
|
||||||
|
#
|
||||||
|
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
|
||||||
|
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
#
|
||||||
|
# "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
|
||||||
|
# CGI directory exists, if you have that configured.
|
||||||
|
#
|
||||||
|
<Directory "/var/www/cgi-bin">
|
||||||
|
AllowOverride None
|
||||||
|
Options None
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
<IfModule mime_module>
|
||||||
|
#
|
||||||
|
# TypesConfig points to the file containing the list of mappings from
|
||||||
|
# filename extension to MIME-type.
|
||||||
|
#
|
||||||
|
TypesConfig /etc/mime.types
|
||||||
|
|
||||||
|
#
|
||||||
|
# AddType allows you to add to or override the MIME configuration
|
||||||
|
# file specified in TypesConfig for specific file types.
|
||||||
|
#
|
||||||
|
#AddType application/x-gzip .tgz
|
||||||
|
#
|
||||||
|
# AddEncoding allows you to have certain browsers uncompress
|
||||||
|
# information on the fly. Note: Not all browsers support this.
|
||||||
|
#
|
||||||
|
#AddEncoding x-compress .Z
|
||||||
|
#AddEncoding x-gzip .gz .tgz
|
||||||
|
#
|
||||||
|
# If the AddEncoding directives above are commented-out, then you
|
||||||
|
# probably should define those extensions to indicate media types:
|
||||||
|
#
|
||||||
|
AddType application/x-compress .Z
|
||||||
|
AddType application/x-gzip .gz .tgz
|
||||||
|
|
||||||
|
#
|
||||||
|
# AddHandler allows you to map certain file extensions to "handlers":
|
||||||
|
# actions unrelated to filetype. These can be either built into the server
|
||||||
|
# or added with the Action directive (see below)
|
||||||
|
#
|
||||||
|
# To use CGI scripts outside of ScriptAliased directories:
|
||||||
|
# (You will also need to add "ExecCGI" to the "Options" directive.)
|
||||||
|
#
|
||||||
|
#AddHandler cgi-script .cgi
|
||||||
|
|
||||||
|
# For type maps (negotiated resources):
|
||||||
|
#AddHandler type-map var
|
||||||
|
|
||||||
|
#
|
||||||
|
# Filters allow you to process content before it is sent to the client.
|
||||||
|
#
|
||||||
|
# To parse .shtml files for server-side includes (SSI):
|
||||||
|
# (You will also need to add "Includes" to the "Options" directive.)
|
||||||
|
#
|
||||||
|
AddType text/html .shtml
|
||||||
|
AddOutputFilter INCLUDES .shtml
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
#
|
||||||
|
# Specify a default charset for all content served; this enables
|
||||||
|
# interpretation of all content as UTF-8 by default. To use the
|
||||||
|
# default browser choice (ISO-8859-1), or to allow the META tags
|
||||||
|
# in HTML content to override this choice, comment out this
|
||||||
|
# directive:
|
||||||
|
#
|
||||||
|
AddDefaultCharset UTF-8
|
||||||
|
|
||||||
|
<IfModule mime_magic_module>
|
||||||
|
#
|
||||||
|
# The mod_mime_magic module allows the server to use various hints from the
|
||||||
|
# contents of the file itself to determine its type. The MIMEMagicFile
|
||||||
|
# directive tells the module where the hint definitions are located.
|
||||||
|
#
|
||||||
|
MIMEMagicFile conf/magic
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
#
|
||||||
|
# Customizable error responses come in three flavors:
|
||||||
|
# 1) plain text 2) local redirects 3) external redirects
|
||||||
|
#
|
||||||
|
# Some examples:
|
||||||
|
#ErrorDocument 500 "The server made a boo boo."
|
||||||
|
#ErrorDocument 404 /missing.html
|
||||||
|
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
|
||||||
|
#ErrorDocument 402 http://www.example.com/subscription_info.html
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# EnableMMAP and EnableSendfile: On systems that support it,
|
||||||
|
# memory-mapping or the sendfile syscall may be used to deliver
|
||||||
|
# files. This usually improves server performance, but must
|
||||||
|
# be turned off when serving from networked-mounted
|
||||||
|
# filesystems or if support for these functions is otherwise
|
||||||
|
# broken on your system.
|
||||||
|
# Defaults if commented: EnableMMAP On, EnableSendfile Off
|
||||||
|
#
|
||||||
|
#EnableMMAP off
|
||||||
|
EnableSendfile on
|
||||||
|
|
||||||
|
# Supplemental configuration
|
||||||
|
#
|
||||||
|
# Load config files in the "/etc/httpd/conf.d" directory, if any.
|
||||||
|
IncludeOptional conf.d/*.conf
|
259
SOURCES/httpd.conf.xml
Normal file
259
SOURCES/httpd.conf.xml
Normal file
@ -0,0 +1,259 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
|
||||||
|
|
||||||
|
]>
|
||||||
|
<!--
|
||||||
|
Copyright 2018 Red Hat, Inc.
|
||||||
|
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<refentry>
|
||||||
|
<refentryinfo>
|
||||||
|
<title>httpd.conf</title>
|
||||||
|
<productname>httpd</productname>
|
||||||
|
<author><contrib>Author</contrib><surname>Orton</surname><firstname>Joe</firstname><email>jorton@redhat.com</email></author>
|
||||||
|
</refentryinfo>
|
||||||
|
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>httpd.conf</refentrytitle>
|
||||||
|
<manvolnum>5</manvolnum>
|
||||||
|
</refmeta>
|
||||||
|
|
||||||
|
<refnamediv>
|
||||||
|
<refname>httpd.conf</refname>
|
||||||
|
<refpurpose>Configuration files for httpd</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<para>
|
||||||
|
<filename>/etc/httpd/conf/httpd.conf</filename>,
|
||||||
|
<filename>/etc/httpd/conf.modules.d</filename>,
|
||||||
|
<filename>/etc/httpd/conf.d</filename>
|
||||||
|
</para>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Description</title>
|
||||||
|
|
||||||
|
<para>The main configuration file for the <command>httpd</command> daemon is
|
||||||
|
<filename>/etc/httpd/conf/httpd.conf</filename>. The syntax of
|
||||||
|
this file is described at <ulink
|
||||||
|
url="https://httpd.apache.org/docs/2.4/configuring.html"/>, and
|
||||||
|
the full set of available directives is listed at <ulink
|
||||||
|
url="https://httpd.apache.org/docs/2.4/mod/directives.html"/>.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Configuration structure</title>
|
||||||
|
|
||||||
|
<para>The main configuration file
|
||||||
|
(<filename>httpd.conf</filename>) sets up various defaults and
|
||||||
|
includes configuration files from two directories -
|
||||||
|
<filename>/etc/httpd/conf.modules.d</filename> and
|
||||||
|
<filename>/etc/httpd/conf.d</filename>. Packages containing
|
||||||
|
loadable modules (like <option>mod_ssl.so</option>) place files
|
||||||
|
in the <filename>conf.modules.d</filename> directory with the
|
||||||
|
appropriate <option>LoadModule</option> directive so that module
|
||||||
|
is loaded by default.</para>
|
||||||
|
|
||||||
|
<para>Some notable configured defaults are:</para>
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>DocumentRoot @DOCROOT@/html</option></term>
|
||||||
|
<listitem><para>The default document root from which content
|
||||||
|
is served.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>Listen 80</option></term>
|
||||||
|
<listitem><para>The daemon listens on TCP port 80.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>ErrorLog "logs/error_log"</option></term>
|
||||||
|
<listitem><para>Error messages are logged to
|
||||||
|
<filename>@LOGDIR@/error_log</filename>.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
<varlistentry>
|
||||||
|
<term><option>ScriptAlias /cgi-bin/ "@DOCROOT@/cgi-bin/"</option></term>
|
||||||
|
<listitem><para>CGI scripts are served via the URL-path <option>/cgi-bin/</option>.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
</variablelist>
|
||||||
|
|
||||||
|
<para>To remove any of the default configuration provided in
|
||||||
|
separate files covered below, replace that file with an empty
|
||||||
|
file rather than removing it from the filesystem, otherwise it
|
||||||
|
may be restored to the original when the package which provides
|
||||||
|
it is upgraded.</para>
|
||||||
|
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>MPM configuration</title>
|
||||||
|
|
||||||
|
<para>The configuration file at
|
||||||
|
<filename>/etc/httpd/conf.modules.d/00-mpm.conf</filename> is
|
||||||
|
used to select the multi-processing module (MPM), which governs
|
||||||
|
how <command>httpd</command> divides work between processes
|
||||||
|
and/or threads at run-time. Exactly one
|
||||||
|
<option>LoadModule</option> directive must be uncommented in
|
||||||
|
this file; by default the <option>@MPM@</option> MPM is enabled.
|
||||||
|
For more information on MPMs, see <ulink
|
||||||
|
url="https://httpd.apache.org/docs/2.4/mpm.html"/>.</para>
|
||||||
|
|
||||||
|
<para>If using the <emphasis>prefork</emphasis> MPM, the
|
||||||
|
"httpd_graceful_shutdown" SELinux boolean should also be
|
||||||
|
enabled, since with this MPM, httpd needs to establish TCP
|
||||||
|
connections to local ports to successfully complete a graceful
|
||||||
|
restart or shutdown. This boolean can be enabled by running the
|
||||||
|
command: <command>semanage boolean -m --on
|
||||||
|
httpd_graceful_shutdown</command></para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Module configuration files</title>
|
||||||
|
|
||||||
|
<para>Module configuration files are provided in the
|
||||||
|
<filename>/etc/httpd/conf.modules.d/</filename> directory.
|
||||||
|
Filenames in this directory are by convention prefixed with two
|
||||||
|
digit numeric prefix to ensure they are processed in the desired
|
||||||
|
order. Core modules provided with the <command>httpd</command>
|
||||||
|
package are loaded by files with a <option>0x-</option> prefix
|
||||||
|
to ensure these load first. Only filenames with a
|
||||||
|
<option>.conf</option> suffix in this directory will be
|
||||||
|
processed.</para>
|
||||||
|
|
||||||
|
<para>Other provided configuration files are listed below.
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>/etc/httpd/conf.modules.d/00-base.conf</filename></term>
|
||||||
|
<listitem><para>The set of core modules included with
|
||||||
|
<command>httpd</command> which are all loaded by
|
||||||
|
default.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>/etc/httpd/conf.modules.d/00-optional.conf</filename></term>
|
||||||
|
<listitem><para>The set of non-core modules included with
|
||||||
|
<command>httpd</command> which are <emphasis>not</emphasis>
|
||||||
|
loaded by default.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>/etc/httpd/conf.modules.d/00-systemd.conf</filename></term>
|
||||||
|
<listitem><para>This file loads <option>mod_systemd</option>
|
||||||
|
which is necessary for the correct operation of the
|
||||||
|
<command>httpd.service</command> systemd unit, and should
|
||||||
|
not be removed or disabled.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
</variablelist>
|
||||||
|
</para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Other configuration files</title>
|
||||||
|
|
||||||
|
<para>Default module configuration files and site-specific
|
||||||
|
configuration files are loaded from the
|
||||||
|
<filename>/etc/httpd/conf.d/</filename> directory. Only files
|
||||||
|
with a <option>.conf</option> suffix will be loaded. The
|
||||||
|
following files are provided:
|
||||||
|
|
||||||
|
<variablelist>
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>/etc/httpd/conf.d/userdir.conf</filename></term>
|
||||||
|
<listitem><para>This file gives an example configuration for
|
||||||
|
<option>mod_userdir</option> to map URLs such as
|
||||||
|
<option>http://localhost/~jim/</option> to
|
||||||
|
<filename>/home/jim/public_html/</filename>. Userdir mapping
|
||||||
|
is disabled by default.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>/etc/httpd/conf.d/autoindex.conf</filename></term>
|
||||||
|
<listitem><para>This file provides the default configuration
|
||||||
|
for <option>mod_autoindex</option> which generates HTML
|
||||||
|
directory listings when enabled. It also makes file icon
|
||||||
|
image files available at the <option>/icons/</option>
|
||||||
|
URL-path.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>/etc/httpd/conf.d/welcome.conf</filename></term>
|
||||||
|
<listitem><para>This file enables a "welcome page" at
|
||||||
|
<option>http://localhost/</option> if no content is present
|
||||||
|
in the default documentation root
|
||||||
|
<filename>/var/www/html</filename>.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
<varlistentry>
|
||||||
|
<term><filename>/etc/httpd/conf.d/ssl.conf</filename> (present only if <option>mod_ssl</option> is installed)</term>
|
||||||
|
<listitem><para>This file configures a TLS
|
||||||
|
<option>VirtualHost</option> listening on port
|
||||||
|
<option>443</option>. If the default configuration is used,
|
||||||
|
the referenced test certificate and private key are
|
||||||
|
generated the first time <command>httpd.service</command> is
|
||||||
|
started; see
|
||||||
|
<citerefentry><refentrytitle>httpd-init.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>
|
||||||
|
for more information.</para></listitem>
|
||||||
|
</varlistentry>
|
||||||
|
|
||||||
|
</variablelist></para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Instantiated services</title>
|
||||||
|
|
||||||
|
<para>As an alternative to (or in addition to) the
|
||||||
|
<command>httpd.service</command> unit, the instantiated template
|
||||||
|
service <command>httpd@.service</command> unit file can be used,
|
||||||
|
which starts <command>httpd</command> using a different
|
||||||
|
configuration file to the default. For example,
|
||||||
|
<command>systemctl start httpd@foobar.service</command> will
|
||||||
|
start httpd using the configuration file
|
||||||
|
<filename>/etc/httpd/conf/foobar.conf</filename>. See <citerefentry><refentrytitle>httpd@.service</refentrytitle><manvolnum>8</manvolnum></citerefentry> for more information.</para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
</refsect1>
|
||||||
|
<refsect1>
|
||||||
|
<title>Files</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
<filename>/etc/httpd/conf/httpd.conf</filename>,
|
||||||
|
<filename>/etc/httpd/conf.d</filename>,
|
||||||
|
<filename>/etc/httpd/conf.modules.d</filename>
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>See also</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
<citerefentry><refentrytitle>httpd</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>httpd.service</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
<ulink url="https://httpd.apache.org/docs/2.4/configuring.html"/>,
|
||||||
|
<ulink url="https://httpd.apache.org/docs/2.4/mod/directives.html"/>
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
</refentry>
|
||||||
|
|
||||||
|
<!-- LocalWords: systemd PidFile
|
||||||
|
-->
|
11
SOURCES/httpd.logrotate
Normal file
11
SOURCES/httpd.logrotate
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Note that logs are not compressed unless "compress" is configured,
|
||||||
|
# which can be done either here or globally in /etc/logrotate.conf.
|
||||||
|
/var/log/httpd/*log {
|
||||||
|
missingok
|
||||||
|
notifempty
|
||||||
|
sharedscripts
|
||||||
|
delaycompress
|
||||||
|
postrotate
|
||||||
|
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
|
||||||
|
endscript
|
||||||
|
}
|
33
SOURCES/httpd.service
Normal file
33
SOURCES/httpd.service
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# See httpd.service(8) for more information on using the httpd service.
|
||||||
|
|
||||||
|
# Modifying this file in-place is not recommended, because changes
|
||||||
|
# will be overwritten during package upgrades. To customize the
|
||||||
|
# behaviour, run "systemctl edit httpd" to create an override unit.
|
||||||
|
|
||||||
|
# For example, to pass additional options (such as -D definitions) to
|
||||||
|
# the httpd binary at startup, create an override unit (as is done by
|
||||||
|
# systemctl edit) and enter the following:
|
||||||
|
|
||||||
|
# [Service]
|
||||||
|
# Environment=OPTIONS=-DMY_DEFINE
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=The Apache HTTP Server
|
||||||
|
Wants=httpd-init.service
|
||||||
|
After=network.target remote-fs.target nss-lookup.target httpd-init.service
|
||||||
|
Documentation=man:httpd.service(8)
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
Environment=LANG=C
|
||||||
|
|
||||||
|
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
|
||||||
|
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
|
||||||
|
# Send SIGWINCH for graceful stop
|
||||||
|
KillSignal=SIGWINCH
|
||||||
|
KillMode=mixed
|
||||||
|
PrivateTmp=true
|
||||||
|
OOMPolicy=continue
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
374
SOURCES/httpd.service.xml
Normal file
374
SOURCES/httpd.service.xml
Normal file
@ -0,0 +1,374 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
|
||||||
|
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
|
||||||
|
|
||||||
|
]>
|
||||||
|
<!--
|
||||||
|
Copyright 2018 Red Hat, Inc.
|
||||||
|
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<refentry>
|
||||||
|
<refentryinfo>
|
||||||
|
<title>httpd systemd units</title>
|
||||||
|
<productname>httpd</productname>
|
||||||
|
<author><contrib>Author</contrib><surname>Orton</surname><firstname>Joe</firstname><email>jorton@redhat.com</email></author>
|
||||||
|
</refentryinfo>
|
||||||
|
|
||||||
|
<refmeta>
|
||||||
|
<refentrytitle>httpd.service</refentrytitle>
|
||||||
|
<manvolnum>8</manvolnum>
|
||||||
|
</refmeta>
|
||||||
|
|
||||||
|
<refnamediv>
|
||||||
|
<refname>httpd.service</refname>
|
||||||
|
<refname>httpd@.service</refname>
|
||||||
|
<refname>httpd.socket</refname>
|
||||||
|
<refname>httpd-init.service</refname>
|
||||||
|
<refpurpose>httpd unit files for systemd</refpurpose>
|
||||||
|
</refnamediv>
|
||||||
|
|
||||||
|
<refsynopsisdiv>
|
||||||
|
<para>
|
||||||
|
<filename>/usr/lib/systemd/system/httpd.service</filename>,
|
||||||
|
<filename>/usr/lib/systemd/system/httpd@.service</filename>,
|
||||||
|
<filename>/usr/lib/systemd/system/httpd-init.service</filename>,
|
||||||
|
<filename>/usr/lib/systemd/system/httpd.socket</filename>
|
||||||
|
</para>
|
||||||
|
</refsynopsisdiv>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Description</title>
|
||||||
|
|
||||||
|
<para>This manual page describes the <command>systemd</command>
|
||||||
|
unit files used to integrate the <command>httpd</command> daemon
|
||||||
|
with <command>systemd</command>. Two main unit files are
|
||||||
|
available: <command>httpd.service</command> allows the
|
||||||
|
<command>httpd</command> daemon to be run as a system service, and
|
||||||
|
<command>httpd.socket</command> allows httpd to be started via
|
||||||
|
socket-based activation. Most systems will use
|
||||||
|
<command>httpd.service</command>.</para>
|
||||||
|
|
||||||
|
<para>The <command>apachectl</command> command has been modified
|
||||||
|
to invoke <command>systemctl</command> for most uses, so for
|
||||||
|
example, running <command>apachectl start</command> is equivalent
|
||||||
|
to running <command>systemctl start httpd.service</command>. This
|
||||||
|
ensures that the running httpd daemon is tracked and managed by
|
||||||
|
<command>systemd</command>. In contrast, running
|
||||||
|
<command>httpd</command> directly from a root shell will start the
|
||||||
|
service outside of <command>systemd</command>; in this case,
|
||||||
|
default security restrictions described below (including, but not
|
||||||
|
limited to, SELinux) will not be enforced.</para>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Changing default behaviour</title>
|
||||||
|
|
||||||
|
<para>To change the default behaviour of the httpd service, an
|
||||||
|
<emphasis>over-ride</emphasis> file should be created, rather
|
||||||
|
than changing
|
||||||
|
<filename>/usr/lib/systemd/system/httpd.service</filename>
|
||||||
|
directly, since such changes would be lost over package
|
||||||
|
upgrades. Running <command>systemctl edit
|
||||||
|
httpd.service</command> or <command>systemctl edit
|
||||||
|
httpd.socket</command> as root will create a drop-in file (in
|
||||||
|
the former case, in
|
||||||
|
<filename>/etc/systemd/system/httpd.service.d</filename>) which
|
||||||
|
over-rides the system defaults.</para>
|
||||||
|
|
||||||
|
<para>For example, to set the <option>LD_LIBRARY_PATH</option>
|
||||||
|
environment variable for the daemon, run <command>systemctl edit
|
||||||
|
httpd.service</command> and enter:
|
||||||
|
|
||||||
|
<programlisting>[Service]
|
||||||
|
Environment=LD_LIBRARY_PATH=/opt/vendor/lib</programlisting></para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Starting the service at boot time</title>
|
||||||
|
|
||||||
|
<para>The httpd.service and httpd.socket units are
|
||||||
|
<emphasis>disabled</emphasis> by default. To start the httpd
|
||||||
|
service at boot time, run: <command>systemctl enable
|
||||||
|
httpd.service</command>. In the default configuration, the
|
||||||
|
httpd daemon will accept connections on port 80 (and, if mod_ssl
|
||||||
|
is installed, TLS connections on port 443) for any configured
|
||||||
|
IPv4 or IPv6 address.</para>
|
||||||
|
|
||||||
|
<para>If httpd is configured to depend on any specific IP
|
||||||
|
address (for example, with a "Listen" directive) which may only
|
||||||
|
become available during start-up, or if httpd depends on other
|
||||||
|
services (such as a database daemon), the service
|
||||||
|
<emphasis>must</emphasis> be configured to ensure correct
|
||||||
|
start-up ordering.</para>
|
||||||
|
|
||||||
|
<para>For example, to ensure httpd is only running after all
|
||||||
|
configured network interfaces are configured, create a drop-in
|
||||||
|
file (as described above) with the following section:
|
||||||
|
|
||||||
|
<programlisting>[Unit]
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target</programlisting>
|
||||||
|
|
||||||
|
See <ulink
|
||||||
|
url="https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/"/>
|
||||||
|
for more information on start-up ordering with systemd.</para>
|
||||||
|
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>SSL/TLS certificate generation</title>
|
||||||
|
|
||||||
|
<para>The <command>httpd-init.service</command> unit is provided
|
||||||
|
with the mod_ssl package. This oneshot unit automatically
|
||||||
|
creates a TLS server certificate and key (using a generated
|
||||||
|
self-signed CA certificate and key) for testing purposes before
|
||||||
|
httpd is started. To inhibit certificate generation, use
|
||||||
|
<command>systemctl mask httpd-init.service</command> after
|
||||||
|
installing mod_ssl, and adjust the mod_ssl configuration to use
|
||||||
|
an appropriate certificate and key.</para>
|
||||||
|
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Reloading and stopping the service</title>
|
||||||
|
|
||||||
|
<para>When running <command>systemctl reload
|
||||||
|
httpd.service</command>, a <emphasis>graceful</emphasis>
|
||||||
|
restart is used, which sends a signal to the httpd parent
|
||||||
|
process to reload the configuration and re-open log files. Any
|
||||||
|
children with open connections at the time of reload will
|
||||||
|
terminate only once they have completed serving requests. This
|
||||||
|
prevents users of the server seeing errors (or potentially
|
||||||
|
losing data) due to the reload, but means some there is some
|
||||||
|
delay before any configuration changes take effect for all
|
||||||
|
users.</para>
|
||||||
|
|
||||||
|
<para>Similarly, a <emphasis>graceful stop</emphasis> is used
|
||||||
|
when <command>systemctl stop httpd.service</command> is run,
|
||||||
|
which terminates the server only once active connections have
|
||||||
|
been processed.</para>
|
||||||
|
|
||||||
|
<para>To "ungracefully" stop the server without waiting for
|
||||||
|
requests to complete, use <command>systemctl kill
|
||||||
|
--kill-who=main httpd</command>; similarly to "ungracefully"
|
||||||
|
reload the configuration, use <command>systemctl kill
|
||||||
|
--kill-who=main --signal=HUP httpd</command>.</para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Automated service restarts</title>
|
||||||
|
|
||||||
|
<para>System packages (including the httpd package itself) may
|
||||||
|
restart the httpd service automatically after packages are
|
||||||
|
upgraded, installed, or removed. This is done using the
|
||||||
|
<command>systemctl try-restart httpd.service</command>, which
|
||||||
|
stops then starts the service if it is running.</para>
|
||||||
|
|
||||||
|
<para>To disable automatic restarts, create the file
|
||||||
|
<filename>/etc/sysconfig/httpd-disable-posttrans</filename>.
|
||||||
|
When <command>httpd</command> interfaces are added in an update,
|
||||||
|
it may not be safe to <emphasis>reload</emphasis> a running
|
||||||
|
service after upgrading, if updated modules require interfaces
|
||||||
|
only available in the updated httpd. It is recommended to allow
|
||||||
|
automatic restarts for this reason.</para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Changing the default MPM (Multi-Processing Module)</title>
|
||||||
|
|
||||||
|
<para>httpd offers a choice of multi-processing modules (MPMs),
|
||||||
|
which can be configured in
|
||||||
|
<filename>/etc/httpd/conf.modules.d/00-mpm.conf</filename>.
|
||||||
|
See
|
||||||
|
<citerefentry><refentrytitle>httpd.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
for more information on changing the MPM.</para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>systemd integration and mod_systemd</title>
|
||||||
|
|
||||||
|
<para>The httpd service uses the <option>notify</option> systemd
|
||||||
|
service type. The <literal>mod_systemd</literal> module must be
|
||||||
|
loaded (as in the default configuration) for this to work
|
||||||
|
correctly - the service will fail if this module is not
|
||||||
|
loaded. <literal>mod_systemd</literal> also makes worker and
|
||||||
|
request statistics available when running <command>systemctl status
|
||||||
|
httpd</command>. See
|
||||||
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
for more information on systemd service types.</para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Security and SELinux</title>
|
||||||
|
|
||||||
|
<para>The default SELinux policy restricts the httpd service in
|
||||||
|
various ways. For example, the default policy limits the ports
|
||||||
|
to which httpd can bind (using the <literal>Listen</literal>
|
||||||
|
directive), which parts of the filesystem can be accessed, and
|
||||||
|
whether outgoing TCP connections are possible. Many of these
|
||||||
|
restrictions can be relaxed or adjusted by using
|
||||||
|
<command>semanage</command> to change booleans or other
|
||||||
|
types. See
|
||||||
|
<citerefentry><refentrytitle>httpd_selinux</refentrytitle><manvolnum>8</manvolnum></citerefentry>
|
||||||
|
for more information.</para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Process policies and restrictions</title>
|
||||||
|
|
||||||
|
<para>The httpd service uses the following options:
|
||||||
|
|
||||||
|
<itemizedlist>
|
||||||
|
<listitem><para><emphasis>PrivateTmp</emphasis> is enabled by
|
||||||
|
default. The <filename>/tmp</filename> and
|
||||||
|
<filename>/var/tmp</filename> directories available within the
|
||||||
|
httpd process (and CGI scripts, etc) are not shared by other
|
||||||
|
processes.</para></listitem>
|
||||||
|
|
||||||
|
<listitem><para><emphasis>OOMPolicy</emphasis> is set to
|
||||||
|
<emphasis>continue</emphasis> by default. Under the default
|
||||||
|
Out-of-Memory policy, the entire service will be terminated if
|
||||||
|
any process is killed by the kernel OOM killer. By setting
|
||||||
|
the policy to <emphasis>continue</emphasis>, httpd will
|
||||||
|
continue to run (and recover) if a single child is terminated
|
||||||
|
because of excess memory consumption.</para></listitem>
|
||||||
|
</itemizedlist>
|
||||||
|
|
||||||
|
See
|
||||||
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
and
|
||||||
|
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
for more information.</para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Logging and log file rotation</title>
|
||||||
|
|
||||||
|
<para>The <command>httpd</command> daemon is configured to log
|
||||||
|
to the <filename>/var/log/httpd</filename> directory by default,
|
||||||
|
and a drop-in for <command>logrotate</command> is provided at
|
||||||
|
<filename>/etc/logrotate.d/httpd</filename> to enable log file
|
||||||
|
rotation. The <command>httpd.service</command> systemd unit is
|
||||||
|
reloaded after a <command>logrotate</command> run.</para>
|
||||||
|
|
||||||
|
<para>Log file compression is not enabled by default; since
|
||||||
|
<command>httpd</command> can continue writing to open log files
|
||||||
|
for some time after a reload (graceful restart), if compression
|
||||||
|
is enabled the <literal>delaycompress</literal> option must be
|
||||||
|
present (as in the default) to delay compression of log files to
|
||||||
|
a later rotation run.</para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Socket activation</title>
|
||||||
|
|
||||||
|
<para>Socket activation (see
|
||||||
|
<citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>
|
||||||
|
for more information) can be used with <command>httpd</command>
|
||||||
|
by enabling the <command>httpd.socket</command> unit. The
|
||||||
|
<command>httpd</command> listener configuration must exactly
|
||||||
|
match the <literal>ListenStream</literal> options configured for
|
||||||
|
the <command>httpd.socket</command> unit. The default
|
||||||
|
<command>httpd.socket</command> has a
|
||||||
|
<literal>ListenStream=80</literal> and, if mod_ssl is installed,
|
||||||
|
<literal>ListenStream=443</literal> by a drop-in file. If
|
||||||
|
additional <literal>Listen</literal> directives are added to the
|
||||||
|
httpd configuration, corresponding
|
||||||
|
<literal>ListenStream</literal> options should be added via
|
||||||
|
drop-in files, for example via <command>systemctl edit
|
||||||
|
httpd.socket</command>.</para>
|
||||||
|
|
||||||
|
<para>If using socket activation with httpd, only one listener
|
||||||
|
on any given TCP port is supported; a configuration with both
|
||||||
|
"<literal>Listen 127.0.0.1:80</literal>" and "<literal>Listen
|
||||||
|
192.168.1.2:80</literal>" will not work.</para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
<refsect2>
|
||||||
|
<title>Instantiated services</title>
|
||||||
|
|
||||||
|
<para>The <command>httpd@.service</command> unit is a template
|
||||||
|
for creating instantiated services. An instance of this unit
|
||||||
|
will be started using the configuration file
|
||||||
|
<filename>/etc/httpd/conf/INSTANCE.conf</filename>, where
|
||||||
|
<emphasis>INSTANCE</emphasis> is replaced with the instance
|
||||||
|
name. For example, <command>systemctl start
|
||||||
|
httpd@foobar.service</command> will start httpd using the
|
||||||
|
configuration file
|
||||||
|
<filename>/etc/httpd/conf/foobar.conf</filename>. The
|
||||||
|
<option>HTTPD_INSTANCE</option> environment variable is set to
|
||||||
|
the instance name by the unit and is available for use within
|
||||||
|
the configuration file.</para>
|
||||||
|
|
||||||
|
<para>To allow multiple instances of httpd to run
|
||||||
|
simultaneously, a number of configuration directives must be
|
||||||
|
changed, such as <command>PidFile</command> and
|
||||||
|
<command>DefaultRuntimeDir</command> to pick non-conflicting
|
||||||
|
paths, and <command>Listen</command> to choose different ports.
|
||||||
|
The example configuration file
|
||||||
|
<filename>/usr/share/doc/httpd/instance.conf</filename>
|
||||||
|
demonstrates how to make such changes using the
|
||||||
|
<option>HTTPD_INSTANCE</option> variable.</para>
|
||||||
|
|
||||||
|
<para>It can be useful to configure instances of
|
||||||
|
<command>httpd@.service</command> to reload when
|
||||||
|
<command>httpd.service</command> is reloaded; for example,
|
||||||
|
<command>logrotate</command> will reload only
|
||||||
|
<command>httpd.service</command> when logs are rotated. If this
|
||||||
|
behaviour is required, create a drop-in file for the instance as
|
||||||
|
follows:
|
||||||
|
|
||||||
|
<programlisting>[Unit]
|
||||||
|
ReloadPropagatedFrom=httpd.service</programlisting>
|
||||||
|
|
||||||
|
As with normal units, drop-in files for instances can be created
|
||||||
|
using <command>systemctl edit</command>, e.g. <command>systemctl edit
|
||||||
|
httpd@foobar.service</command>.</para>
|
||||||
|
</refsect2>
|
||||||
|
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>Files</title>
|
||||||
|
|
||||||
|
<para><filename>/usr/lib/systemd/system/httpd.service</filename>,
|
||||||
|
<filename>/usr/lib/systemd/system/httpd.socket</filename>,
|
||||||
|
<filename>/usr/lib/systemd/system/httpd@.service</filename>,
|
||||||
|
<filename>/etc/systemd/systemd/httpd.service.d</filename></para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
<refsect1>
|
||||||
|
<title>See also</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
<citerefentry><refentrytitle>httpd</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>httpd.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.service</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.exec</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>systemd.socket</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>httpd_selinux</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>semanage</refentrytitle><manvolnum>8</manvolnum></citerefentry>,
|
||||||
|
<citerefentry><refentrytitle>logrotate</refentrytitle><manvolnum>8</manvolnum></citerefentry>
|
||||||
|
</para>
|
||||||
|
</refsect1>
|
||||||
|
|
||||||
|
</refentry>
|
||||||
|
|
||||||
|
<!-- LocalWords: systemd PidFile
|
||||||
|
-->
|
13
SOURCES/httpd.socket
Normal file
13
SOURCES/httpd.socket
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# See httpd.socket(8) for more information on using the httpd service.
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=Apache httpd Server Socket
|
||||||
|
Documentation=man:httpd.socket(8)
|
||||||
|
|
||||||
|
[Socket]
|
||||||
|
ListenStream=80
|
||||||
|
NoDelay=true
|
||||||
|
DeferAcceptSec=30
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=sockets.target
|
2
SOURCES/httpd.tmpfiles
Normal file
2
SOURCES/httpd.tmpfiles
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
d /run/httpd 710 root apache
|
||||||
|
d /run/httpd/htcacheclean 700 apache apache
|
26
SOURCES/httpd@.service
Normal file
26
SOURCES/httpd@.service
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# This is a template for httpd instances.
|
||||||
|
# See httpd@.service(8) for more information.
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=The Apache HTTP Server
|
||||||
|
After=network.target remote-fs.target nss-lookup.target
|
||||||
|
Documentation=man:httpd@.service(8)
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=notify
|
||||||
|
Environment=LANG=C
|
||||||
|
Environment=HTTPD_INSTANCE=%i
|
||||||
|
ExecStartPre=/bin/mkdir -m 710 -p /run/httpd/instance-%i
|
||||||
|
ExecStartPre=/bin/chown root.apache /run/httpd/instance-%i
|
||||||
|
ExecStartPre=/bin/mkdir -m 700 -p /var/lib/httpd/instance-%i
|
||||||
|
ExecStartPre=/bin/chown apache.apache /var/lib/httpd/instance-%i
|
||||||
|
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND -f conf/%i.conf
|
||||||
|
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful -f conf/%i.conf
|
||||||
|
# Send SIGWINCH for graceful stop
|
||||||
|
KillSignal=SIGWINCH
|
||||||
|
KillMode=mixed
|
||||||
|
PrivateTmp=true
|
||||||
|
OOMPolicy=continue
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
24
SOURCES/instance.conf
Normal file
24
SOURCES/instance.conf
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#
|
||||||
|
# This is an example instance-specific configuration file. See the
|
||||||
|
# httpd@.service(8) man page for detailed information on using the
|
||||||
|
# the httpd@.service with instances.
|
||||||
|
#
|
||||||
|
# To use this example, copy instance.conf to /etc/httpd/conf/foobar.conf
|
||||||
|
# This config will then used as the default configuration when
|
||||||
|
# running:
|
||||||
|
#
|
||||||
|
# # systemctl start httpd@foobar.service
|
||||||
|
#
|
||||||
|
# The changes compared to the default are:
|
||||||
|
# - DefaultRuntime, DefaultStateDir and Pidfile renamed to instance-specific
|
||||||
|
# - default logfile names are prefixed with the instance name
|
||||||
|
# - /etc/httpd/conf.d is NOT included by default (conf.modules.d still is)
|
||||||
|
#
|
||||||
|
# Further customisations will be required for an instance to run
|
||||||
|
# simultaneously to httpd.service under the default configuration,
|
||||||
|
# e.g. changing the port used with Listen.
|
||||||
|
#
|
||||||
|
|
||||||
|
DefaultRuntimeDir /run/httpd/instance-${HTTPD_INSTANCE}
|
||||||
|
DefaultStateDir /var/lib/httpd/instance-${HTTPD_INSTANCE}
|
||||||
|
PidFile /run/httpd/instance-${HTTPD_INSTANCE}.pid
|
13
SOURCES/manual.conf
Normal file
13
SOURCES/manual.conf
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#
|
||||||
|
# This configuration file allows the manual to be accessed at
|
||||||
|
# http://localhost/manual/
|
||||||
|
#
|
||||||
|
Alias /manual /usr/share/httpd/manual
|
||||||
|
|
||||||
|
<Directory "/usr/share/httpd/manual">
|
||||||
|
Options Indexes
|
||||||
|
AllowOverride None
|
||||||
|
Require all granted
|
||||||
|
|
||||||
|
RedirectMatch 301 ^/manual/(?:da|de|en|es|fr|ja|ko|pt-br|ru|tr|zh-cn)(/.*)$ "/manual$1"
|
||||||
|
</Directory>
|
10
SOURCES/server-status.conf
Normal file
10
SOURCES/server-status.conf
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#
|
||||||
|
# Lua-based server-status page; requires mod_lua to be loaded
|
||||||
|
# as per default configuration.
|
||||||
|
#
|
||||||
|
LuaMapHandler ^/server-status$ /usr/share/httpd/server-status/server-status.lua
|
||||||
|
|
||||||
|
<Directory /usr/share/httpd/server-status>
|
||||||
|
AllowOverride None
|
||||||
|
Require local
|
||||||
|
</Directory>
|
203
SOURCES/ssl.conf
Normal file
203
SOURCES/ssl.conf
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
#
|
||||||
|
# When we also provide SSL we have to listen to the
|
||||||
|
# standard HTTPS port in addition.
|
||||||
|
#
|
||||||
|
Listen 443 https
|
||||||
|
|
||||||
|
##
|
||||||
|
## SSL Global Context
|
||||||
|
##
|
||||||
|
## All SSL configuration in this context applies both to
|
||||||
|
## the main server and all SSL-enabled virtual hosts.
|
||||||
|
##
|
||||||
|
|
||||||
|
# Pass Phrase Dialog:
|
||||||
|
# Configure the pass phrase gathering process.
|
||||||
|
# The filtering dialog program (`builtin' is a internal
|
||||||
|
# terminal dialog) has to provide the pass phrase on stdout.
|
||||||
|
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
|
||||||
|
|
||||||
|
# Inter-Process Session Cache:
|
||||||
|
# Configure the SSL Session Cache: First the mechanism
|
||||||
|
# to use and second the expiring timeout (in seconds).
|
||||||
|
SSLSessionCache shmcb:/run/httpd/sslcache(512000)
|
||||||
|
SSLSessionCacheTimeout 300
|
||||||
|
|
||||||
|
#
|
||||||
|
# Use "SSLCryptoDevice" to enable any supported hardware
|
||||||
|
# accelerators. Use "openssl engine -v" to list supported
|
||||||
|
# engine names. NOTE: If you enable an accelerator and the
|
||||||
|
# server does not start, consult the error logs and ensure
|
||||||
|
# your accelerator is functioning properly.
|
||||||
|
#
|
||||||
|
SSLCryptoDevice builtin
|
||||||
|
#SSLCryptoDevice ubsec
|
||||||
|
|
||||||
|
##
|
||||||
|
## SSL Virtual Host Context
|
||||||
|
##
|
||||||
|
|
||||||
|
<VirtualHost _default_:443>
|
||||||
|
|
||||||
|
# General setup for the virtual host, inherited from global configuration
|
||||||
|
#DocumentRoot "/var/www/html"
|
||||||
|
#ServerName www.example.com:443
|
||||||
|
|
||||||
|
# Use separate log files for the SSL virtual host; note that LogLevel
|
||||||
|
# is not inherited from httpd.conf.
|
||||||
|
ErrorLog logs/ssl_error_log
|
||||||
|
TransferLog logs/ssl_access_log
|
||||||
|
LogLevel warn
|
||||||
|
|
||||||
|
# SSL Engine Switch:
|
||||||
|
# Enable/Disable SSL for this virtual host.
|
||||||
|
SSLEngine on
|
||||||
|
|
||||||
|
# List the protocol versions which clients are allowed to connect with.
|
||||||
|
# The OpenSSL system profile is used by default. See
|
||||||
|
# update-crypto-policies(8) for more details.
|
||||||
|
#SSLProtocol all -SSLv3
|
||||||
|
#SSLProxyProtocol all -SSLv3
|
||||||
|
|
||||||
|
# User agents such as web browsers are not configured for the user's
|
||||||
|
# own preference of either security or performance, therefore this
|
||||||
|
# must be the prerogative of the web server administrator who manages
|
||||||
|
# cpu load versus confidentiality, so enforce the server's cipher order.
|
||||||
|
SSLHonorCipherOrder on
|
||||||
|
|
||||||
|
# SSL Cipher Suite:
|
||||||
|
# List the ciphers that the client is permitted to negotiate.
|
||||||
|
# See the mod_ssl documentation for a complete list.
|
||||||
|
# The OpenSSL system profile is configured by default. See
|
||||||
|
# update-crypto-policies(8) for more details.
|
||||||
|
SSLCipherSuite PROFILE=SYSTEM
|
||||||
|
SSLProxyCipherSuite PROFILE=SYSTEM
|
||||||
|
|
||||||
|
# Point SSLCertificateFile at a PEM encoded certificate. If
|
||||||
|
# the certificate is encrypted, then you will be prompted for a
|
||||||
|
# pass phrase. Note that restarting httpd will prompt again. Keep
|
||||||
|
# in mind that if you have both an RSA and a DSA certificate you
|
||||||
|
# can configure both in parallel (to also allow the use of DSA
|
||||||
|
# ciphers, etc.)
|
||||||
|
# Some ECC cipher suites (http://www.ietf.org/rfc/rfc4492.txt)
|
||||||
|
# require an ECC certificate which can also be configured in
|
||||||
|
# parallel.
|
||||||
|
SSLCertificateFile /etc/pki/tls/certs/localhost.crt
|
||||||
|
|
||||||
|
# Server Private Key:
|
||||||
|
# If the key is not combined with the certificate, use this
|
||||||
|
# directive to point at the key file. Keep in mind that if
|
||||||
|
# you've both a RSA and a DSA private key you can configure
|
||||||
|
# both in parallel (to also allow the use of DSA ciphers, etc.)
|
||||||
|
# ECC keys, when in use, can also be configured in parallel
|
||||||
|
SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
|
||||||
|
|
||||||
|
# Server Certificate Chain:
|
||||||
|
# Point SSLCertificateChainFile at a file containing the
|
||||||
|
# concatenation of PEM encoded CA certificates which form the
|
||||||
|
# certificate chain for the server certificate. Alternatively
|
||||||
|
# the referenced file can be the same as SSLCertificateFile
|
||||||
|
# when the CA certificates are directly appended to the server
|
||||||
|
# certificate for convenience.
|
||||||
|
#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
|
||||||
|
|
||||||
|
# Certificate Authority (CA):
|
||||||
|
# Set the CA certificate verification path where to find CA
|
||||||
|
# certificates for client authentication or alternatively one
|
||||||
|
# huge file containing all of them (file must be PEM encoded)
|
||||||
|
#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
|
||||||
|
|
||||||
|
# Client Authentication (Type):
|
||||||
|
# Client certificate verification type and depth. Types are
|
||||||
|
# none, optional, require and optional_no_ca. Depth is a
|
||||||
|
# number which specifies how deeply to verify the certificate
|
||||||
|
# issuer chain before deciding the certificate is not valid.
|
||||||
|
#SSLVerifyClient require
|
||||||
|
#SSLVerifyDepth 10
|
||||||
|
|
||||||
|
# Access Control:
|
||||||
|
# With SSLRequire you can do per-directory access control based
|
||||||
|
# on arbitrary complex boolean expressions containing server
|
||||||
|
# variable checks and other lookup directives. The syntax is a
|
||||||
|
# mixture between C and Perl. See the mod_ssl documentation
|
||||||
|
# for more details.
|
||||||
|
#<Location />
|
||||||
|
#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
|
||||||
|
# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
|
||||||
|
# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
|
||||||
|
# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
|
||||||
|
# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \
|
||||||
|
# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/
|
||||||
|
#</Location>
|
||||||
|
|
||||||
|
# SSL Engine Options:
|
||||||
|
# Set various options for the SSL engine.
|
||||||
|
# o FakeBasicAuth:
|
||||||
|
# Translate the client X.509 into a Basic Authorisation. This means that
|
||||||
|
# the standard Auth/DBMAuth methods can be used for access control. The
|
||||||
|
# user name is the `one line' version of the client's X.509 certificate.
|
||||||
|
# Note that no password is obtained from the user. Every entry in the user
|
||||||
|
# file needs this password: `xxj31ZMTZzkVA'.
|
||||||
|
# o ExportCertData:
|
||||||
|
# This exports two additional environment variables: SSL_CLIENT_CERT and
|
||||||
|
# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
|
||||||
|
# server (always existing) and the client (only existing when client
|
||||||
|
# authentication is used). This can be used to import the certificates
|
||||||
|
# into CGI scripts.
|
||||||
|
# o StdEnvVars:
|
||||||
|
# This exports the standard SSL/TLS related `SSL_*' environment variables.
|
||||||
|
# Per default this exportation is switched off for performance reasons,
|
||||||
|
# because the extraction step is an expensive operation and is usually
|
||||||
|
# useless for serving static content. So one usually enables the
|
||||||
|
# exportation for CGI and SSI requests only.
|
||||||
|
# o StrictRequire:
|
||||||
|
# This denies access when "SSLRequireSSL" or "SSLRequire" applied even
|
||||||
|
# under a "Satisfy any" situation, i.e. when it applies access is denied
|
||||||
|
# and no other module can change it.
|
||||||
|
# o OptRenegotiate:
|
||||||
|
# This enables optimized SSL connection renegotiation handling when SSL
|
||||||
|
# directives are used in per-directory context.
|
||||||
|
#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
|
||||||
|
<FilesMatch "\.(cgi|shtml|phtml|php)$">
|
||||||
|
SSLOptions +StdEnvVars
|
||||||
|
</FilesMatch>
|
||||||
|
<Directory "/var/www/cgi-bin">
|
||||||
|
SSLOptions +StdEnvVars
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
# SSL Protocol Adjustments:
|
||||||
|
# The safe and default but still SSL/TLS standard compliant shutdown
|
||||||
|
# approach is that mod_ssl sends the close notify alert but doesn't wait for
|
||||||
|
# the close notify alert from client. When you need a different shutdown
|
||||||
|
# approach you can use one of the following variables:
|
||||||
|
# o ssl-unclean-shutdown:
|
||||||
|
# This forces an unclean shutdown when the connection is closed, i.e. no
|
||||||
|
# SSL close notify alert is sent or allowed to be received. This violates
|
||||||
|
# the SSL/TLS standard but is needed for some brain-dead browsers. Use
|
||||||
|
# this when you receive I/O errors because of the standard approach where
|
||||||
|
# mod_ssl sends the close notify alert.
|
||||||
|
# o ssl-accurate-shutdown:
|
||||||
|
# This forces an accurate shutdown when the connection is closed, i.e. a
|
||||||
|
# SSL close notify alert is sent and mod_ssl waits for the close notify
|
||||||
|
# alert of the client. This is 100% SSL/TLS standard compliant, but in
|
||||||
|
# practice often causes hanging connections with brain-dead browsers. Use
|
||||||
|
# this only for browsers where you know that their SSL implementation
|
||||||
|
# works correctly.
|
||||||
|
# Notice: Most problems of broken clients are also related to the HTTP
|
||||||
|
# keep-alive facility, so you usually additionally want to disable
|
||||||
|
# keep-alive for those clients, too. Use variable "nokeepalive" for this.
|
||||||
|
# Similarly, one has to force some clients to use HTTP/1.0 to workaround
|
||||||
|
# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
|
||||||
|
# "force-response-1.0" for this.
|
||||||
|
BrowserMatch "MSIE [2-5]" \
|
||||||
|
nokeepalive ssl-unclean-shutdown \
|
||||||
|
downgrade-1.0 force-response-1.0
|
||||||
|
|
||||||
|
# Per-Server Logging:
|
||||||
|
# The home of a custom SSL log file. Use this when you want a
|
||||||
|
# compact non-error SSL logfile on a virtual host basis.
|
||||||
|
CustomLog logs/ssl_request_log \
|
||||||
|
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
|
||||||
|
|
||||||
|
</VirtualHost>
|
||||||
|
|
36
SOURCES/userdir.conf
Normal file
36
SOURCES/userdir.conf
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#
|
||||||
|
# UserDir: The name of the directory that is appended onto a user's home
|
||||||
|
# directory if a ~user request is received.
|
||||||
|
#
|
||||||
|
# The path to the end user account 'public_html' directory must be
|
||||||
|
# accessible to the webserver userid. This usually means that ~userid
|
||||||
|
# must have permissions of 711, ~userid/public_html must have permissions
|
||||||
|
# of 755, and documents contained therein must be world-readable.
|
||||||
|
# Otherwise, the client will only receive a "403 Forbidden" message.
|
||||||
|
#
|
||||||
|
<IfModule mod_userdir.c>
|
||||||
|
#
|
||||||
|
# UserDir is disabled by default since it can confirm the presence
|
||||||
|
# of a username on the system (depending on home directory
|
||||||
|
# permissions).
|
||||||
|
#
|
||||||
|
UserDir disabled
|
||||||
|
|
||||||
|
#
|
||||||
|
# To enable requests to /~user/ to serve the user's public_html
|
||||||
|
# directory, remove the "UserDir disabled" line above, and uncomment
|
||||||
|
# the following line instead:
|
||||||
|
#
|
||||||
|
#UserDir public_html
|
||||||
|
</IfModule>
|
||||||
|
|
||||||
|
#
|
||||||
|
# Control access to UserDir directories. The following is an example
|
||||||
|
# for a site where these directories are restricted to read-only.
|
||||||
|
#
|
||||||
|
<Directory "/home/*/public_html">
|
||||||
|
AllowOverride FileInfo AuthConfig Limit Indexes
|
||||||
|
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
|
||||||
|
Require method GET POST OPTIONS
|
||||||
|
</Directory>
|
||||||
|
|
20
SOURCES/welcome.conf
Normal file
20
SOURCES/welcome.conf
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
#
|
||||||
|
# This configuration file enables the default "Welcome" page if there
|
||||||
|
# is no default index page present for the root URL. To disable the
|
||||||
|
# Welcome page, comment out all the lines below.
|
||||||
|
#
|
||||||
|
# NOTE: if this file is removed, it will be restored on upgrades.
|
||||||
|
#
|
||||||
|
<LocationMatch "^/+$">
|
||||||
|
Options -Indexes
|
||||||
|
ErrorDocument 403 /.noindex.html
|
||||||
|
</LocationMatch>
|
||||||
|
|
||||||
|
<Directory /usr/share/httpd/noindex>
|
||||||
|
AllowOverride None
|
||||||
|
Require all granted
|
||||||
|
</Directory>
|
||||||
|
|
||||||
|
Alias /.noindex.html /usr/share/httpd/noindex/index.html
|
||||||
|
Alias /poweredby.png /usr/share/httpd/icons/apache_pb3.png
|
||||||
|
Alias /system_noindex_logo.png /usr/share/httpd/icons/system_noindex_logo.png
|
1707
SPECS/httpd.spec
Normal file
1707
SPECS/httpd.spec
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user