Dear all,
This mail is a warning, that after an upgrade to the newest version from git,
some of your configuration files/applications might need adjustments,
The newest commit to the main repository brings more security, by validating in
ns_http client requests always the server certificate. While this is common for
browsers, this is not necessarily the case for automated web operations (web
services etc.), opening a large attack vector for man-in-the-middle attacks
(see below). So far, checking the certificates was per default deactivated,
which has the consequence, that in practice, many (most?) application
developers just used with the defaults, leading to an unpleasant situation.
Now, certificated checking is activated, it can be deactivated by adding the
parameter “-insecure” to an “ns_http” request (there are other means, see
below).
The regression test (including self-signed certificates for HTTPS, revproxy, …)
works fine.
Next steps for me:
- check consequences for letsencrypt
- add similar changes to “ns_connchan open|connect"
- documentation of certificate management in detail (covering ns_http,
ns_connchan, admin-config)
We are getting closer to the release candiate...
all the best
-gn
Security by default for HTTP client requests (ns_http)
Background: Authenticating the peer is a critical part of SSL connection setup
when a client connects to a server. In this process, the server presents its
public-key certificate. If the results of this authentication is missing, a
server might be vulnerable to man-in-the-middle attacks. Protection against
this is one of the intentions of HTTPS, and becomes more important when backend
transactions are performed via HTTPS (administration of servers, cloud
infrastructure, payments, ...), establishing secure network tunnels, or when
sending confidential information via HTTPs
As the paper mentioned below points out, the validation of peer certificates is
usually in place for web communication over the browser, but it is often not
active for web service interactions. One reason for this is that application
developers choose very often the default setup.
The key instrument of NaviServer for performing HTTP client operations is
ns_http, which certainly has the ability for certificate validation, but so far
it was per default deactivated. This changes now with NaviServer 5, where the
default is now including validation.
One of the consequences of validating peer certificates is that the
administrator has to care about certificates (what certificates are accepted),
including management of self-signed certificates.
We try to make the transition as smooth a possible by providing a reasonable
default setup including established root certificates (ca-bundle.crt),
providing simple means to add your own trusted certificates (including
self-signed certificates). This default setup can be altered for a server via
the configuration file, or for every single request via parameters.
The most important changes are:
- new parameter "-insecure" for "ns_http run" and "ns_http queue"
This parameter turns off certificate validation for the target HTTPS server.
The name follows the naming convention of curl.
- The old parameter "-validate" is a now a no-op.
Per default, all ns_http requests to HTTPS servers are now validated
- Store certificates in directory ${NSHOME}/certificates instead of
${NSHOME}/etc
- New configuration parameter "CApath" and "CAfile" for the "httpclient"
section of a server to specify default locations for certificate validation. It
is possible to override these values via parameters to "ns_http run" and
"ns_http queue".
Default configuration:
ns/${server}/httpclient {
ns_param CAfile ... ;# default ${NSHOME}/ca-bundle.crt
ns_param CApath ... ;# default ${NSHOME}/certificates
}
* "CAfile" points to a .pem file containing established root certificates,
often named "ca-bundle.crt". This file contains multiple of these certificates.
The version shipped with NaviServer is based on Mozilla's root certificates.
Also, many operating systems provide these certificates (e.g., on Ubuntu
/etc/ssl/certs/ca-certificates.crt). One can certainly use various sources,
e.g. via symbolic links or configuration parameters. The file can be manually
updated e.g. via
curl https://curl.se/ca/cacert.pem -o /usr/local/ns/ca-bundle.crt
* "CApath" points to a directory containing CA certificates in PEM
format. Each of the files must contain exactly one CA certificate (OpenSSL
requirement).
It is possible to add self-signed certificates to this directory to
connect via ns_http with an HTTPS URL to this server, after running
openssl rehash ${NSHOME}/certificates
The rehash operation is performed automatically in the installation
process.
- New configuration parameter "insecure" for the "httpclient" section of a
server
The Most Dangerous Code in the World: Validating SSL Certificates in
Non-Browser Software
https://www.cs.utexas.edu/~shmat/shmat_ccs12.pdf
- Added certificate settings to sample configuration files nsd-config.tcl and
openacs-config.tcl
- Minor cleanup of Makefiles (improve consistency and configurability)
- similar changes for "ns_connchan connect|open" will follow
_______________________________________________
naviserver-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/naviserver-devel