Inheritance issues with ssl_protocols and ssl_ciphers...
Maxim Dounin
mdounin at mdounin.ru
Sat Nov 12 11:37:48 UTC 2022
Hello!
On Sat, Nov 12, 2022 at 05:24:36AM -0500, wordlesswind wrote:
> Hello guys,
>
> I enabled ssl_reject_handshake in the first 443 server segment of nginx.conf
> to prevent someone from scanning the IP to detect the certificate.
>
> ```
> server {
> listen 443 ssl reuseport;
> listen [::]:443 ssl;
>
> ssl_session_cache shared:SSL:10m;
> ssl_session_timeout 1d;
>
> ssl_dhparam /root/dhparam;
>
> ssl_protocols TLSv1.2 TLSv1.3;
> ssl_ciphers TLSv1.2:!ADH:!RSA:!PSK:!SHA256:!SHA384;
>
> ssl_early_data on;
>
> ssl_reject_handshake on;
> }
> ```
>
> I then placed the real server configuration file under the conf.d folder.
>
> ```
> server {
> listen 443 ssl http2;
> listen [::]:443 ssl http2;
> server_name example.com;
> root /usr/share/nginx/html;
>
> ssl_certificate /acme.sh/example.com_ecc/fullchain.cer;
> ssl_certificate_key /acme.sh/example.com_ecc/example.com.key;
>
> ssl_certificate /acme.sh/example.com/fullchain.cer;
> ssl_certificate_key /acme.sh/example.com/example.com.key;
>
> ssl_stapling on;
> resolver 8.8.8.8 1.1.1.1 valid=300s;
> ssl_stapling_verify on;
>
> ssl_session_cache shared:SSL:10m;
> ssl_session_timeout 1d;
>
> ssl_dhparam /root/dhparam;
>
> ssl_protocols TLSv1.2 TLSv1.3;
> ssl_ciphers TLSv1.2:!ADH:!RSA:!PSK:!SHA256:!SHA384;
>
> ssl_early_data on;
[...]
> }
> ```
>
> Then I found a problem, if I turn off TLS 1.2 on the first 443 server
> segment and only use TLS 1.3, then the other servers are also TLS 1.3 only.
>
> It seems that ssl_ciphers, ssl_dhparam, ssl_early_data, ssl_protocols,
> ssl_session_cache, and ssl_session_timeout all have inheritance.
>
> Is this normal?
You are using name-based virtual servers, so nginx can only change
settings when some name is known from the client request (or a
connection). In case of HTTPS, the first name which becomes known
is the SNI server name. It is, however, only known when OpenSSL
already decides which protocol version to use (in particular,
because the SNI TLS extension is not available in some older
protocols, such as SSLv3). As such, the ssl_protocol directive
should be specified in the default server block when using
name-based virtual servers.
Similarly, SSL session reuse happens at the default server context
(since the SNI name might not be available at all during session
reuse), so ssl_session_cache needs to be specified in the default
server block as well. The same applies to ssl_session_timeout and
ssl_early_data, as both are set by OpenSSL based on the default
server context where sessions are reused. On the other hand,
BoringSSL makes it possible to set ssl_early_data in name-based
virtual servers.
Ciphers, however, are chosen after the SNI name is known (and
appropriate server certificates are set), since it is not possible
to select a cipher without the certificate being known. As such,
ssl_ciphers can be safely used in name-based virtual servers. The
same applies to ssl_dhparam.
Some basic tips about various aspects of name-based virtual server
selection can be found in the documentation here:
http://nginx.org/en/docs/http/server_names.html#virtual_server_selection
Hope this helps.
--
Maxim Dounin
http://mdounin.ru/
More information about the nginx
mailing list