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 naviserver-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/naviserver-devel