<div dir="ltr">Hi Nginx Devs<div><br></div><div><b>Testing done:</b><br></div><div>Ran nginx-tests. Got the same results with or without patch.</div><div><br></div><div><b>PATCH description:</b></div><div>As per RFC 8446 Section 4.2.4, server MAY (not SHOULD or MUST)</div><div>send Certificate Authorities (CAs) in the Certificate Request packet.</div><div><br></div><div>Today, Nginx makes the ssl_client_certificate directive mandatory</div><div>with ssl_verify_client. Issuers from this CA certificate file are sent to </div><div>client in the Certificate Request packet.</div><div><br></div><div>If only TLSv1.3 protocol is configured, and considering, it is not mandatory </div><div>to send CAs to clients. Nginx should make ssl_client_certificate optional.</div><div>This patch makes ssl_client_certificate optional.</div><div><br></div><div><b>Code doubts:</b></div><div>Currently I used [~NGX_SSL_TLSv1_3] to find if configured protocols have any </div><div>other value than TLSv1.3. </div><div><br></div><div>Another way to do the same is: </div><div>[NGX_CONF_BITMASK_SET|NGX_SSL_TLSv1|NGX_SSL_TLSv1_1|NGX_SSL_TLSv1_2].</div><div><br></div><div>Kindly let me know which way is more prefered.</div><div><br></div><div><br></div><div><b>PATCH:</b></div><div># HG changeset patch<br># User Praveen Chaudhary <<a href="mailto:praveen5582@gmail.com">praveen5582@gmail.com</a>><br># Date 1723406727 25200<br>#      Sun Aug 11 13:05:27 2024 -0700<br># Node ID 9006e478c2f2a2e023fba104aff9c175c3e17e49<br># Parent  b5550a7f16c795f394f9d1ac87132dd2b7ef0e41<br><br></div><div>Make ssl_client_certificate directive optional with TLSv1.3.<br><br>- As per RFC 8446 Section 4.2.4, server MAY (not SHOULD or MUST)<br>  send Certificate Authorities (CAs) in the Certificate Request<br>  packet. This makes ssl_client_certificate directive optional<br>  when only TLS 1.3 is used for mutual TLS configurations.<br><br>- Today, Nginx requires ssl_client_certificate directive to<br>  be set to CA Certificates file, if ssl_verify_client is<br>  enabled, even when using only TLS 1.3. Else Nginx does not<br>  reload or restart.<br><br>diff -r b5550a7f16c7 -r 9006e478c2f2 src/http/modules/ngx_http_ssl_module.c<br>--- a/src/http/modules/ngx_http_ssl_module.c     Fri Aug 09 19:12:26 2024 +0400<br>+++ b/src/http/modules/ngx_http_ssl_module.c    Sun Aug 11 13:05:27 2024 -0700<br>@@ -787,10 +787,16 @@<br> <br>     if (conf->verify) {<br> <br>-        if (conf->client_certificate.len == 0 && conf->verify != 3) {<br>-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,<br>-                          "no ssl_client_certificate for ssl_verify_client");<br>-            return NGX_CONF_ERROR;<br>+        if (conf->protocols & ~NGX_SSL_TLSv1_3) {<br>+            /*<br>+            For TLS 1.3, It is optional to send Certificate Authorities in<br>+            Certificate Request Packet. RFC 8446#section-4.2.4<br>+            */<br>+            if (conf->client_certificate.len == 0 && conf->verify != 3) {<br>+                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,<br>+                            "no ssl_client_certificate for ssl_verify_client");<br>+                return NGX_CONF_ERROR;<br>+            }<br>         }<br> <br>         if (ngx_ssl_client_certificate(cf, &conf->ssl,<br>diff -r b5550a7f16c7 -r 9006e478c2f2 src/mail/ngx_mail_ssl_module.c<br>--- a/src/mail/ngx_mail_ssl_module.c    Fri Aug 09 19:12:26 2024 +0400<br>+++ b/src/mail/ngx_mail_ssl_module.c    Sun Aug 11 13:05:27 2024 -0700<br>@@ -450,12 +450,19 @@<br> <br>     if (conf->verify) {<br> <br>-        if (conf->client_certificate.len == 0 && conf->verify != 3) {<br>-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,<br>-                          "no ssl_client_certificate for ssl_verify_client");<br>-            return NGX_CONF_ERROR;<br>+        if (conf->protocols & ~NGX_SSL_TLSv1_3) {<br>+            /*<br>+            For TLS 1.3, It is optional to send Certificate Authorities in<br>+            Certificate Request Packet. RFC 8446#section-4.2.4<br>+            */<br>+            if (conf->client_certificate.len == 0 && conf->verify != 3) {<br>+                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,<br>+                            "no ssl_client_certificate for ssl_verify_client");<br>+                return NGX_CONF_ERROR;<br>+            }<br>         }<br> <br>+<br>         if (ngx_ssl_client_certificate(cf, &conf->ssl,<br>                                        &conf->client_certificate,<br>                                        conf->verify_depth)<br>diff -r b5550a7f16c7 -r 9006e478c2f2 src/stream/ngx_stream_ssl_module.c<br>--- a/src/stream/ngx_stream_ssl_module.c      Fri Aug 09 19:12:26 2024 +0400<br>+++ b/src/stream/ngx_stream_ssl_module.c        Sun Aug 11 13:05:27 2024 -0700<br>@@ -932,10 +932,16 @@<br> <br>     if (conf->verify) {<br> <br>-        if (conf->client_certificate.len == 0 && conf->verify != 3) {<br>-            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,<br>-                          "no ssl_client_certificate for ssl_verify_client");<br>-            return NGX_CONF_ERROR;<br>+        if (conf->protocols & ~NGX_SSL_TLSv1_3) {<br>+            /*<br>+            For TLS 1.3, It is optional to send Certificate Authorities in<br>+            Certificate Request Packet. RFC 8446#section-4.2.4<br>+            */<br>+            if (conf->client_certificate.len == 0 && conf->verify != 3) {<br>+                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,<br>+                            "no ssl_client_certificate for ssl_verify_client");<br>+                return NGX_CONF_ERROR;<br>+            }<br>         }<br> <br>         if (ngx_ssl_client_certificate(cf, &conf->ssl,</div></div>