Turn on NSSOCSP check in mod_nss conf

Turn on NSSOCSP directive during install/replica install/upgrade.
That check whether the certificate which is used for login is
revoked or not using OSCP.

Marks the server cert in httpd NSS DB as trusted peer ('P,,')
to avoid chicken and egg problem when it is needed to contact
the OCSP responder when httpd is starting.

https://pagure.io/freeipa/issue/6370

Reviewed-By: Florence Blanc-Renaud <frenaud@redhat.com>
Reviewed-By: Rob Crittenden <rcritten@redhat.com>
Reviewed-By: Jan Cholasta <jcholast@redhat.com>
Reviewed-By: Martin Basti <mbasti@redhat.com>
This commit is contained in:
Pavel Vomacka
2017-04-06 16:15:47 +02:00
committed by Tomas Krizek
parent 6522c4a837
commit e0b32dac54
5 changed files with 73 additions and 1 deletions

View File

@@ -199,6 +199,7 @@ BuildRequires: python-nose
BuildRequires: python-paste BuildRequires: python-paste
BuildRequires: systemd-python BuildRequires: systemd-python
BuildRequires: python2-jinja2 BuildRequires: python2-jinja2
BuildRequires: python-augeas
%if 0%{?with_python3} %if 0%{?with_python3}
# FIXME: this depedency is missing - server will not work # FIXME: this depedency is missing - server will not work
@@ -236,6 +237,7 @@ BuildRequires: python3-nose
BuildRequires: python3-paste BuildRequires: python3-paste
BuildRequires: python3-systemd BuildRequires: python3-systemd
BuildRequires: python3-jinja2 BuildRequires: python3-jinja2
BuildRequires: python3-augeas
%endif # with_python3 %endif # with_python3
%endif # with_lint %endif # with_lint
@@ -359,6 +361,7 @@ Requires: python-dns >= 1.15
Requires: python-kdcproxy >= 0.3 Requires: python-kdcproxy >= 0.3
Requires: rpm-libs Requires: rpm-libs
Requires: pki-base-python2 Requires: pki-base-python2
Requires: python-augeas
%description -n python2-ipaserver %description -n python2-ipaserver
IPA is an integrated solution to provide centrally managed Identity (users, IPA is an integrated solution to provide centrally managed Identity (users,
@@ -388,6 +391,7 @@ Requires: python3-pyasn1
Requires: python3-dbus Requires: python3-dbus
Requires: python3-dns >= 1.15 Requires: python3-dns >= 1.15
Requires: python3-kdcproxy >= 0.3 Requires: python3-kdcproxy >= 0.3
Requires: python3-augeas
Requires: rpm-libs Requires: rpm-libs
Requires: pki-base-python3 Requires: pki-base-python3

View File

@@ -21,11 +21,23 @@
import syslog import syslog
import traceback import traceback
from ipalib import api
from ipaplatform import services from ipaplatform import services
from ipaserver.install import certs from ipaplatform.paths import paths
from ipaserver.install import certs, installutils
def _main(): def _main():
api.bootstrap(in_server=True, context='restart', confdir=paths.ETC_IPA)
api.finalize()
db = certs.CertDB(api.env.realm, nssdir=paths.HTTPD_ALIAS_DIR)
nickname = installutils.get_directive(paths.HTTPD_NSS_CONF, "NSSNickname")
# Add trust flag which set certificate trusted for SSL connections.
db.trust_root_cert(nickname, "P,,")
syslog.syslog(syslog.LOG_NOTICE, 'certmonger restarted httpd') syslog.syslog(syslog.LOG_NOTICE, 'certmonger restarted httpd')
try: try:

View File

@@ -29,6 +29,7 @@ import pipes
import locale import locale
import six import six
from augeas import Augeas
from ipalib.install import certmonger from ipalib.install import certmonger
from ipaserver.install import service from ipaserver.install import service
@@ -153,6 +154,7 @@ class HTTPInstance(service.Service):
self.set_mod_nss_protocol) self.set_mod_nss_protocol)
self.step("setting mod_nss password file", self.__set_mod_nss_passwordfile) self.step("setting mod_nss password file", self.__set_mod_nss_passwordfile)
self.step("enabling mod_nss renegotiate", self.enable_mod_nss_renegotiate) self.step("enabling mod_nss renegotiate", self.enable_mod_nss_renegotiate)
self.step("enabling mod_nss OCSP", self.enable_mod_nss_ocsp)
self.step("adding URL rewriting rules", self.__add_include) self.step("adding URL rewriting rules", self.__add_include)
self.step("configuring httpd", self.__configure_http) self.step("configuring httpd", self.__configure_http)
self.step("setting up httpd keytab", self.request_service_keytab) self.step("setting up httpd keytab", self.request_service_keytab)
@@ -259,6 +261,31 @@ class HTTPInstance(service.Service):
installutils.set_directive(paths.HTTPD_NSS_CONF, 'NSSRenegotiation', 'on', False) installutils.set_directive(paths.HTTPD_NSS_CONF, 'NSSRenegotiation', 'on', False)
installutils.set_directive(paths.HTTPD_NSS_CONF, 'NSSRequireSafeNegotiation', 'on', False) installutils.set_directive(paths.HTTPD_NSS_CONF, 'NSSRequireSafeNegotiation', 'on', False)
def enable_mod_nss_ocsp(self):
aug = Augeas(flags=Augeas.NO_LOAD | Augeas.NO_MODL_AUTOLOAD)
aug.set('/augeas/load/Httpd/lens', 'Httpd.lns')
aug.set('/augeas/load/Httpd/incl', paths.HTTPD_NSS_CONF)
aug.load()
path = '/files{}/VirtualHost'.format(paths.HTTPD_NSS_CONF)
ocsp_comment = aug.get(
'{}/#comment[.=~regexp("NSSOCSP .*")]'.format(path))
ocsp_dir = aug.get('{}/directive[.="NSSOCSP"]'.format(path))
if ocsp_dir is None and ocsp_comment is not None:
# Directive is missing, comment is present
aug.set('{}/#comment[.=~regexp("NSSOCSP .*")]'.format(path),
'NSSOCSP')
aug.rename('{}/#comment[.="NSSOCSP"]'.format(path), 'directive')
elif ocsp_dir is None:
# Directive is missing and comment is missing
aug.set('{}/directive[last()+1]'.format(path), "NSSOCSP")
aug.set('{}/directive[. = "NSSOCSP"]/arg'.format(path), 'on')
aug.save()
def set_mod_nss_cipher_suite(self): def set_mod_nss_cipher_suite(self):
ciphers = ','.join(NSS_CIPHER_SUITE) ciphers = ','.join(NSS_CIPHER_SUITE)
installutils.set_directive(paths.HTTPD_NSS_CONF, 'NSSCipherSuite', ciphers, False) installutils.set_directive(paths.HTTPD_NSS_CONF, 'NSSCipherSuite', ciphers, False)
@@ -351,6 +378,7 @@ class HTTPInstance(service.Service):
create=True) create=True)
self.disable_system_trust() self.disable_system_trust()
self.create_password_conf() self.create_password_conf()
if self.pkcs12_info: if self.pkcs12_info:
if self.ca_is_configured: if self.ca_is_configured:
trust_flags = 'CT,C,C' trust_flags = 'CT,C,C'
@@ -375,6 +403,8 @@ class HTTPInstance(service.Service):
self.__set_mod_nss_nickname(nickname) self.__set_mod_nss_nickname(nickname)
self.add_cert_to_service() self.add_cert_to_service()
db.trust_root_cert(nickname, "P,,")
else: else:
if not self.promote: if not self.promote:
ca_args = [ ca_args = [

View File

@@ -1392,6 +1392,24 @@ def fix_trust_flags():
sysupgrade.set_upgrade_state('http', 'fix_trust_flags', True) sysupgrade.set_upgrade_state('http', 'fix_trust_flags', True)
def fix_server_cert_trust_flags():
root_logger.info(
'[Fixing server certificate trust flags in %s]' %
paths.HTTPD_ALIAS_DIR)
if sysupgrade.get_upgrade_state('http', 'fix_serv_cert_trust_flags'):
root_logger.info("Trust flags already processed")
return
db = certs.CertDB(api.env.realm, nssdir=paths.HTTPD_ALIAS_DIR)
sc_nickname = installutils.get_directive(paths.HTTPD_NSS_CONF,
"NSSNickname")
# Add trust flag which set certificate trusted for SSL connections.
db.trust_root_cert(sc_nickname, "P,,")
sysupgrade.set_upgrade_state('http', 'fix_serv_cert_trust_flags', True)
def update_mod_nss_protocol(http): def update_mod_nss_protocol(http):
root_logger.info('[Updating mod_nss protocol versions]') root_logger.info('[Updating mod_nss protocol versions]')
@@ -1404,6 +1422,11 @@ def update_mod_nss_protocol(http):
sysupgrade.set_upgrade_state('nss.conf', 'protocol_updated_tls12', True) sysupgrade.set_upgrade_state('nss.conf', 'protocol_updated_tls12', True)
def enable_mod_nss_ocsp(http):
root_logger.info('[Updating mod_nss enabling OCSP]')
http.enable_mod_nss_ocsp()
def update_mod_nss_cipher_suite(http): def update_mod_nss_cipher_suite(http):
root_logger.info('[Updating mod_nss cipher suite]') root_logger.info('[Updating mod_nss cipher suite]')
@@ -1671,7 +1694,9 @@ def upgrade_configuration():
update_ipa_httpd_service_conf(http) update_ipa_httpd_service_conf(http)
update_mod_nss_protocol(http) update_mod_nss_protocol(http)
update_mod_nss_cipher_suite(http) update_mod_nss_cipher_suite(http)
enable_mod_nss_ocsp(http)
fix_trust_flags() fix_trust_flags()
fix_server_cert_trust_flags()
update_http_keytab(http) update_http_keytab(http)
http.configure_gssproxy() http.configure_gssproxy()
http.start() http.start()

View File

@@ -61,6 +61,7 @@ if __name__ == '__main__':
"pyasn1", "pyasn1",
"requests", "requests",
"six", "six",
"python-augeas",
], ],
entry_points={ entry_points={
'custodia.authorizers': [ 'custodia.authorizers': [