diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..d2aaebbcec16eee8739296e77f07dc4dbe04d361
--- /dev/null
+++ b/.devcontainer/Dockerfile
@@ -0,0 +1,8 @@
+FROM baltig.infn.it:4567/storm2/build/ngx-voms-build:issue-17-latest
+
+USER root
+
+RUN yum install -y https://repo.ius.io/ius-release-el7.rpm centos-release-scl \
+    && yum install -y git224 devtoolset-10
+
+USER $BUILD_USER
diff --git a/.devcontainer/assets/install-build-deps.sh b/.devcontainer/assets/install-build-deps.sh
new file mode 100644
index 0000000000000000000000000000000000000000..16c0977e6be1d15e75ae4bab9a25af6c38937dd0
--- /dev/null
+++ b/.devcontainer/assets/install-build-deps.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
+
+yum -y install epel-release
+
+yum -y install \
+    gcc-c++ \
+    GeoIP-devel \
+    gd-devel \
+    gettext \
+    ccache \
+    libxslt-devel \
+    lcov \
+    perl-ExtUtils-Embed \
+    perl-Test-Nginx \
+    perl-Digest-SHA \
+    readline-devel \
+    boost-devel \
+    voms-devel \
+    make \
+    patch
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 0000000000000000000000000000000000000000..821c8c54b3feb734b8bbe030ab408635e355ff7c
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,28 @@
+// For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at:
+// https://github.com/microsoft/vscode-dev-containers/tree/v0.159.0/containers/cpp
+{
+  "name": "C++",
+  "build": {
+    "dockerfile": "Dockerfile",
+  },
+  "runArgs": [
+    "--cap-add=SYS_PTRACE",
+    "--security-opt",
+    "seccomp=unconfined"
+  ],
+  // Set *default* container specific settings.json values on container create.
+  "settings": {
+    "terminal.integrated.defaultProfile.linux": "bash"
+  },
+  // Add the IDs of extensions you want installed when the container is created.
+  "extensions": [
+    "ms-vscode.cpptools",
+  ],
+  // Use 'forwardPorts' to make a list of ports inside the container available locally.
+  // "forwardPorts": [],
+  // Use 'postCreateCommand' to run commands after the container is created.
+  //"postCreateCommand": "sudo debuginfo-install -y voms",
+  // Comment out this line to run as root instead.
+  "remoteUser": "build",
+  "remoteEnv": {"NGX_HTTP_VOMS_MODULE_ROOT": "${containerWorkspaceFolder}"}
+}
\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9409383adacf16c1f90186e9cc0d9a0001ddb9e0..484e7319fd1b351472d55ef831d17599249e4f9e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,3 @@
-#image: ${CI_REGISTRY}/storm2/build/ngx-voms-build:master-latest
-image: storm2/ngx-voms-build:latest
 
 stages:
   - build
@@ -8,10 +6,12 @@ stages:
 
 build-rpm:
   stage: build
+  image: centos:7
   script:
     - env | sort
-    - export VOMS_MODULE_HOME=${CI_PROJECT_DIR}
-    - cd rpm && sh make_packaging.sh && cd ..
+    - sh .devcontainer/assets/install-build-deps.sh
+    - yum install -y rpm-build redhat-rpm-config rpmdevtools
+    - cd rpm && sh make_packaging.sh ${CI_PROJECT_DIR} && cd ..
     - mv ${HOME}/rpmbuild ./rpmbuild
   artifacts:
     paths:
diff --git a/README.md b/README.md
index ed301d6967883f09a25eebaf420f34be69857892..53604a06eb5ef7bb9a38a4ce9fbb48d405a51a73 100644
--- a/README.md
+++ b/README.md
@@ -4,24 +4,30 @@
 
 ## Description
 
-_ngx_http_voms_module_ is a module for the [Nginx web server](https://www.nginx.org/) that enables client-side authentication based on X.509 proxy certificates augmented with VOMS Attribute Certificates, typically obtained from a [Virtual Organization Membership Service](https://italiangrid.github.io/voms/) (VOMS) server.
+*ngx_http_voms_module* is a module for the [Nginx web server](https://www.nginx.org/) that enables client-side authentication based on X.509 proxy certificates augmented with VOMS Attribute Certificates, typically obtained from a [Virtual Organization Membership Service](https://italiangrid.github.io/voms/) (VOMS) server.
 
-The module defines a set of [_embedded_ variables](~embedded-variables), whose values are extracted from the first Attribute Certificate found in the certificate chain.
+The module defines a set of [*embedded* variables](#embedded-variables), whose values are extracted from the first Attribute Certificate found in the certificate chain.
 
 ## Installation
 
 The generic installation instructions are:
 
-    $ cd nginx-1.x.y
-    $ ./configure --add-module=/path/to/ngx_http_voms_module
-    $ make && make install
+```shell
+$ cd nginx-x.y.z
+$ ./configure --add-module=/path/to/ngx_http_voms_module
+$ make && make install
+```
+
+The module is written in C++, using features from C++14 that are supported by gcc v. 4.8.5 (the version available in CentOS 7) enabling the option `-std=c++1y` (see [`config.make`](config.make)).
 
 A Docker image is available for use in the context of the StoRM2 project, where the OpenResty distribution is used:
 
-    $ docker run --rm -it -v /path/to/ngx_http_voms_module:/home/build/ngx_http_voms_module storm2/ngx-voms-build
-    % cd openresty-1.x.y
-    % ./configure ${RESTY_CONFIG_OPTIONS} --add-module=../ngx_http_voms_module
-    % make && make install
+```shell
+$ docker run --rm -it -v /path/to/ngx_http_voms_module:/home/build/ngx_http_voms_module storm2/ngx-voms-build
+$ cd openresty-x.y.z
+$ ./configure ${RESTY_CONFIG_OPTIONS} --add-module=../ngx_http_voms_module
+$ make && make install
+```
 
 ## Embedded Variables
 
@@ -37,74 +43,74 @@ _Example_: ``/C=IT/O=IGI/CN=test0``
 
 Like `voms_user`, the Subject of the End-Entity certificate. Unlike `voms_user`, it is available even for non-VOMS proxies and is formatted according to RFC 2253.
 
-_Example_: ``CN=test0,O=IGI,C=IT``
+_Example_: `CN=test0,O=IGI,C=IT`
 
 ### voms_user_ca
 
 The Issuer (Certificate Authority) of the End-Entity certificate.
 
-_Example_: ``/C=IT/O=IGI/CN=Test CA``
+_Example_: `/C=IT/O=IGI/CN=Test CA`
 
 ### ssl_client_ee_i_dn
 
 Like `voms_user_ca`, the Issuer of the End-Entity certificate. Unlike `voms_user_ca`, it is available even for non-VOMS proxies and is formatted according to RFC 2253.
 
-_Example_: ``CN=Test CA,O=IGI,C=IT``
+_Example_: `CN=Test CA,O=IGI,C=IT`
 
 ### voms_fqans
 
 A comma-separated list of Fully Qualified Attribute Names. See [The VOMS Attribute Certificate Format](http://ogf.org/documents/GFD.182.pdf) for more details.
 
-_Example_: ``/test/exp1,/test/exp2,/test/exp3/Role=PIPPO``
+_Example_: `/test.vo/exp1,/test.vo/exp2,/test.vo/exp3/Role=PIPPO`
 
 ### voms_server
 
 The Subject of the VOMS server certificate, used to sign the Attribute Certificate.
 
-_Example_: ``/C=IT/O=IGI/CN=voms.example``
+_Example_: `/C=IT/O=IGI/CN=voms.example`
 
 ### voms_server_ca
 
 The Issuer (Certificate Authority) of the VOMS server certificate.
 
-_Example_: ``/C=IT/O=IGI/CN=Test CA``
+_Example_: `/C=IT/O=IGI/CN=Test CA`
 
 ### voms_vo
 
 The name of the Virtual Organization (VO) to which the End Entity belongs.
 
-_Example_: ``test.vo``
+_Example_: `test.vo`
 
 ### voms_server_uri
 
 The hostname and port of the VOMS network service that issued the Attribute Certificate, in the form _hostname_ :_port_.
 
-_Example_: ``voms.example:15000``
+_Example_: `voms.example:15000`
 
 ### voms_not_before
 
-The date before which the Attribute Certificate is not yet valid, in the form _YYYYMMDDhhmmss_ ``Z``.
+The date before which the Attribute Certificate is not yet valid, in the form _YYYYMMDDhhmmss_ `Z`.
 
-_Example_: ``20180101000000Z``
+_Example_: `20180101000000Z`
 
 ### voms_not_after
 
-The date after which the Attribute Certificate is not valid anymore, in the form _YYYYMMDDhhmmss_ ``Z``.
+The date after which the Attribute Certificate is not valid anymore, in the form _YYYYMMDDhhmmss_ `Z`.
 
-_Example_: ``20180101120000Z``
+_Example_: `20180101120000Z`
 
 ### voms_generic_attributes
 
-A comma-separated list of attributes, each defined by three properties and formatted as ``n=``_name_ ``v=``_value_ ``q=``_qualifier_. The qualifier typically coincides with the name of the VO.
+A comma-separated list of attributes, each defined by three properties and formatted as `n=`_name_ `v=`_value_ `q=`_qualifier_. The qualifier typically coincides with the name of the VO.
 
-_Example_: ``n=nickname v=newland q=test.vo,n=nickname v=giaco q=test.vo``
+_Example_: `n=nickname v=newland q=test.vo,n=nickname v=giaco q=test.vo`
 
 ### voms_serial
 
 The serial number of the Attribute Certificate in hexadecimal format.
 
-_Example_: ``7B``
+_Example_: `7B`
 
 ## Testing
 
-Setup and files to test the *ngx\_http\_voms\_module* are contained in the `t` folder. 
+Setup and files to test the *ngx_http_voms_module* are contained in the [`t`](t) folder.
diff --git a/config.make b/config.make
new file mode 100644
index 0000000000000000000000000000000000000000..37d163efb942c3b1cc53bde65832f92c2bcadf90
--- /dev/null
+++ b/config.make
@@ -0,0 +1,2 @@
+echo "objs/addon/src/ngx_http_voms_module.o: CFLAGS += --std=c++1y -Werror" >> $NGX_MAKEFILE
+
diff --git a/nginx-httpg_no_delegation.patch b/nginx-httpg_no_delegation.patch
new file mode 100644
index 0000000000000000000000000000000000000000..71bcfba72e36edb0d2888bb0efe06c90946701d8
--- /dev/null
+++ b/nginx-httpg_no_delegation.patch
@@ -0,0 +1,19 @@
+diff --git a/src/http/ngx_http_parse.c b/src/http/ngx_http_parse.c
+index d9a1dbed..7438816e 100644
+--- a/src/http/ngx_http_parse.c
++++ b/src/http/ngx_http_parse.c
+@@ -149,7 +149,13 @@ ngx_http_parse_request_line(ngx_http_request_t *r, ngx_buf_t *b)
+                 break;
+             }
+ 
+-            if ((ch < 'A' || ch > 'Z') && ch != '_' && ch != '-') {
++            if (ch == '0') {
++                // httpg with no delegation
++                // eat the character and continue with the rest of the request
++                ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0, "httpg request w/o delegation");
++                r->request_start++;
++                // httpg with a delegation request would fail for an unknown method
++            } else if ((ch < 'A' || ch > 'Z') && ch != '_' && ch != '-') {
+                 return NGX_HTTP_PARSE_INVALID_METHOD;
+             }
+ 
diff --git a/rpm/SPECS/openresty-voms-debug.spec b/rpm/SPECS/openresty-voms-debug.spec
index e5b6abce9161ef87399910cdc6bb65c73b57a4b9..f4690caf80ba1d4e7bfa171f0eca751edf87de61 100644
--- a/rpm/SPECS/openresty-voms-debug.spec
+++ b/rpm/SPECS/openresty-voms-debug.spec
@@ -1,7 +1,7 @@
 Name:           openresty-voms
-Version:        1.15.8.1
-Release:        7%{?dist}
-Summary:        OpenResty with Voms
+Version:        1.19.9.1
+Release:        1%{?dist}
+Summary:        OpenResty, scalable web platform by extending NGINX with Lua, with HTTPG and VOMS support
 
 Group:          System Environment/Daemons
 
@@ -12,34 +12,27 @@ URL:            https://openresty.org/
 
 Source0:        https://openresty.org/download/openresty-%{version}.tar.gz
 Patch0:         nginx-httpg_no_delegation.patch    
-   
+
 %if 0%{?amzn} >= 2 || 0%{?suse_version} || 0%{?fedora} || 0%{?rhel} >= 7
 %define         use_systemd   1
 %endif
 
-Source1:        openresty-voms.service
-Source2:        openresty-voms.init
+Source1:        %{name}.service
+Source2:        %{name}.init
 
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
 BuildRequires:  perl-File-Temp
 BuildRequires:  ccache, gcc, make, perl, systemtap-sdt-devel
-#BuildRequires:  openresty-zlib-devel >= 1.2.11-3
-BuildRequires: zlib-devel >= 1.2.7-18
-#BuildRequires:  openresty-openssl-devel >= 1.1.0h-1
-BuildRequires: openssl-devel >= 1.0.2k-19
-#BuildRequires:  openresty-pcre-devel >= 8.42-1
-BuildRequires: pcre-devel >= 8.32-17
-#Requires:       openresty-zlib >= 1.2.11-3
-Requires: zlib >= 1.2.7-18
-#Requires:       openresty-openssl >= 1.1.0h-1
-Requires: openssl >= 1.0.2k-19
-#Requires:       openresty-pcre >= 8.42-1
-Requires: pcre >= 8.32-17
-
-# The path location is /usr/local/openresty-voms, therefore I can avoid to handle 
-# Conflicts for standard rpm
-# Conflicts:      openresty >= 1.15.8.2
+BuildRequires:  zlib-devel
+BuildRequires:  openssl-devel
+BuildRequires:  pcre-devel
+BuildRequires:  voms-devel
+BuildRequires:  boost-devel
+Requires:       zlib
+Requires:       openssl
+Requires:       pcre
+Requires:       voms
 
 %if 0%{?suse_version}
 
@@ -69,31 +62,6 @@ Requires(preun): chkconfig, initscripts
 AutoReqProv:        no
 
 %define orprefix            %{_usr}/local/%{name}
-%define oroprefix           /usr
-%define zlib_prefix         %{orprefix}/zlib
-%define pcre_prefix         %{orprefix}/pcre
-%define openssl_prefix      %{orprefix}/openssl
-
-%define voms_module_prefix  ${VOMS_MODULE_HOME}
-
-# Remove source code from debuginfo package.
-%define __debug_install_post \
-  %{_rpmconfigdir}/find-debuginfo.sh %{?_missing_build_ids_terminate_build:--strict-build-id} %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"; \
-  rm -rf "${RPM_BUILD_ROOT}/usr/src/debug"; \
-  mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug/openresty-%{version}"; \
-  mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug/tmp"; \
-  mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug/builddir"; \
-%{nil}
-
-%if 0%{?fedora} >= 27
-%undefine _debugsource_packages
-%undefine _debuginfo_subpackages
-%endif
-
-%if 0%{?rhel} >= 8
-%undefine _debugsource_packages
-%undefine _debuginfo_subpackages
-%endif
 
 
 %description
@@ -115,17 +83,41 @@ web applications that are capable to handle 10K ~ 1000K+ connections in
 a single box.
 
 
+%if 0%{?suse_version}
+
+%debug_package
+
+%else
+
+# Remove source code from debuginfo package.
+%define __debug_install_post \
+    %{_rpmconfigdir}/find-debuginfo.sh %{?_missing_build_ids_terminate_build:--strict-build-id} %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"; \
+    rm -rf "${RPM_BUILD_ROOT}/usr/src/debug"; \
+    mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug/openresty-%{version}"; \
+    mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug/tmp"; \
+    mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug/builddir"; \
+%{nil}
+
+%endif
+
+%if 0%{?fedora} >= 27
+%undefine _debugsource_packages
+%undefine _debuginfo_subpackages
+%endif
+
+%if 0%{?rhel} >= 8
+%undefine _debugsource_packages
+%undefine _debuginfo_subpackages
+%endif
+
+
 %package resty
 
 Summary:        OpenResty command-line utility, resty
 Group:          Development/Tools
-Requires:       perl, openresty-voms >= %{version}-%{release}
+Requires:       perl, %{name} >= %{version}-%{release}
 Requires:       perl(File::Spec), perl(FindBin), perl(List::Util), perl(Getopt::Long), perl(File::Temp), perl(POSIX), perl(Time::HiRes)
 
-# The path location is /usr/local/openresty-voms, therefore I can avoid to handle 
-# Conflicts for standard rpm
-# Conflicts:      openresty-resty >= 1.15.8.2
-
 %if 0%{?fedora} >= 10 || 0%{?rhel} >= 6 || 0%{?centos} >= 6
 BuildArch:      noarch
 %endif
@@ -149,10 +141,6 @@ Summary:        OpenResty documentation tool, restydoc
 Group:          Development/Tools
 Requires:       perl, perl(Getopt::Std), perl(File::Spec), perl(FindBin), perl(Cwd), perl(File::Temp), perl(Pod::Man), perl(Pod::Text)
 
-# The path location is /usr/local/openresty-voms, therefore I can avoid to handle
-# Conflicts for standard rpm
-# Conflicts:      openresty-doc >= 1.15.8.2
-
 %if (!0%{?rhel} || 0%{?rhel} < 7) && !0%{?fedora}
 Requires:       groff
 %endif
@@ -183,16 +171,12 @@ services, and dynamic web gateways.
 
 Summary:        OpenResty Package Manager
 Group:          Development/Tools
-Requires:       perl, openresty-voms >= %{version}-%{release}, perl(Digest::MD5)
-Requires:       openresty-voms-doc >= %{version}-%{release}, openresty-voms-resty >= %{version}-%{release}
+Requires:       perl, %{name} >= %{version}-%{release}, perl(Digest::MD5)
+Requires:       %{name}-doc >= %{version}-%{release}, %{name}-resty >= %{version}-%{release}
 Requires:       curl, tar, gzip
 #BuildRequires:  perl(Digest::MD5)
 Requires:       perl(Encode), perl(FindBin), perl(File::Find), perl(File::Path), perl(File::Spec), perl(Cwd), perl(Digest::MD5), perl(File::Copy), perl(File::Temp), perl(Getopt::Long)
 
-# The path location is /usr/local/openresty-voms, therefore I can avoid to handle
-# Conflicts for standard rpm
-# Conflicts:      openresty-opm >= 1.15.8.2
-
 %if 0%{?fedora} >= 10 || 0%{?rhel} >= 6 || 0%{?centos} >= 6
 BuildArch:      noarch
 %endif
@@ -214,8 +198,7 @@ cd ../..
     --prefix="%{orprefix}" \
     --with-cc='ccache gcc -fdiagnostics-color=always' \
     --with-debug \
-    --with-cc-opt="-DNGX_LUA_ABORT_AT_PANIC -I%{zlib_prefix}/include -I%{pcre_prefix}/include -I%{openssl_prefix}/include -O0" \
-    --with-ld-opt="-L%{zlib_prefix}/lib -L%{pcre_prefix}/lib -L%{openssl_prefix}/lib -Wl,-rpath,%{zlib_prefix}/lib:%{pcre_prefix}/lib:%{openssl_prefix}/lib" \
+    --with-cc-opt="-DNGX_LUA_ABORT_AT_PANIC -Og" \
     --with-pcre-jit \
     --without-http_rds_json_module \
     --without-http_rds_csv_module \
@@ -240,12 +223,12 @@ cd ../..
     --with-http_mp4_module \
     --with-http_gunzip_module \
     --with-threads \
+    --with-compat \
     --with-luajit-xcflags='-DLUAJIT_NUMMODE=2 -DLUAJIT_ENABLE_LUA52COMPAT' \
-    --with-dtrace-probes \
     --add-module=%{voms_module_prefix} \
-    %{?_smp_mflags}
+    -j`nproc`
 
-make %{?_smp_mflags}
+make -j`nproc`
 
 
 %install
@@ -261,7 +244,6 @@ ln -sf %{orprefix}/bin/resty %{buildroot}/usr/bin/
 ln -sf %{orprefix}/bin/restydoc %{buildroot}/usr/bin/
 ln -sf %{orprefix}/bin/opm %{buildroot}/usr/bin/
 ln -sf %{orprefix}/nginx/sbin/nginx %{buildroot}/usr/bin/%{name}
-ls -al %{buildroot}/usr/bin
 
 %if 0%{?use_systemd}
 
@@ -286,7 +268,7 @@ rm -rf %{buildroot}
 %post
 
 %if 0%{?use_systemd}
-%systemd_post openresty-voms.service
+%systemd_post %{name}.service
 %else
 %if ! 0%{?suse_version}
 /sbin/chkconfig --add %{name}
@@ -296,7 +278,7 @@ rm -rf %{buildroot}
 
 %preun
 %if 0%{?use_systemd}
-%systemd_preun openresty-voms.service
+%systemd_preun %{name}.service
 %else
 %if ! 0%{?suse_version}
 if [ $1 = 0 ]; then
@@ -309,7 +291,7 @@ fi
 
 %if 0%{?use_systemd}
 %postun
-%systemd_postun_with_restart openresty-voms.service
+%systemd_postun_with_restart %{name}.service
 %endif
 
 
@@ -329,7 +311,6 @@ fi
 %{orprefix}/nginx/html/*
 %{orprefix}/nginx/logs/
 %{orprefix}/nginx/sbin/*
-%{orprefix}/nginx/tapset/*
 %config(noreplace) %{orprefix}/nginx/conf/*
 %{orprefix}/COPYRIGHT
 
@@ -363,6 +344,18 @@ fi
 
 
 %changelog
+* Fri Nov 12 2021 Francesco Giacomini
+- add HTTPG and VOMS support to openresty 1.19.9.1
+* Fri Aug 6 2021 Yichun Zhang (agentzh) 1.19.9.1-1
+- upgraded openresty to 1.19.9.1.
+* Mon May 31 2021 Yichun Zhang (agentzh) 1.19.3.2-1
+- upgraded openresty to 1.19.3.2.
+* Fri Nov 6 2020 Yichun Zhang (agentzh) 1.19.3.1-1
+- upgraded openresty to 1.19.3.1.
+* Mon Jul 13 2020 Yichun Zhang (agentzh) 1.17.8.2-1
+- upgraded openresty to 1.17.8.2.
+* Fri Jul 3 2020 Yichun Zhang (agentzh) 1.17.8.1-1
+- upgraded openresty to 1.17.8.1.
 * Mon Nov 18 2019 Elisabetta Ronchieri 1.15.8.2-7
 - handled rpm package with voms module.
 * Thu Aug 29 2019 Yichun Zhang (agentzh) 1.15.8.2-1
diff --git a/rpm/SPECS/openresty-voms.spec b/rpm/SPECS/openresty-voms.spec
index 5d92298ab11521a8614f0e29549cb921f5de220b..e62ed2114a69e126867d7728a4c372f97e1df74f 100644
--- a/rpm/SPECS/openresty-voms.spec
+++ b/rpm/SPECS/openresty-voms.spec
@@ -1,7 +1,7 @@
 Name:           openresty-voms
-Version:        1.15.8.1
-Release:        7%{?dist}
-Summary:        OpenResty with Voms
+Version:        1.19.9.1
+Release:        1%{?dist}
+Summary:        OpenResty, scalable web platform by extending NGINX with Lua, with HTTPG and VOMS support
 
 Group:          System Environment/Daemons
 
@@ -12,32 +12,27 @@ URL:            https://openresty.org/
 
 Source0:        https://openresty.org/download/openresty-%{version}.tar.gz
 Patch0:         nginx-httpg_no_delegation.patch    
-   
+
 %if 0%{?amzn} >= 2 || 0%{?suse_version} || 0%{?fedora} || 0%{?rhel} >= 7
 %define         use_systemd   1
 %endif
 
-Source1:        openresty-voms.service
-Source2:        openresty-voms.init
+Source1:        %{name}.service
+Source2:        %{name}.init
 
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
 BuildRequires:  perl-File-Temp
 BuildRequires:  ccache, gcc, make, perl, systemtap-sdt-devel
-BuildRequires: zlib-devel >= 1.2.7-18
-BuildRequires: openssl-devel >= 1.0.2k-19
-BuildRequires: pcre-devel >= 8.32-17
-BuildRequires: voms-devel
-BuildRequires: boost-devel
-Requires: zlib >= 1.2.7-18
-Requires: openssl >= 1.0.2k-19
-Requires: pcre >= 8.32-17
-Requires: voms
-
-
-# The path location is /usr/local/openresty-voms, therefore I can avoid to handle 
-# Conflicts for standard rpm
-# Conflicts:      openresty >= 1.15.8.2
+BuildRequires:  zlib-devel
+BuildRequires:  openssl-devel
+BuildRequires:  pcre-devel
+BuildRequires:  voms-devel
+BuildRequires:  boost-devel
+Requires:       zlib
+Requires:       openssl
+Requires:       pcre
+Requires:       voms
 
 %if 0%{?suse_version}
 
@@ -67,31 +62,6 @@ Requires(preun): chkconfig, initscripts
 AutoReqProv:        no
 
 %define orprefix            %{_usr}/local/%{name}
-#%define oroprefix           %{_usr}/local/openresty
-%define zlib_prefix         /usr
-%define pcre_prefix         /usr
-%define openssl_prefix      %{orprefix}/openssl
-
-%define voms_module_prefix  ${VOMS_MODULE_HOME}
-
-# Remove source code from debuginfo package.
-%define __debug_install_post \
-  %{_rpmconfigdir}/find-debuginfo.sh %{?_missing_build_ids_terminate_build:--strict-build-id} %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"; \
-  rm -rf "${RPM_BUILD_ROOT}/usr/src/debug"; \
-  mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug/openresty-%{version}"; \
-  mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug/tmp"; \
-  mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug/builddir"; \
-%{nil}
-
-%if 0%{?fedora} >= 27
-%undefine _debugsource_packages
-%undefine _debuginfo_subpackages
-%endif
-
-%if 0%{?rhel} >= 8
-%undefine _debugsource_packages
-%undefine _debuginfo_subpackages
-%endif
 
 
 %description
@@ -113,17 +83,41 @@ web applications that are capable to handle 10K ~ 1000K+ connections in
 a single box.
 
 
+%if 0%{?suse_version}
+
+%debug_package
+
+%else
+
+# Remove source code from debuginfo package.
+%define __debug_install_post \
+    %{_rpmconfigdir}/find-debuginfo.sh %{?_missing_build_ids_terminate_build:--strict-build-id} %{?_find_debuginfo_opts} "%{_builddir}/%{?buildsubdir}"; \
+    rm -rf "${RPM_BUILD_ROOT}/usr/src/debug"; \
+    mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug/openresty-%{version}"; \
+    mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug/tmp"; \
+    mkdir -p "${RPM_BUILD_ROOT}/usr/src/debug/builddir"; \
+%{nil}
+
+%endif
+
+%if 0%{?fedora} >= 27
+%undefine _debugsource_packages
+%undefine _debuginfo_subpackages
+%endif
+
+%if 0%{?rhel} >= 8
+%undefine _debugsource_packages
+%undefine _debuginfo_subpackages
+%endif
+
+
 %package resty
 
 Summary:        OpenResty command-line utility, resty
 Group:          Development/Tools
-Requires:       perl, openresty-voms >= %{version}-%{release}
+Requires:       perl, %{name} >= %{version}-%{release}
 Requires:       perl(File::Spec), perl(FindBin), perl(List::Util), perl(Getopt::Long), perl(File::Temp), perl(POSIX), perl(Time::HiRes)
 
-# The path location is /usr/local/openresty-voms, therefore I can avoid to handle 
-# Conflicts for standard rpm
-# Conflicts:      openresty-resty >= 1.15.8.2
-
 %if 0%{?fedora} >= 10 || 0%{?rhel} >= 6 || 0%{?centos} >= 6
 BuildArch:      noarch
 %endif
@@ -147,10 +141,6 @@ Summary:        OpenResty documentation tool, restydoc
 Group:          Development/Tools
 Requires:       perl, perl(Getopt::Std), perl(File::Spec), perl(FindBin), perl(Cwd), perl(File::Temp), perl(Pod::Man), perl(Pod::Text)
 
-# The path location is /usr/local/openresty-voms, therefore I can avoid to handle
-# Conflicts for standard rpm
-# Conflicts:      openresty-doc >= 1.15.8.2
-
 %if (!0%{?rhel} || 0%{?rhel} < 7) && !0%{?fedora}
 Requires:       groff
 %endif
@@ -181,16 +171,12 @@ services, and dynamic web gateways.
 
 Summary:        OpenResty Package Manager
 Group:          Development/Tools
-Requires:       perl, openresty-voms >= %{version}-%{release}, perl(Digest::MD5)
-Requires:       openresty-voms-doc >= %{version}-%{release}, openresty-voms-resty >= %{version}-%{release}
+Requires:       perl, %{name} >= %{version}-%{release}, perl(Digest::MD5)
+Requires:       %{name}-doc >= %{version}-%{release}, %{name}-resty >= %{version}-%{release}
 Requires:       curl, tar, gzip
 #BuildRequires:  perl(Digest::MD5)
 Requires:       perl(Encode), perl(FindBin), perl(File::Find), perl(File::Path), perl(File::Spec), perl(Cwd), perl(Digest::MD5), perl(File::Copy), perl(File::Temp), perl(Getopt::Long)
 
-# The path location is /usr/local/openresty-voms, therefore I can avoid to handle
-# Conflicts for standard rpm
-# Conflicts:      openresty-opm >= 1.15.8.2
-
 %if 0%{?fedora} >= 10 || 0%{?rhel} >= 6 || 0%{?centos} >= 6
 BuildArch:      noarch
 %endif
@@ -211,8 +197,7 @@ cd ../..
 ./configure \
     --prefix="%{orprefix}" \
     --with-cc='ccache gcc -fdiagnostics-color=always' \
-    --with-cc-opt="-DNGX_LUA_ABORT_AT_PANIC -I%{zlib_prefix}/include -I%{pcre_prefix}/include -I%{openssl_prefix}/include" \
-    --with-ld-opt="-L%{zlib_prefix}/lib -L%{pcre_prefix}/lib -L%{openssl_prefix}/lib -Wl,-rpath,%{zlib_prefix}/lib:%{pcre_prefix}/lib:%{openssl_prefix}/lib" \
+    --with-cc-opt="-DNGX_LUA_ABORT_AT_PANIC" \
     --with-pcre-jit \
     --without-http_rds_json_module \
     --without-http_rds_csv_module \
@@ -237,12 +222,12 @@ cd ../..
     --with-http_mp4_module \
     --with-http_gunzip_module \
     --with-threads \
+    --with-compat \
     --with-luajit-xcflags='-DLUAJIT_NUMMODE=2 -DLUAJIT_ENABLE_LUA52COMPAT' \
-    --with-dtrace-probes \
     --add-module=%{voms_module_prefix} \
-    %{?_smp_mflags}
+    -j`nproc`
 
-make %{?_smp_mflags}
+make -j`nproc`
 
 
 %install
@@ -258,7 +243,6 @@ ln -sf %{orprefix}/bin/resty %{buildroot}/usr/bin/
 ln -sf %{orprefix}/bin/restydoc %{buildroot}/usr/bin/
 ln -sf %{orprefix}/bin/opm %{buildroot}/usr/bin/
 ln -sf %{orprefix}/nginx/sbin/nginx %{buildroot}/usr/bin/%{name}
-ls -al %{buildroot}/usr/bin
 
 %if 0%{?use_systemd}
 
@@ -283,7 +267,7 @@ rm -rf %{buildroot}
 %post
 
 %if 0%{?use_systemd}
-%systemd_post openresty-voms.service
+%systemd_post %{name}.service
 %else
 %if ! 0%{?suse_version}
 /sbin/chkconfig --add %{name}
@@ -293,7 +277,7 @@ rm -rf %{buildroot}
 
 %preun
 %if 0%{?use_systemd}
-%systemd_preun openresty-voms.service
+%systemd_preun %{name}.service
 %else
 %if ! 0%{?suse_version}
 if [ $1 = 0 ]; then
@@ -306,7 +290,7 @@ fi
 
 %if 0%{?use_systemd}
 %postun
-%systemd_postun_with_restart openresty-voms.service
+%systemd_postun_with_restart %{name}.service
 %endif
 
 
@@ -326,7 +310,6 @@ fi
 %{orprefix}/nginx/html/*
 %{orprefix}/nginx/logs/
 %{orprefix}/nginx/sbin/*
-%{orprefix}/nginx/tapset/*
 %config(noreplace) %{orprefix}/nginx/conf/*
 %{orprefix}/COPYRIGHT
 
@@ -360,6 +343,18 @@ fi
 
 
 %changelog
+* Fri Nov 12 2021 Francesco Giacomini
+- add HTTPG and VOMS support to openresty 1.19.9.1
+* Fri Aug 6 2021 Yichun Zhang (agentzh) 1.19.9.1-1
+- upgraded openresty to 1.19.9.1.
+* Mon May 31 2021 Yichun Zhang (agentzh) 1.19.3.2-1
+- upgraded openresty to 1.19.3.2.
+* Fri Nov 6 2020 Yichun Zhang (agentzh) 1.19.3.1-1
+- upgraded openresty to 1.19.3.1.
+* Mon Jul 13 2020 Yichun Zhang (agentzh) 1.17.8.2-1
+- upgraded openresty to 1.17.8.2.
+* Fri Jul 3 2020 Yichun Zhang (agentzh) 1.17.8.1-1
+- upgraded openresty to 1.17.8.1.
 * Mon Nov 18 2019 Elisabetta Ronchieri 1.15.8.2-7
 - handled rpm package with voms module.
 * Thu Aug 29 2019 Yichun Zhang (agentzh) 1.15.8.2-1
diff --git a/rpm/make_packaging.sh b/rpm/make_packaging.sh
index c872aa4a30404295ea75e601e9326ecbb5ed5e10..97537e98402306ceee491a0a051721224909a752 100644
--- a/rpm/make_packaging.sh
+++ b/rpm/make_packaging.sh
@@ -1,31 +1,27 @@
 #!/bin/sh
 
-# install rpm build tools:
-sudo yum install -y rpm-build redhat-rpm-config rpmdevtools
+voms_module_prefix=${HOME}/ngx_http_voms_module
+if [ $# -eq 1 ]; then
+    voms_module_prefix=$1
+fi
 
-# install openresty's build requirements:
-sudo yum install -y gcc make perl \
-    perl-Data-Dumper libtool ElectricFence systemtap-sdt-devel valgrind-devel \
-    ccache clang boost-devel
+if [ ! -d "$voms_module_prefix" ]; then
+    echo "$voms_module_prefix doesn't exist" >&2
+    exit 1
+fi
 
-mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
-echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
+mkdir -p ${HOME}/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
+cat <<EOF > ${HOME}/.rpmmacros
+%_topdir %{getenv:HOME}/rpmbuild
+%voms_module_prefix ${voms_module_prefix}
+EOF
 
-cp ${HOME}/nginx-httpg_no_delegation.patch ~/rpmbuild/SOURCES/
+cat ${HOME}/.rpmmacros
 
-cp SOURCES/* ~/rpmbuild/SOURCES/
-cp SPECS/*.spec ~/rpmbuild/SPECS/
+cp ${voms_module_prefix}/nginx-httpg_no_delegation.patch ${HOME}/rpmbuild/SOURCES/
 
-cd ~/rpmbuild/SPECS
+cp SOURCES/* ${HOME}/rpmbuild/SOURCES/
+cp SPECS/*.spec ${HOME}/rpmbuild/SPECS/
 
-for file in *.spec; do
-    spectool -g -R $file
-done
-
-cat ${CI_PROJECT_DIR}/.rpmmacros
-
-rpmbuild -ba openresty-voms.spec
-
-cd ~
-
-# tar cvzf rpmbuild.tar.gz rpmbuild
+spectool -g -R ${HOME}/rpmbuild/SPECS/openresty-voms.spec
+rpmbuild -ba ${HOME}/rpmbuild/SPECS/openresty-voms.spec
diff --git a/src/ngx_http_voms_module.cpp b/src/ngx_http_voms_module.cpp
index bee998fc68e5edb6f9d41bd7a342798ac53fc3e5..c76a9f709c3039b1bae161ac6f2972708d9b56c4 100644
--- a/src/ngx_http_voms_module.cpp
+++ b/src/ngx_http_voms_module.cpp
@@ -328,7 +328,7 @@ static void cache_voms_ac(ngx_http_request_t* r,
   auto c = r->connection;
   auto cln = ngx_pool_cleanup_add(c->pool, 0);
   if (cln) {
-    auto r = ac_cache.insert({c, std::move(acp)});
+    auto r = ac_cache.insert(std::make_pair(c, std::move(acp)));
     // we insert into the cache exactly once per connection
     assert(r.second);
     cln->handler = clean_voms_ac;
@@ -353,7 +353,7 @@ static MaybeVomsAc const& get_voms_ac(ngx_http_request_t* r)
   MaybeVomsAc* acp = get_voms_ac_from_cache(r);
 
   if (!acp) {
-    auto p = std::make_unique<MaybeVomsAc>(retrieve_voms_ac_from_proxy(r));
+    std::unique_ptr<MaybeVomsAc> p{new MaybeVomsAc(retrieve_voms_ac_from_proxy(r))};
     acp = p.get();
     cache_voms_ac(r, std::move(p));
   }
@@ -624,7 +624,7 @@ static ngx_int_t get_ssl_client_ee_cert_raw(ngx_http_request_t* r,
 {
   ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0, "%s", __func__);
 
-  *result = {};
+  *result = {0, nullptr};
 
   auto ee_cert = get_ee_cert(r);
 
@@ -661,6 +661,15 @@ static ngx_int_t get_ssl_client_ee_cert_raw(ngx_http_request_t* r,
   return NGX_OK;
 }
 
+namespace boost {
+template <typename IteratorT, typename IntegerT>
+inline iterator_range<IteratorT> make_iterator_range_n(IteratorT first,
+                                                       IntegerT n)
+{
+  return iterator_range<IteratorT>(first, boost::next(first, n));
+}
+}  // namespace boost
+
 static ngx_int_t get_ssl_client_ee_cert(ngx_http_request_t* r,
                                         ngx_http_variable_value_t* v,
                                         uintptr_t data)
@@ -670,7 +679,7 @@ static ngx_int_t get_ssl_client_ee_cert(ngx_http_request_t* r,
   v->not_found = 1;
   v->valid = 0;
 
-  ngx_str_t cert{};
+  ngx_str_t cert{0, nullptr};
 
   if (get_ssl_client_ee_cert_raw(r, &cert) != NGX_OK) {
     return NGX_ERROR;
diff --git a/t/README.md b/t/README.md
index ee40d5c57a9c935a48137af765d67b873edc5987..1b861006fc81aba8835be7f1a34712d0bf8d5030 100644
--- a/t/README.md
+++ b/t/README.md
@@ -1,54 +1,52 @@
-# ngx\_http\_voms\_module Testing 
+# `ngx_http_voms_module` Testing 
 
 ## Description
 
-Setup and files to test the *ngx\_http\_voms\_module* are contained in the `t` folder. The [Openresty data-driven testsuite](https://openresty.gitbooks.io/programming-openresty/content/testing/) has been adopted for testing.
+Setup and files to test the *ngx_http_voms_module* are contained in the `t` folder. The [Openresty data-driven testsuite](https://openresty.gitbooks.io/programming-openresty/content/testing/) has been adopted for testing.
 
 ### Test fixture setup 
 
-Proxy certificates are in the `certs` folder (see [README.md](certs/README.md) for further details), while trust-anchors (e.g. igi-test-ca.pem) are contained in `trust-anchors`. 
+All the certificates and proxy certificates used in the tests are in the [`certs`](certs) folder (see that [README](certs/README.md) for further details), while trust-anchors (e.g. igi-test-ca.pem) are in the [`trust-anchors`](trust-anchors) folder.
 
-Nginx server certificate and key are nginx\_voms\_example.cert.pem and nginx\_voms\_example\_key.pem, respectively, and they are contained in `certs`.
+`vomses` is the _vomses_ file needed for the generation of proxy certificates.
 
-To perform correctly the VOMS AC validation, a \*.lsc or \*.pem file is needed, see [VOMS client 3.3.0 User Guide](http://italiangrid.github.io/voms/documentation/voms-clients-guide/3.0.3/) for further details. The *voms.example.lsc* can be found in `vomsdir/test.vo`.
+The LSC file `voms.example.lsc`, needed to perform correctly the VOMS AC validation, is in the [`vomsdir/test.vo`](vomsdir/test.vo) folder.
 
 ### Running Tests
 
 To run the tests made available in `t` just type
 
-	prove -v 
+```shell
+$ prove -v 
+```
 
 from `t`' s parent directory.
 
-Using the docker image provided to exploit Openresty in the Storm2 project (see [README.md](../README.md) for further details):
-
-    cp -r t /tmp
-    cd /tmp
-    prove -v
-
-A copy of the `t` folder is needed since the `prove` command creates a directory `servroot` in `t`.  
-
-### Test coverage
-
-To enable test coverage pass the `--coverage` option to both the compiler and the linker. For example, if the build happens inside the ``storm2/nginx-voms-build`` image:
+The `prove` command creates a directory called `servroot` in `t`, so if the `t` folder is accessible read-only, for
+example in a docker container, just make a copy somewhere else and run the tests from there:
 
 ```
-    % ./configure ${RESTY_CONFIG_OPTIONS} --add-module=../ngx_http_voms_module --with-debug --with-cc-opt="-g -O0 --coverage" --with-ld-opt="--coverage"
-    % make && make install
+cp -r t /tmp
+cd /tmp
+prove -v
 ```
 
-Building in debug mode, with no optimizations, helps to better associate coverage information to source code.
+### Test coverage
 
-The above command generates data files aside the source files for all Nginx. To enable coverage only for ``ngx_http_voms_module`` the ``--coverage`` option should be passed only when compiling ``ngx_http_voms_module.cpp`` (to be done).
+To enable test coverage pass the `--coverage` option to both the compiler and the linker. For example:
 
-Then run the tests, e.g. with `prove`. This will create other data files with coverage information. To view that information, run `gcov <source of object file>`, e.g. `gcov /home/build/openresty-1.13.6.1/build/nginx-1.13.6/objs/addon/src/ngx_http_voms_module.o`. This will produce files with the ``.gcov`` extension in the current directory.
+```shell
+$ ./configure ${RESTY_CONFIG_OPTIONS} --add-module=../ngx_http_voms_module --with-debug --with-cc-opt="-g -Og --coverage" --with-ld-opt="--coverage"
+$ make && make install
+```
 
+The above command generates data files aside the source files for all Nginx. To enable coverage only for `ngx_http_voms_module` the `--coverage` option should be passed only when compiling `ngx_http_voms_module.cpp`, adding the option to `config.make`.
 
-Check result on [storm2 ngx_http_voms_module pages](https://storm2.baltig-pages.infn.it/ngx_http_voms_module/)
+Running the tests will then create other data files with coverage information. To view that information, run `gcov <object file>`, e.g. `gcov .../objs/addon/src/ngx_http_voms_module.o`. This will produce files with the `.gcov` extension in the current directory.
 
-### Testing directly the NGINX server
+### Testing directly the Nginx server
 
-You can reuse the config file `t/servroot/conf/nginx.conf` produced by `test::Nginx`, which contains e.g. something like
+You can reuse the config file `t/servroot/conf/nginx.conf` produced by `test::Nginx`, which contains something like
 
 ```
 server {
@@ -64,23 +62,29 @@ server {
     }
 }
 ```
+
 You may want to change the configuration so that the log goes to standard output instead of to a log file:
+
 ```
 server {
     error_log /dev/stdout debug;
     ...
 ```
+
 Start nginx:
+
+```shell
+$ nginx -p t/servroot
 ```
-nginx -p t/servroot
-```
 
-Modify (as root) /etc/hosts so that nginx-voms.example is an alias for localhost:
+Modify (as root) `/etc/hosts` so that `nginx-voms.example` is an alias for `localhost`:
+
 ```
 127.0.0.1	localhost nginx-voms.example
 ```
 
-Then run e.g. `curl` calling directly the https endpoint:
-```
-curl https://nginx-voms.example:8443 --cert t/certs/3.pem --capath t/trust-anchors --cacert t/certs/3.cert.pem
+Then run for example `curl`, calling directly the HTTPS endpoint:
+
+```shell
+$ curl https://nginx-voms.example:8443 --cert t/certs/3.pem --capath t/trust-anchors --cacert t/certs/3.cert.pem
 ```
diff --git a/t/certs/3.cert.pem b/t/certs/3.cert.pem
index 15be540efb76d6db892021e3b4ca4fb2d3e69f33..26ee62f1086bac0c7ead8119cfa93fb46340e046 100644
--- a/t/certs/3.cert.pem
+++ b/t/certs/3.cert.pem
@@ -1,54 +1,57 @@
 -----BEGIN CERTIFICATE-----
-MIIJPDCCCCagAwIBAgIEZ/6+ljALBgkqhkiG9w0BAQUwKzELMAkGA1UEBhMCSVQx
-DDAKBgNVBAoTA0lHSTEOMAwGA1UEAxMFdGVzdDAwHhcNMTgwMzE1MTY0NTE5WhcN
+MIIJxTCCCK+gAwIBAgIEYHBIzjALBgkqhkiG9w0BAQUwKzELMAkGA1UEBhMCSVQx
+DDAKBgNVBAoTA0lHSTEOMAwGA1UEAxMFdGVzdDAwHhcNMjExMTEwMTUwNjAxWhcN
 MjIwOTI0MTUzOTM0WjBAMQswCQYDVQQGEwJJVDEMMAoGA1UEChMDSUdJMQ4wDAYD
-VQQDEwV0ZXN0MDETMBEGA1UEAxMKMTc0NDc0ODE4MjCBnzANBgkqhkiG9w0BAQEF
-AAOBjQAwgYkCgYEAmS0/UqVrzzRvttdHu/v4y7Sfm5ceFJ4lQfBienwvS3F0oOtJ
-7sMqZNktJ2vhAK6ckt5C9PhdvgZa7HJTy1G8GZAbpxEDfAVMSVXFrN8KY7oybA4N
-mmr6jfuuXJCUe3DioxQuUHcH8ShXSiGXm/uoQVe7QfPHtHYtk1xmdA//L1kCAwEA
-AaOCBtkwggbVMA4GA1UdDwEB/wQEAwIF4DAdBggrBgEFBQcBDgEB/wQOMAwwCgYI
-KwYBBQUHFQEwggaiBgorBgEEAb5FZGQFBIIGkjCCBo4wggaKMIIGhjCCBW4CAQEw
-NqA0MC+kLTArMQswCQYDVQQGEwJJVDEMMAoGA1UEChMDSUdJMQ4wDAYDVQQDEwV0
-ZXN0MAIBCaA4MDakNDAyMQswCQYDVQQGEwJJVDEMMAoGA1UECgwDSUdJMRUwEwYD
-VQQDDAx2b21zLmV4YW1wbGUwDQYJKoZIhvcNAQELBQACAXswIhgPMjAxODAxMDEw
-MDAwMDBaGA8yMDMwMDEwMTAwMDAwMFowYzBhBgorBgEEAb5FZGQEMVMwUaAehhx0
-ZXN0LnZvOi8vdm9tcy5leGFtcGxlOjE1MDAwMC8ECi90ZXN0L2V4cDEECi90ZXN0
-L2V4cDIEFS90ZXN0L2V4cDMvUm9sZT1QSVBQTzCCBFowcAYKKwYBBAG+RWRkCwRi
-MGAwXjBcMB6GHHRlc3Qudm86Ly92b21zLmV4YW1wbGU6MTUwMDAwOjAcBAhuaWNr
-bmFtZQQHbmV3bGFuZAQHdGVzdC52bzAaBAhuaWNrbmFtZQQFZ2lhY28EB3Rlc3Qu
-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
-+pn63MqMKHqYIgDlIwbZzw==
+VQQDEwV0ZXN0MDETMBEGA1UEAxMKMTYxNzk3MTQwNjCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAI5wfeykjF7uRvfcoiZXNX+a0pXfV+ZFzwUUDgVhQ7eV
+ySXmYvZyvE1ML28nzM1ZS3rXfp+8TevgY7GLMehUzg0eHWu+ec+T3cn3H545p8iz
+9B8VSj3I1GtdbHcVEBPD+vCp6RqvTlzFYkKkFTFsyIbLRtLUVW8vkO4x4KRYTfK5
+oXCDRF0y9WnpUkK4PnxsK76wMts5psrEl9nSymT97QrsnyEfiwJ1Jf/rQwGKu5xt
+GPD5G2BtTdDNdlxUEmJ61cX/gkvIqCuuOoPFZPRMzMqOy8ZQ1gxesSLIXNzMR4y6
+Klfzug4zUNOJgHlcYk5vbYZ8UUBYqvdf8QcsERUFgBMCAwEAAaOCBt4wggbaMA4G
+A1UdDwEB/wQEAwIF4DAdBggrBgEFBQcBDgEB/wQOMAwwCgYIKwYBBQUHFQEwggan
+BgorBgEEAb5FZGQFBIIGlzCCBpMwggaPMIIGizCCBXMCAQEwNqA0MC+kLTArMQsw
+CQYDVQQGEwJJVDEMMAoGA1UEChMDSUdJMQ4wDAYDVQQDEwV0ZXN0MAIBCaA4MDak
+NDAyMQswCQYDVQQGEwJJVDEMMAoGA1UECgwDSUdJMRUwEwYDVQQDDAx2b21zLmV4
+YW1wbGUwDQYJKoZIhvcNAQELBQACAwHiQDAiGA8yMDIxMTExMDAwMDAwMFoYDzIw
+MzExMjMxMDAwMDAwWjBsMGoGCisGAQQBvkVkZAQxXDBaoB6GHHRlc3Qudm86Ly92
+b21zLmV4YW1wbGU6MTUwMDAwOAQNL3Rlc3Qudm8vZXhwMQQNL3Rlc3Qudm8vZXhw
+MgQYL3Rlc3Qudm8vZXhwMy9Sb2xlPVBJUFBPMIIEVDBwBgorBgEEAb5FZGQLBGIw
+YDBeMFwwHoYcdGVzdC52bzovL3ZvbXMuZXhhbXBsZToxNTAwMDA6MBwECG5pY2tu
+YW1lBAduZXdsYW5kBAd0ZXN0LnZvMBoECG5pY2tuYW1lBAVnaWFjbwQHdGVzdC52
+bzCCA7IGCisGAQQBvkVkZAoEggOiMIIDnjCCA5owggOWMIICfqADAgECAgIDEzAN
+BgkqhkiG9w0BAQsFADAtMQswCQYDVQQGEwJJVDEMMAoGA1UECgwDSUdJMRAwDgYD
+VQQDDAdUZXN0IENBMB4XDTE3MTIwNjA5NDYzN1oXDTI3MTIwNDA5NDYzN1owMjEL
+MAkGA1UEBhMCSVQxDDAKBgNVBAoMA0lHSTEVMBMGA1UEAwwMdm9tcy5leGFtcGxl
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvH/I2h4Nk1C0mCIaL60j
+9JIrcpESm+/ho6KmAwS9x8J/eFF4/ZQG06ro3VaPHdUdpUk/TLJM0T5pLGDAj18P
+fG2ky1gMbt4zamwyEbvT4U0DE7UfmTUdH6+0e9q2G1p2dlQE8+jXYGvGVdnUEut7
+8j3f7J7a1N8Qr+7cnZbHFIxgFtiSyimM3/dPj4ungAHn93pPPDJCr84u+Bp7vLXr
+IKfVKMGk01TT3MDclnvECcWfL8jbc2EB5C6XuQVkGtx2CQnrr75sR7lbQYbBUcD+
+ZSMrlKywgUaZmsKebwtiAzTTW7Xb56w4DjFj7YEfbrxBZYmxjS9f+oraiKz4yz/r
+KwIDAQABo4G6MIG3MAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFDOMCdRJlAHO0fsL
+nRlercTX9ZDEMA4GA1UdDwEB/wQEAwIF4DA+BgNVHSUENzA1BggrBgEFBQcDAQYI
+KwYBBQUHAwIGCisGAQQBgjcKAwMGCWCGSAGG+EIEAQYIKwYBBQUHAwQwHwYDVR0j
+BBgwFoAUkXc2ey60afMn6rf2CItKI6IRScYwFwYDVR0RBBAwDoIMdm9tcy5leGFt
+cGxlMA0GCSqGSIb3DQEBCwUAA4IBAQDgxQjkkpsmCQRkuZ7JJ4IskExL8TwaTc32
+Wv6KWGs2Qjt70OBmKu4trdAqWVLIRIW2kK8SSczepGWq6W6D4c8g05iPPqihgvj1
+bpdzeL5Gp1qnEDC3ARPPtAPGdPfkuFEhM3lKiNYBy8EiN26fHSw+69AJUTsKX7UZ
+tho1Y5WU9ZmhvBi8hKqbcDqyLcLtUBkgFpQh6knh2GEQnfUpZRGiFSuK9xRaSbgt
+XA/8dyDnAzoVuCEx2DP8j3AcppCAhLOvHy0onsbiikPsJjK/12qqQlosUCkzXbfo
+WCK2x3u/pKxVMi1RWBrunoDSTSRLauOXLqdc41CEM7XspCBucB3pMAkGA1UdOAQC
+BQAwHwYDVR0jBBgwFoAUM4wJ1EmUAc7R+wudGV6txNf1kMQwDQYJKoZIhvcNAQEL
+BQADggEBAHVMOJjozsFmQ1DCoeWG9UVKN1T07VFBnluEXMu+jGMddzSbS7mmuxDB
+lzYtpN6kU8MBWaiiWWlA7PVimGceP7u+kSAL97cG+JsosPOQekQ1fIWm79c0jh/k
+znKP7JmCPXaHAq21pVsvwSpJUH7AMM6z1XkVvQsMQgEdvmhqCZwU9Bz5Jl6w45mV
+0XTVpuH2z+Ei3ZoAhBkOLlECHTY+xqXjlgnrTnMblOAkbdhyDhmDAAuvSOPuYre/
+l+Y2T0pZ1Jdg/7mm+HMp34RvOD0ju8HxGV75yZSeM/aw3dRVBWhpt9OK40zqE8b1
+AJwIAJKRD+vmNXzuXK5VYkzGhrZKwHMwCwYJKoZIhvcNAQEFA4IBAQC27d7EF7tN
+N3eES5XaFXT0/ey+msRrzQKh5of+k8JnkfuA7Lrr5ERY3FK19BorfuU/JwOvh8pt
+TVtSoHqv4gu0WGDdyvzdsllvxPfKN/ZygUruMkNOrqhXT5yzpv9NOfcSw0Ovw0IW
+GtsNIDtfTFg1hdqk4fl3sFv5zCLok/pEnifVZqw+Nl8D/HP0vefcQhjr5XqSSWHX
+diYLEyawys0dr30PFWLuVCqppb5jxNmGJX81+FEZfvjAH1mvFfuFXqVUBakCVBP2
+p7RENnJbMxQt/6GBnR1fjreYE/jxT1rRkUWhgisN/f5ol/N1lm+nWPzar9nOMYTL
+3R/NPg/i866C
 -----END CERTIFICATE-----
 -----BEGIN CERTIFICATE-----
 MIIDnjCCAoagAwIBAgIBCTANBgkqhkiG9w0BAQUFADAtMQswCQYDVQQGEwJJVDEM
diff --git a/t/certs/3.key.pem b/t/certs/3.key.pem
index 889603377138258d4da5ea465af424a790cd8b52..7dd14e97afee8283365c60867a12a1fbba432c54 100644
--- a/t/certs/3.key.pem
+++ b/t/certs/3.key.pem
@@ -1,15 +1,27 @@
 -----BEGIN RSA PRIVATE KEY-----
-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
+MIIEowIBAAKCAQEAjnB97KSMXu5G99yiJlc1f5rSld9X5kXPBRQOBWFDt5XJJeZi
+9nK8TUwvbyfMzVlLetd+n7xN6+BjsYsx6FTODR4da755z5PdyfcfnjmnyLP0HxVK
+PcjUa11sdxUQE8P68KnpGq9OXMViQqQVMWzIhstG0tRVby+Q7jHgpFhN8rmhcINE
+XTL1aelSQrg+fGwrvrAy2zmmysSX2dLKZP3tCuyfIR+LAnUl/+tDAYq7nG0Y8Pkb
+YG1N0M12XFQSYnrVxf+CS8ioK646g8Vk9EzMyo7LxlDWDF6xIshc3MxHjLoqV/O6
+DjNQ04mAeVxiTm9thnxRQFiq91/xBywRFQWAEwIDAQABAoIBAGxj//8nDEZlDg4p
+kB6a+HP9DcjMp2fssWeM5kqDxHMcgW/czGv7zX0Iv4PXhoqxK7Xz7ECDm8wl+dcu
+NDE274Gd7AeEb89dF0ZMTnwqJZqeDePlYJR5keONuS85EP3pgbjHo0ISKxB/h5Fs
+qU/uFv40C9X9jHHKgYAw5mBJbi+Il4sVt3guviJwnWeJ80XvjQL3VsVf64Sa3ytA
+El8PR8lQPONRiAgDB6OTaPsSoqHkXkUPCuQY5s+ODqH6uSvtNE1KpZIctOvMf+xo
+dJNdXRD7ZRaOXgOPwtfkLy/xHjjn+ifrbGOFCYfJAgM6B/TfOLianFm5NxViDD/f
+NzoZN/kCgYEA7L5Yj83apLk7SJ+tHVWKXHCpTudSS4I6VIu2x41eOt3fDDoTjshx
+tD2bj7VWpg/LBoRRPG4vsXa17/zLNX8MMBY8zeZni6PBf/+sgnk+iml0LVNwf923
+fgKYqUrF575uDKHrAUFIjU1Fn68cA5RW3dd0ba9bAZ11kzxkhfJA1C8CgYEAmgZ5
+UB5HcMri5ozll085on0p59hgMETrTYuZbF7uyjD+x18m/U1DRy5Iolmwwbx1o0Wp
+elQty7LYqtg9s3xHGss5Q0VUwWxtzN96LiaX93Pk+Ja4K9VV+Wy6XYgN+Hk5Gioe
+kT/FbJ6b/xMx0kwa4jJFUEV3udYNU13tOJOEhV0CgYBT0GfGMZjwrGtioLVHJ1ue
+snweZSLrfKVt/TCuoUv1B0vKJl16NVib+Ruz2v1cOUclfX7NKC1WZLKwzgybWelU
+tOq98o5CD62XxUqrvoT3t7HbwiiX/ETUJdMqTECYdQC9FC4A+b3X2L2HdRUz5zaB
+v5+GnYhYoAhaIg1spoFxHQKBgFCUPncpwBpEKjyPTbXBHtfhP0Eps/jMtYVWGSfW
+6nog88l+ADnYZ/AfSKSW46AXZjvKwAVdcK/2mt+WTYFO7SwZUZXd+Z9PiIn8CEGI
+s0wj95AN2cAk1duthDpWaWiqkrMbge5fPHu85sOlWRU5936K6jQ6g45Xa5VHuEk2
+88eJAoGBAOJR7HrGBfLGTyrHVhwjvHmJMgh03sGxOyeWOKYuEdSYNsAHJD270tbb
+ojP9yKsStj72bidGrmXB0AkNZuOGR6nvvEWF8cDupj4Hcs27L/dux++gjWPMC0Jk
+Gq4ydzSOaZaKFiYQMsfP0X8F53ReUEdBPoufSzfnmrpbfS48p6B2
 -----END RSA PRIVATE KEY-----
diff --git a/t/certs/3.pem b/t/certs/3.pem
index d54e52a3b7da983a844847ef68d0bb39c014cb58..b3c28a1d67e05fa7e279e4202e8e7fdfa25d1ead 100644
--- a/t/certs/3.pem
+++ b/t/certs/3.pem
@@ -1,69 +1,84 @@
 -----BEGIN CERTIFICATE-----
-MIIJPDCCCCagAwIBAgIEZ/6+ljALBgkqhkiG9w0BAQUwKzELMAkGA1UEBhMCSVQx
-DDAKBgNVBAoTA0lHSTEOMAwGA1UEAxMFdGVzdDAwHhcNMTgwMzE1MTY0NTE5WhcN
+MIIJxTCCCK+gAwIBAgIEYHBIzjALBgkqhkiG9w0BAQUwKzELMAkGA1UEBhMCSVQx
+DDAKBgNVBAoTA0lHSTEOMAwGA1UEAxMFdGVzdDAwHhcNMjExMTEwMTUwNjAxWhcN
 MjIwOTI0MTUzOTM0WjBAMQswCQYDVQQGEwJJVDEMMAoGA1UEChMDSUdJMQ4wDAYD
-VQQDEwV0ZXN0MDETMBEGA1UEAxMKMTc0NDc0ODE4MjCBnzANBgkqhkiG9w0BAQEF
-AAOBjQAwgYkCgYEAmS0/UqVrzzRvttdHu/v4y7Sfm5ceFJ4lQfBienwvS3F0oOtJ
-7sMqZNktJ2vhAK6ckt5C9PhdvgZa7HJTy1G8GZAbpxEDfAVMSVXFrN8KY7oybA4N
-mmr6jfuuXJCUe3DioxQuUHcH8ShXSiGXm/uoQVe7QfPHtHYtk1xmdA//L1kCAwEA
-AaOCBtkwggbVMA4GA1UdDwEB/wQEAwIF4DAdBggrBgEFBQcBDgEB/wQOMAwwCgYI
-KwYBBQUHFQEwggaiBgorBgEEAb5FZGQFBIIGkjCCBo4wggaKMIIGhjCCBW4CAQEw
-NqA0MC+kLTArMQswCQYDVQQGEwJJVDEMMAoGA1UEChMDSUdJMQ4wDAYDVQQDEwV0
-ZXN0MAIBCaA4MDakNDAyMQswCQYDVQQGEwJJVDEMMAoGA1UECgwDSUdJMRUwEwYD
-VQQDDAx2b21zLmV4YW1wbGUwDQYJKoZIhvcNAQELBQACAXswIhgPMjAxODAxMDEw
-MDAwMDBaGA8yMDMwMDEwMTAwMDAwMFowYzBhBgorBgEEAb5FZGQEMVMwUaAehhx0
-ZXN0LnZvOi8vdm9tcy5leGFtcGxlOjE1MDAwMC8ECi90ZXN0L2V4cDEECi90ZXN0
-L2V4cDIEFS90ZXN0L2V4cDMvUm9sZT1QSVBQTzCCBFowcAYKKwYBBAG+RWRkCwRi
-MGAwXjBcMB6GHHRlc3Qudm86Ly92b21zLmV4YW1wbGU6MTUwMDAwOjAcBAhuaWNr
-bmFtZQQHbmV3bGFuZAQHdGVzdC52bzAaBAhuaWNrbmFtZQQFZ2lhY28EB3Rlc3Qu
-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
-+pn63MqMKHqYIgDlIwbZzw==
+VQQDEwV0ZXN0MDETMBEGA1UEAxMKMTYxNzk3MTQwNjCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAI5wfeykjF7uRvfcoiZXNX+a0pXfV+ZFzwUUDgVhQ7eV
+ySXmYvZyvE1ML28nzM1ZS3rXfp+8TevgY7GLMehUzg0eHWu+ec+T3cn3H545p8iz
+9B8VSj3I1GtdbHcVEBPD+vCp6RqvTlzFYkKkFTFsyIbLRtLUVW8vkO4x4KRYTfK5
+oXCDRF0y9WnpUkK4PnxsK76wMts5psrEl9nSymT97QrsnyEfiwJ1Jf/rQwGKu5xt
+GPD5G2BtTdDNdlxUEmJ61cX/gkvIqCuuOoPFZPRMzMqOy8ZQ1gxesSLIXNzMR4y6
+Klfzug4zUNOJgHlcYk5vbYZ8UUBYqvdf8QcsERUFgBMCAwEAAaOCBt4wggbaMA4G
+A1UdDwEB/wQEAwIF4DAdBggrBgEFBQcBDgEB/wQOMAwwCgYIKwYBBQUHFQEwggan
+BgorBgEEAb5FZGQFBIIGlzCCBpMwggaPMIIGizCCBXMCAQEwNqA0MC+kLTArMQsw
+CQYDVQQGEwJJVDEMMAoGA1UEChMDSUdJMQ4wDAYDVQQDEwV0ZXN0MAIBCaA4MDak
+NDAyMQswCQYDVQQGEwJJVDEMMAoGA1UECgwDSUdJMRUwEwYDVQQDDAx2b21zLmV4
+YW1wbGUwDQYJKoZIhvcNAQELBQACAwHiQDAiGA8yMDIxMTExMDAwMDAwMFoYDzIw
+MzExMjMxMDAwMDAwWjBsMGoGCisGAQQBvkVkZAQxXDBaoB6GHHRlc3Qudm86Ly92
+b21zLmV4YW1wbGU6MTUwMDAwOAQNL3Rlc3Qudm8vZXhwMQQNL3Rlc3Qudm8vZXhw
+MgQYL3Rlc3Qudm8vZXhwMy9Sb2xlPVBJUFBPMIIEVDBwBgorBgEEAb5FZGQLBGIw
+YDBeMFwwHoYcdGVzdC52bzovL3ZvbXMuZXhhbXBsZToxNTAwMDA6MBwECG5pY2tu
+YW1lBAduZXdsYW5kBAd0ZXN0LnZvMBoECG5pY2tuYW1lBAVnaWFjbwQHdGVzdC52
+bzCCA7IGCisGAQQBvkVkZAoEggOiMIIDnjCCA5owggOWMIICfqADAgECAgIDEzAN
+BgkqhkiG9w0BAQsFADAtMQswCQYDVQQGEwJJVDEMMAoGA1UECgwDSUdJMRAwDgYD
+VQQDDAdUZXN0IENBMB4XDTE3MTIwNjA5NDYzN1oXDTI3MTIwNDA5NDYzN1owMjEL
+MAkGA1UEBhMCSVQxDDAKBgNVBAoMA0lHSTEVMBMGA1UEAwwMdm9tcy5leGFtcGxl
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvH/I2h4Nk1C0mCIaL60j
+9JIrcpESm+/ho6KmAwS9x8J/eFF4/ZQG06ro3VaPHdUdpUk/TLJM0T5pLGDAj18P
+fG2ky1gMbt4zamwyEbvT4U0DE7UfmTUdH6+0e9q2G1p2dlQE8+jXYGvGVdnUEut7
+8j3f7J7a1N8Qr+7cnZbHFIxgFtiSyimM3/dPj4ungAHn93pPPDJCr84u+Bp7vLXr
+IKfVKMGk01TT3MDclnvECcWfL8jbc2EB5C6XuQVkGtx2CQnrr75sR7lbQYbBUcD+
+ZSMrlKywgUaZmsKebwtiAzTTW7Xb56w4DjFj7YEfbrxBZYmxjS9f+oraiKz4yz/r
+KwIDAQABo4G6MIG3MAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFDOMCdRJlAHO0fsL
+nRlercTX9ZDEMA4GA1UdDwEB/wQEAwIF4DA+BgNVHSUENzA1BggrBgEFBQcDAQYI
+KwYBBQUHAwIGCisGAQQBgjcKAwMGCWCGSAGG+EIEAQYIKwYBBQUHAwQwHwYDVR0j
+BBgwFoAUkXc2ey60afMn6rf2CItKI6IRScYwFwYDVR0RBBAwDoIMdm9tcy5leGFt
+cGxlMA0GCSqGSIb3DQEBCwUAA4IBAQDgxQjkkpsmCQRkuZ7JJ4IskExL8TwaTc32
+Wv6KWGs2Qjt70OBmKu4trdAqWVLIRIW2kK8SSczepGWq6W6D4c8g05iPPqihgvj1
+bpdzeL5Gp1qnEDC3ARPPtAPGdPfkuFEhM3lKiNYBy8EiN26fHSw+69AJUTsKX7UZ
+tho1Y5WU9ZmhvBi8hKqbcDqyLcLtUBkgFpQh6knh2GEQnfUpZRGiFSuK9xRaSbgt
+XA/8dyDnAzoVuCEx2DP8j3AcppCAhLOvHy0onsbiikPsJjK/12qqQlosUCkzXbfo
+WCK2x3u/pKxVMi1RWBrunoDSTSRLauOXLqdc41CEM7XspCBucB3pMAkGA1UdOAQC
+BQAwHwYDVR0jBBgwFoAUM4wJ1EmUAc7R+wudGV6txNf1kMQwDQYJKoZIhvcNAQEL
+BQADggEBAHVMOJjozsFmQ1DCoeWG9UVKN1T07VFBnluEXMu+jGMddzSbS7mmuxDB
+lzYtpN6kU8MBWaiiWWlA7PVimGceP7u+kSAL97cG+JsosPOQekQ1fIWm79c0jh/k
+znKP7JmCPXaHAq21pVsvwSpJUH7AMM6z1XkVvQsMQgEdvmhqCZwU9Bz5Jl6w45mV
+0XTVpuH2z+Ei3ZoAhBkOLlECHTY+xqXjlgnrTnMblOAkbdhyDhmDAAuvSOPuYre/
+l+Y2T0pZ1Jdg/7mm+HMp34RvOD0ju8HxGV75yZSeM/aw3dRVBWhpt9OK40zqE8b1
+AJwIAJKRD+vmNXzuXK5VYkzGhrZKwHMwCwYJKoZIhvcNAQEFA4IBAQC27d7EF7tN
+N3eES5XaFXT0/ey+msRrzQKh5of+k8JnkfuA7Lrr5ERY3FK19BorfuU/JwOvh8pt
+TVtSoHqv4gu0WGDdyvzdsllvxPfKN/ZygUruMkNOrqhXT5yzpv9NOfcSw0Ovw0IW
+GtsNIDtfTFg1hdqk4fl3sFv5zCLok/pEnifVZqw+Nl8D/HP0vefcQhjr5XqSSWHX
+diYLEyawys0dr30PFWLuVCqppb5jxNmGJX81+FEZfvjAH1mvFfuFXqVUBakCVBP2
+p7RENnJbMxQt/6GBnR1fjreYE/jxT1rRkUWhgisN/f5ol/N1lm+nWPzar9nOMYTL
+3R/NPg/i866C
 -----END CERTIFICATE-----
 -----BEGIN RSA PRIVATE KEY-----
-MIICXAIBAAKBgQCZLT9SpWvPNG+210e7+/jLtJ+blx4UniVB8GJ6fC9LcXSg60nu
-wypk2S0na+EArpyS3kL0+F2+BlrsclPLUbwZkBunEQN8BUxJVcWs3wpjujJsDg2a
-avqN+65ckJR7cOKjFC5QdwfxKFdKIZeb+6hBV7tB88e0di2TXGZ0D/8vWQIDAQAB
-AoGAFA5VnTelnxLJkdIsRVPfpqR2xYOK3745OKIF8u2xr5oiYDOOkaGiOmQpQmEg
-q9sxCxXpBHREqe3hF9Z8XEHOdAIFqFt1MgwJB3OmtaXRwDDPJ3WRZFvxYde+/KII
-U3ca1tOmoLgVyto/7v+9Z7Rn7g4wFEDlK+r4I+zGtLO6xAECQQDkSRUxDw/w+BOR
-Rl2OOdLCgf8Xv+G7z5qd3tRN+UcvQ14EYkAqOnCFNoWZfaxx89qEIVmIAImTgI2N
-8EStzPOBAkEAq8XZeK9fbFXG0617odwr0NX6UiKVpl/pR2kxS53+XUxlDusb8Y6d
-mqllpDjcD/c28MYyf3wzrp1sSVszk7xH2QJAQrrONAH4IfMSHTQZYtqqLes7+uA/
-Btw/kQgyvPwx/7HMiLGDmhRtEbOHR//BaanjZR4ugp/Nl01Lk4L5QGiZgQJAKgZz
-2GT/sZ+iz3MoRkd5qNRRM/smJdhdWI1R9DApZWYla2r2ITlFMeuz5GPM41MWa/3x
-qOMYOeZl8eSQT9rGsQJBANxbeVGdg4D0qvgtFSzpclcQiTffW293DP84Bs6QKNW0
-Fkh3ZcFHHDEmeZuDOPBQDI+ZQxT7Yy+of31h2sehsX4=
+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
 -----END RSA PRIVATE KEY-----
 -----BEGIN CERTIFICATE-----
 MIIDnjCCAoagAwIBAgIBCTANBgkqhkiG9w0BAQUFADAtMQswCQYDVQQGEwJJVDEM
diff --git a/t/certs/4.cert.pem b/t/certs/4.cert.pem
index 8b2c062188be147b5c015f41c905ce3905154b7e..2df69801eb30f5aa36f1a8fa7832c41e0e08d87f 100644
--- a/t/certs/4.cert.pem
+++ b/t/certs/4.cert.pem
@@ -1,54 +1,56 @@
 -----BEGIN CERTIFICATE-----
-MIIJUTCCCDugAwIBAgIEaWasDzALBgkqhkiG9w0BAQUwKzELMAkGA1UEBhMCSVQx
-DDAKBgNVBAoTA0lHSTEOMAwGA1UEAxMFdGVzdDAwHhcNMTgwMzE1MTYzNDM5WhcN
+MIIJrDCCCJagAwIBAgIEXQoW5DALBgkqhkiG9w0BAQUwKzELMAkGA1UEBhMCSVQx
+DDAKBgNVBAoTA0lHSTEOMAwGA1UEAxMFdGVzdDAwHhcNMjExMTEwMTUyNjExWhcN
 MjIwOTI0MTUzOTM0WjBAMQswCQYDVQQGEwJJVDEMMAoGA1UEChMDSUdJMQ4wDAYD
-VQQDEwV0ZXN0MDETMBEGA1UEAxMKMTc2ODMzNjM5OTCBnzANBgkqhkiG9w0BAQEF
-AAOBjQAwgYkCgYEAsH+q/KhzMLzYimKXZ8MV9B81mqWwUNdfkyp3ZmnsZV1yQLJ8
-pLm/zEX6Z+dyVkTfi80qIOIsv+81UtwT+OFeAJ+TR3e432BrXrrPitQuCBYUaTef
-LH5iKmtCSiaJnY3BACjUdwRiIOzibcBY3obZR9RtrLZ9DpHR0W/0z1ShW8MCAwEA
-AaOCBu4wggbqMA4GA1UdDwEB/wQEAwIF4DAdBggrBgEFBQcBDgEB/wQOMAwwCgYI
-KwYBBQUHFQEwgga3BgorBgEEAb5FZGQFBIIGpzCCBqMwggafMIIGmzCCBYMCAQEw
-NqA0MC+kLTArMQswCQYDVQQGEwJJVDEMMAoGA1UEChMDSUdJMQ4wDAYDVQQDEwV0
-ZXN0MAIBCaA4MDakNDAyMQswCQYDVQQGEwJJVDEMMAoGA1UECgwDSUdJMRUwEwYD
-VQQDDAx2b21zLmV4YW1wbGUwDQYJKoZIhvcNAQELBQACAQAwIhgPMjAxODAxMDEw
-MDAwMDBaGA8yMDMwMDEwMTAwMDAwMFowYzBhBgorBgEEAb5FZGQEMVMwUaAehhx0
-ZXN0LnZvOi8vdm9tcy5leGFtcGxlOjE1MDAwMC8ECi90ZXN0L2V4cDEECi90ZXN0
-L2V4cDIEFS90ZXN0L2V4cDMvUm9sZT1QSVBQTzCCBG8wgYQGCisGAQQBvkVkZAsE
-djB0MHIwcDAehhx0ZXN0LnZvOi8vdm9tcy5leGFtcGxlOjE1MDAwME4wHgQIbmlj
-a25hbWUECW5ld2xhbmQ4NgQHdGVzdC52bzAsBAV0aXRsZQQaYXNzZWduaXN0YSVk
-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
+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
+tlxpRhz5oLrWh8keu+hRfiihB41KAi9223zIVhuPCYW48uXPht40EHogTnry1gN/
+k06eFGelAXyV+WQYZ5ioeYcMVMlMEq8QbLRN3AasvS0CAwEAAaOCBsUwggbBMA4G
+A1UdDwEB/wQEAwIF4DAdBggrBgEFBQcBDgEB/wQOMAwwCgYIKwYBBQUHFQEwggaO
+BgorBgEEAb5FZGQFBIIGfjCCBnowggZ2MIIGcjCCBVoCAQEwNqA0MC+kLTArMQsw
+CQYDVQQGEwJJVDEMMAoGA1UEChMDSUdJMQ4wDAYDVQQDEwV0ZXN0MAIBCaA4MDak
+NDAyMQswCQYDVQQGEwJJVDEMMAoGA1UECgwDSUdJMRUwEwYDVQQDDAx2b21zLmV4
+YW1wbGUwDQYJKoZIhvcNAQELBQACAwHiQTAiGA8yMDIxMTExMDAwMDAwMFoYDzIw
+MzExMjMxMDAwMDAwWjA+MDwGCisGAQQBvkVkZAQxLjAsoB6GHHRlc3Qudm86Ly92
+b21zLmV4YW1wbGU6MTUwMDAwCgQIL3Rlc3Qudm8wggRpMIGEBgorBgEEAb5FZGQL
+BHYwdDByMHAwHoYcdGVzdC52bzovL3ZvbXMuZXhhbXBsZToxNTAwMDBOMB4ECG5p
+Y2tuYW1lBAluZXdsYW5kODYEB3Rlc3Qudm8wLAQFdGl0bGUEGmFzc2VnbmlzdGEl
+ZGklcmljZXJjYUBDTkFGBAd0ZXN0LnZvMIIDsgYKKwYBBAG+RWRkCgSCA6IwggOe
+MIIDmjCCA5YwggJ+oAMCAQICAgMTMA0GCSqGSIb3DQEBCwUAMC0xCzAJBgNVBAYT
+AklUMQwwCgYDVQQKDANJR0kxEDAOBgNVBAMMB1Rlc3QgQ0EwHhcNMTcxMjA2MDk0
+NjM3WhcNMjcxMjA0MDk0NjM3WjAyMQswCQYDVQQGEwJJVDEMMAoGA1UECgwDSUdJ
+MRUwEwYDVQQDDAx2b21zLmV4YW1wbGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQC8f8jaHg2TULSYIhovrSP0kitykRKb7+GjoqYDBL3Hwn94UXj9lAbT
+qujdVo8d1R2lST9MskzRPmksYMCPXw98baTLWAxu3jNqbDIRu9PhTQMTtR+ZNR0f
+r7R72rYbWnZ2VATz6Ndga8ZV2dQS63vyPd/sntrU3xCv7tydlscUjGAW2JLKKYzf
+90+Pi6eAAef3ek88MkKvzi74Gnu8tesgp9UowaTTVNPcwNyWe8QJxZ8vyNtzYQHk
+Lpe5BWQa3HYJCeuvvmxHuVtBhsFRwP5lIyuUrLCBRpmawp5vC2IDNNNbtdvnrDgO
+MWPtgR9uvEFlibGNL1/6itqIrPjLP+srAgMBAAGjgbowgbcwDAYDVR0TAQH/BAIw
+ADAdBgNVHQ4EFgQUM4wJ1EmUAc7R+wudGV6txNf1kMQwDgYDVR0PAQH/BAQDAgXg
+MD4GA1UdJQQ3MDUGCCsGAQUFBwMBBggrBgEFBQcDAgYKKwYBBAGCNwoDAwYJYIZI
+AYb4QgQBBggrBgEFBQcDBDAfBgNVHSMEGDAWgBSRdzZ7LrRp8yfqt/YIi0ojohFJ
+xjAXBgNVHREEEDAOggx2b21zLmV4YW1wbGUwDQYJKoZIhvcNAQELBQADggEBAODF
+COSSmyYJBGS5nskngiyQTEvxPBpNzfZa/opYazZCO3vQ4GYq7i2t0CpZUshEhbaQ
+rxJJzN6kZarpboPhzyDTmI8+qKGC+PVul3N4vkanWqcQMLcBE8+0A8Z09+S4USEz
+eUqI1gHLwSI3bp8dLD7r0AlROwpftRm2GjVjlZT1maG8GLyEqptwOrItwu1QGSAW
+lCHqSeHYYRCd9SllEaIVK4r3FFpJuC1cD/x3IOcDOhW4ITHYM/yPcBymkICEs68f
+LSiexuKKQ+wmMr/XaqpCWixQKTNdt+hYIrbHe7+krFUyLVFYGu6egNJNJEtq45cu
+p1zjUIQzteykIG5wHekwCQYDVR04BAIFADAfBgNVHSMEGDAWgBQzjAnUSZQBztH7
+C50ZXq3E1/WQxDANBgkqhkiG9w0BAQsFAAOCAQEASzEdsvSfkkh4a4+BNWuVUDbf
+a4GLTdczDVWAy+2xaSMUXPZEuf8V1EDWyxQAuNjkuFeXmMGAeo6PEmjHab9tJS92
+UbHCM0EyLKMkHh5plAk3nkAo/BxHWChaPI620c1cJRci/KDRtAB4DMi3a5COsV8N
+fwkH6fj6B0yiK2UJiuTdSFED2c9+xb+q5fzFmvxj4k65D1uwEuoUlNedjpkR1BRa
+VU6gqCSLiXuU+SLDRcowh3CShputVtMqE5mU6nFGRodCVjyop666iQY+PB7qDjjN
+YG2gnUxYaV8ppkVhI23O6c3zl9nrb0flEhIZk4gOmjcxCVAphyj0E/cumnc6cTAL
+BgkqhkiG9w0BAQUDggEBAAAivXn5x0YScPQ6Lv1eCLyfVUq4Q7Ltpjonz+5wDbzY
+wy+JEJQvfexsbBLPOF5Irjz9L+pSfjy8XnEHOzeCZgO97ZtqP8T2+Stvv0gycp1E
+ZGyWPIRfGasJvqeNKXt5Kkf/JYDZw/eC7jYGhi0fKq3gkfh5Dj6IBs9GjMKAi3Wh
+5nzr1LbxEz7DEE5yuUAU7OzYgKUzfl0gnfnJ4Ak7lDXdFlkyJ19iveaFHFFvSUw1
+mga4wQpLAxnWIXfl+JjfGjj0KXvxUMfAD7KJ92EwUpqGQC9Qsq1+WXZrS8Qetctl
+Bv6JlS3G74FiTOn8206byyvgNzkDSi4WoVi/lNDdYG4=
 -----END CERTIFICATE-----
 -----BEGIN CERTIFICATE-----
 MIIDnjCCAoagAwIBAgIBCTANBgkqhkiG9w0BAQUFADAtMQswCQYDVQQGEwJJVDEM
diff --git a/t/certs/4.key.pem b/t/certs/4.key.pem
index 3a3d4ba41dabb8c61e7653b4516981b2174e2a56..84f591cb2ee27353f80f6c1d2123db4e38f9b987 100644
--- a/t/certs/4.key.pem
+++ b/t/certs/4.key.pem
@@ -1,15 +1,27 @@
 -----BEGIN RSA PRIVATE KEY-----
-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
+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
 -----END RSA PRIVATE KEY-----
diff --git a/t/certs/4.pem b/t/certs/4.pem
index 7e55bacd0251ecd1c7a0efb22ff143ff133b1ad1..a4503cd0a89bd55a0be3abd36d6353c2d48f40f3 100644
--- a/t/certs/4.pem
+++ b/t/certs/4.pem
@@ -1,69 +1,83 @@
 -----BEGIN CERTIFICATE-----
-MIIJUTCCCDugAwIBAgIEaWasDzALBgkqhkiG9w0BAQUwKzELMAkGA1UEBhMCSVQx
-DDAKBgNVBAoTA0lHSTEOMAwGA1UEAxMFdGVzdDAwHhcNMTgwMzE1MTYzNDM5WhcN
+MIIJrDCCCJagAwIBAgIEXQoW5DALBgkqhkiG9w0BAQUwKzELMAkGA1UEBhMCSVQx
+DDAKBgNVBAoTA0lHSTEOMAwGA1UEAxMFdGVzdDAwHhcNMjExMTEwMTUyNjExWhcN
 MjIwOTI0MTUzOTM0WjBAMQswCQYDVQQGEwJJVDEMMAoGA1UEChMDSUdJMQ4wDAYD
-VQQDEwV0ZXN0MDETMBEGA1UEAxMKMTc2ODMzNjM5OTCBnzANBgkqhkiG9w0BAQEF
-AAOBjQAwgYkCgYEAsH+q/KhzMLzYimKXZ8MV9B81mqWwUNdfkyp3ZmnsZV1yQLJ8
-pLm/zEX6Z+dyVkTfi80qIOIsv+81UtwT+OFeAJ+TR3e432BrXrrPitQuCBYUaTef
-LH5iKmtCSiaJnY3BACjUdwRiIOzibcBY3obZR9RtrLZ9DpHR0W/0z1ShW8MCAwEA
-AaOCBu4wggbqMA4GA1UdDwEB/wQEAwIF4DAdBggrBgEFBQcBDgEB/wQOMAwwCgYI
-KwYBBQUHFQEwgga3BgorBgEEAb5FZGQFBIIGpzCCBqMwggafMIIGmzCCBYMCAQEw
-NqA0MC+kLTArMQswCQYDVQQGEwJJVDEMMAoGA1UEChMDSUdJMQ4wDAYDVQQDEwV0
-ZXN0MAIBCaA4MDakNDAyMQswCQYDVQQGEwJJVDEMMAoGA1UECgwDSUdJMRUwEwYD
-VQQDDAx2b21zLmV4YW1wbGUwDQYJKoZIhvcNAQELBQACAQAwIhgPMjAxODAxMDEw
-MDAwMDBaGA8yMDMwMDEwMTAwMDAwMFowYzBhBgorBgEEAb5FZGQEMVMwUaAehhx0
-ZXN0LnZvOi8vdm9tcy5leGFtcGxlOjE1MDAwMC8ECi90ZXN0L2V4cDEECi90ZXN0
-L2V4cDIEFS90ZXN0L2V4cDMvUm9sZT1QSVBQTzCCBG8wgYQGCisGAQQBvkVkZAsE
-djB0MHIwcDAehhx0ZXN0LnZvOi8vdm9tcy5leGFtcGxlOjE1MDAwME4wHgQIbmlj
-a25hbWUECW5ld2xhbmQ4NgQHdGVzdC52bzAsBAV0aXRsZQQaYXNzZWduaXN0YSVk
-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
+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
+tlxpRhz5oLrWh8keu+hRfiihB41KAi9223zIVhuPCYW48uXPht40EHogTnry1gN/
+k06eFGelAXyV+WQYZ5ioeYcMVMlMEq8QbLRN3AasvS0CAwEAAaOCBsUwggbBMA4G
+A1UdDwEB/wQEAwIF4DAdBggrBgEFBQcBDgEB/wQOMAwwCgYIKwYBBQUHFQEwggaO
+BgorBgEEAb5FZGQFBIIGfjCCBnowggZ2MIIGcjCCBVoCAQEwNqA0MC+kLTArMQsw
+CQYDVQQGEwJJVDEMMAoGA1UEChMDSUdJMQ4wDAYDVQQDEwV0ZXN0MAIBCaA4MDak
+NDAyMQswCQYDVQQGEwJJVDEMMAoGA1UECgwDSUdJMRUwEwYDVQQDDAx2b21zLmV4
+YW1wbGUwDQYJKoZIhvcNAQELBQACAwHiQTAiGA8yMDIxMTExMDAwMDAwMFoYDzIw
+MzExMjMxMDAwMDAwWjA+MDwGCisGAQQBvkVkZAQxLjAsoB6GHHRlc3Qudm86Ly92
+b21zLmV4YW1wbGU6MTUwMDAwCgQIL3Rlc3Qudm8wggRpMIGEBgorBgEEAb5FZGQL
+BHYwdDByMHAwHoYcdGVzdC52bzovL3ZvbXMuZXhhbXBsZToxNTAwMDBOMB4ECG5p
+Y2tuYW1lBAluZXdsYW5kODYEB3Rlc3Qudm8wLAQFdGl0bGUEGmFzc2VnbmlzdGEl
+ZGklcmljZXJjYUBDTkFGBAd0ZXN0LnZvMIIDsgYKKwYBBAG+RWRkCgSCA6IwggOe
+MIIDmjCCA5YwggJ+oAMCAQICAgMTMA0GCSqGSIb3DQEBCwUAMC0xCzAJBgNVBAYT
+AklUMQwwCgYDVQQKDANJR0kxEDAOBgNVBAMMB1Rlc3QgQ0EwHhcNMTcxMjA2MDk0
+NjM3WhcNMjcxMjA0MDk0NjM3WjAyMQswCQYDVQQGEwJJVDEMMAoGA1UECgwDSUdJ
+MRUwEwYDVQQDDAx2b21zLmV4YW1wbGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQC8f8jaHg2TULSYIhovrSP0kitykRKb7+GjoqYDBL3Hwn94UXj9lAbT
+qujdVo8d1R2lST9MskzRPmksYMCPXw98baTLWAxu3jNqbDIRu9PhTQMTtR+ZNR0f
+r7R72rYbWnZ2VATz6Ndga8ZV2dQS63vyPd/sntrU3xCv7tydlscUjGAW2JLKKYzf
+90+Pi6eAAef3ek88MkKvzi74Gnu8tesgp9UowaTTVNPcwNyWe8QJxZ8vyNtzYQHk
+Lpe5BWQa3HYJCeuvvmxHuVtBhsFRwP5lIyuUrLCBRpmawp5vC2IDNNNbtdvnrDgO
+MWPtgR9uvEFlibGNL1/6itqIrPjLP+srAgMBAAGjgbowgbcwDAYDVR0TAQH/BAIw
+ADAdBgNVHQ4EFgQUM4wJ1EmUAc7R+wudGV6txNf1kMQwDgYDVR0PAQH/BAQDAgXg
+MD4GA1UdJQQ3MDUGCCsGAQUFBwMBBggrBgEFBQcDAgYKKwYBBAGCNwoDAwYJYIZI
+AYb4QgQBBggrBgEFBQcDBDAfBgNVHSMEGDAWgBSRdzZ7LrRp8yfqt/YIi0ojohFJ
+xjAXBgNVHREEEDAOggx2b21zLmV4YW1wbGUwDQYJKoZIhvcNAQELBQADggEBAODF
+COSSmyYJBGS5nskngiyQTEvxPBpNzfZa/opYazZCO3vQ4GYq7i2t0CpZUshEhbaQ
+rxJJzN6kZarpboPhzyDTmI8+qKGC+PVul3N4vkanWqcQMLcBE8+0A8Z09+S4USEz
+eUqI1gHLwSI3bp8dLD7r0AlROwpftRm2GjVjlZT1maG8GLyEqptwOrItwu1QGSAW
+lCHqSeHYYRCd9SllEaIVK4r3FFpJuC1cD/x3IOcDOhW4ITHYM/yPcBymkICEs68f
+LSiexuKKQ+wmMr/XaqpCWixQKTNdt+hYIrbHe7+krFUyLVFYGu6egNJNJEtq45cu
+p1zjUIQzteykIG5wHekwCQYDVR04BAIFADAfBgNVHSMEGDAWgBQzjAnUSZQBztH7
+C50ZXq3E1/WQxDANBgkqhkiG9w0BAQsFAAOCAQEASzEdsvSfkkh4a4+BNWuVUDbf
+a4GLTdczDVWAy+2xaSMUXPZEuf8V1EDWyxQAuNjkuFeXmMGAeo6PEmjHab9tJS92
+UbHCM0EyLKMkHh5plAk3nkAo/BxHWChaPI620c1cJRci/KDRtAB4DMi3a5COsV8N
+fwkH6fj6B0yiK2UJiuTdSFED2c9+xb+q5fzFmvxj4k65D1uwEuoUlNedjpkR1BRa
+VU6gqCSLiXuU+SLDRcowh3CShputVtMqE5mU6nFGRodCVjyop666iQY+PB7qDjjN
+YG2gnUxYaV8ppkVhI23O6c3zl9nrb0flEhIZk4gOmjcxCVAphyj0E/cumnc6cTAL
+BgkqhkiG9w0BAQUDggEBAAAivXn5x0YScPQ6Lv1eCLyfVUq4Q7Ltpjonz+5wDbzY
+wy+JEJQvfexsbBLPOF5Irjz9L+pSfjy8XnEHOzeCZgO97ZtqP8T2+Stvv0gycp1E
+ZGyWPIRfGasJvqeNKXt5Kkf/JYDZw/eC7jYGhi0fKq3gkfh5Dj6IBs9GjMKAi3Wh
+5nzr1LbxEz7DEE5yuUAU7OzYgKUzfl0gnfnJ4Ak7lDXdFlkyJ19iveaFHFFvSUw1
+mga4wQpLAxnWIXfl+JjfGjj0KXvxUMfAD7KJ92EwUpqGQC9Qsq1+WXZrS8Qetctl
+Bv6JlS3G74FiTOn8206byyvgNzkDSi4WoVi/lNDdYG4=
 -----END CERTIFICATE-----
 -----BEGIN RSA PRIVATE KEY-----
-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
+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
 -----END RSA PRIVATE KEY-----
 -----BEGIN CERTIFICATE-----
 MIIDnjCCAoagAwIBAgIBCTANBgkqhkiG9w0BAQUFADAtMQswCQYDVQQGEwJJVDEM
diff --git a/t/certs/README.md b/t/certs/README.md
index ac9e76cdba4c57347b0c35f9a500491b01bf6633..4938a4e1059c190087d7aa855d7099326c8b12d1 100644
--- a/t/certs/README.md
+++ b/t/certs/README.md
@@ -1,35 +1,51 @@
-=======
-# Certificates for ngx\_http\_voms\_module Testing 
+# Certificates for `ngx_http_voms_module` testing 
 
-Proxy certificates are generated using [VOMS client 3.3.1](http://italiangrid.github.io/voms/documentation/voms-clients-guide/3.0.3/):
+This directory contains the certificates and the proxy certificates used in the unit tests of the `ngx_http_voms_module`.
 
- * 0.pem: long-lived proxy certificate, without any Attribute Certificate (AC);
- * 1.pem: long-lived proxy certificate, with an expired AC;
- * 2.pem: expired proxy certificate;
- * 3.pem: long-lived proxy with valid VOMS attributes;
- * 4.pem: long-lived proxy with VOMS generic attributes containing reserved characters;
- * 5.pem: long-lived proxy with valid VOMS attributes, `*.lsc` file missing in `vomsdir`. 
- * 6.pem: long-lived proxy with valid VOMS attributes, with an old format for fqans. 
- * 7.pem: long-lived proxy (3 delegations), without VOMS attributes;
- * 8.pem: long-lived proxy (3 delegations), without VOMS attributes, plus CA
-   certificate included in the chain;
- * 9.pem: EEC plus CA certificate included in the chain.
+The proxy certificates are generated using the [VOMS
+clients](http://italiangrid.github.io/voms/documentation/voms-clients-guide/), using the following command template:
 
-To obtain such certificates the following command is used:
+```shell
+$ VOMS_CLIENTS_JAVA_OPTIONS="-Dvoms.fake.vo=test.vo -Dvoms.fake=true -Dvoms.fake.aaCert=<path_to_cert>/voms_example.cert.pem -Dvoms.fake.aaKey=<path_to_cert>/voms_example.key.pem -Dvoms.fake.notAfter=<AAAA-MM-GGT00:00:00 -Dvoms.fake.notBefore=AAAA-MM-GGT00:00:00 -Dvoms.fake.gas=<name>=<value>,<name>=<value> -Dvoms.fake.fqans=/<vo>/<fqan>,/<vo>/<fqan>/Role=<role> -Dvoms.fake.serial=<ac_serial_n>" voms-proxy-init -voms test.vo -cert <path_to test0.p12> --valid <validity> --vomsdir <path_to_vomsdir> --certdir <path_to_trust_anchors>
+```
 
-        VOMS_CLIENTS_JAVA_OPTIONS="-Dvoms.fake.vo=test.vo -Dvoms.fake=true -Dvoms.fake.aaCert=<path_to_cert>/voms_example.cert.pem -Dvoms.fake.aaKey=<path_to_cert>/voms_example.key.pem -Dvoms.fake.notAfter=<AAAA-MM-GGT00:00:00 -Dvoms.fake.notBefore=AAAA-MM-GGT00:00:00 -Dvoms.fake.gas=<name>=<value>,<name>=<value> -Dvoms.fake.fqans=/<vo>/<fqan>,/<vo>/<fqan>/Role=<role> -Dvoms.fake.serial=<ac_serial_n>" voms-proxy-init -voms test.vo -cert <path_to_test0>/test0.p12 --valid <validity> --vomsdir <path_to_vomsdir>/vomsdir --certdir <path_to_trust_anchors>/trust-anchors/ 
+See below for some concrete examples.
 
-Once VOMS proxy certificates are generated in a `*.pem` format, they need to be split in certificates and key to be used in Openresty tests. `*.cert.pem` and `*.key.pem` files are obtained by simpling typing in `certs`
+As usual, the command generates a proxy certificate in `/tmp` in PEM format. To be used in these tests, they need to be
+split in the corresponding certificate and key and eventually moved into this directory. Given a `name.pem` file,
+`name.cert.pem` and `name.key.pem` can be obtained using the following commands:
 
-	awk '/BEGIN RSA PRIVATE KEY/,/END RSA PRIVATE KEY/' <name>.pem > <name>.key.pem
-	awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/' <name>.pem > <name>.cert.pem
+```shell
+$ awk '/BEGIN RSA PRIVATE KEY/,/END RSA PRIVATE KEY/' name.pem > name.key.pem
+$ awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/' name.pem > name.cert.pem
+```
 
-where `<name>` could be for instance `0,1,2,etc..`
+The following certificates and proxy certificates are used in these tests:
 
-*voms\_example.cert.pem* and *voms\_example.ket.pem* can be found in `certs`.
+ * `0.pem`: long-lived proxy certificate, without any Attribute Certificate (AC)
+ * `1.pem`: long-lived proxy certificate, with an expired AC
+ * `2.pem`: expired proxy certificate
+ * `3.pem`: long-lived proxy with valid VOMS attributes. Obtained with:
 
-For *../untrusted.t*, *voms\_example\_2.cert.pem* and *voms\_example\_2.key.pem* are used as VOMS certificates and they are in `certs`. 
+```shell
+$ VOMS_CLIENTS_JAVA_OPTIONS="-Dvoms.fake.vo=test.vo -Dvoms.fake=true -Dvoms.fake.aaCert=t/certs/voms_example.cert.pem -Dvoms.fake.aaKey=t/certs/voms_example.key.pem -Dvoms.fake.notAfter=2031-12-31T00:00:00 -Dvoms.fake.notBefore=2021-11-10T00:00:00 -Dvoms.fake.gas=nickname=newland,nickname=giaco -Dvoms.fake.fqans=/test.vo/exp1,/test.vo/exp2,/test.vo/exp3/Role=PIPPO -Dvoms.fake.serial=123456" voms-proxy-init -voms test.vo -cert t/certs/test0.p12 --valid 10000:0 --vomsdir t/vomsdir --certdir t/trust-anchors --vomses t/vomses
+```
 
-To perform correctly the VOMS AC validation, a \*.lsc or \*.pem file is needed in `/etc/grid-security/vomsdir`, see [VOMS client 3.3.1 User Guide](http://italiangrid.github.io/voms/documentation/voms-clients-guide/3.0.3/) for further details. An example of *voms.example.lsc* can be found in `vomsdir/test.vo`.
+ * `4.pem`: long-lived proxy with VOMS generic attributes containing special characters. Obtained with:
 
-Nginx server certificate and key  are nginx\_voms\_example.cert.pem and nginx\_voms\_example\_key.pem.
+```shell
+$ VOMS_CLIENTS_JAVA_OPTIONS="-Dvoms.fake.vo=test.vo -Dvoms.fake=true -Dvoms.fake.aaCert=t/certs/voms_example.cert.pem -Dvoms.fake.aaKey=t/certs/voms_example.key.pem -Dvoms.fake.notAfter=2031-12-31T00:00:00 -Dvoms.fake.notBefore=2021-11-10T00:00:00 -Dvoms.fake.fqans=/test.vo -Dvoms.fake.gas=nickname=newland86,title=assegnista%di%ricerca@CNAF -Dvoms.fake.serial=123457" voms-proxy-init -voms test.vo -cert t/certs/test0.p12 --valid 10000:0 --vomsdir t/vomsdir --certdir t/trust-anchors --vomses t/vomses
+```
+
+ * `5.pem`: long-lived proxy with valid VOMS attributes
+ * `6.pem`: long-lived proxy with valid VOMS attributes, with an old format for FQANs 
+ * `7.pem`: long-lived proxy (3 delegations), without VOMS attributes
+ * `8.pem`: long-lived proxy (3 delegations), without VOMS attributes, plus a CA
+   certificate included in the chain
+ * `9.pem`: EEC plus CA certificate included in the chain
+
+`voms_example.cert.pem` and `voms_example.key.pem` are the credentials of a trusted VOMS server.
+
+`voms_example_2.cert.pem` and `voms_example_2.key.pem` are the credentials of an untrusted VOMS server. 
+
+`nginx_voms_example.cert.pem` and `nginx_voms_example.key.pem` are the Nginx server credentials.
diff --git a/t/ssl_log_voms_plain_http.t b/t/ssl_log_voms_plain_http.t
index 1989c41f1a81397ded908dd3b19bf8279f61361a..00d25ec5a06dc727c64e0276aa384a1c4bde1226 100644
--- a/t/ssl_log_voms_plain_http.t
+++ b/t/ssl_log_voms_plain_http.t
@@ -1,10 +1,4 @@
 
-# This test is always successful because, for some reason (a bug?)
-# the error.log as seen in Test::Nginx doesn't contain the entries for
-# the master process, although they are evailable in the actual file.
-# As a consequence the no_error_log check is always satisfied,
-# even if the segmentation fault were present
-
 use Test::Nginx::Socket 'no_plan';
 
 master_on();
@@ -55,7 +49,5 @@ GET /lua
 --- error_log
 client prematurely closed connection
 retrieve_voms_ac_from_proxy
-plain http
---- no_error_log
-signal 11
+plain HTTP
 --- error_code: 200
diff --git a/t/valid_ac.t b/t/valid_ac.t
index 5241d3f7c22dfffd025b5df49d2adab740ffcf13..7af1ef04e760a343a001116530a6cd3650673bbd 100644
--- a/t/valid_ac.t
+++ b/t/valid_ac.t
@@ -45,14 +45,14 @@ GET /
 --- response_body
 /C=IT/O=IGI/CN=test0
 /C=IT/O=IGI/CN=Test CA
-/test/exp1,/test/exp2,/test/exp3/Role=PIPPO
+/test.vo/exp1,/test.vo/exp2,/test.vo/exp3/Role=PIPPO
 /C=IT/O=IGI/CN=voms.example
 /C=IT/O=IGI/CN=Test CA
 test.vo
 voms.example:15000
-20180101000000Z
-20300101000000Z
+20211110000000Z
+20311231000000Z
 n=nickname v=newland q=test.vo,n=nickname v=giaco q=test.vo
-7B
+01E240
 --- error_code: 200
 
diff --git a/t/vomses b/t/vomses
new file mode 100644
index 0000000000000000000000000000000000000000..657acafb52d7308e60fbb635923270beeac45cd4
--- /dev/null
+++ b/t/vomses
@@ -0,0 +1 @@
+"test.vo" "voms.example" "15000" "/C=IT/O=IGI/CN=voms.example" "test.vo"