]> git.kaiwu.me - nginx.git/commitdiff
OCSP: preserved serial number sign in cache keys
authorAleksei Bavshin <a.bavshin@nginx.com>
Thu, 17 Sep 2026 20:22:33 +0000 (13:22 -0700)
committerSergey Kandaurov <pluknet@nginx.com>
Thu, 5 Nov 2026 14:27:12 +0000 (18:27 +0400)
As OpenSSL does not store the sign in the ASN1_INTEGER string data,
it is not possible to distinguish positive and negative serial numbers.
While negative serials are forbidden in RFC 5280 4.1.2.2, it also says
that we SHOULD expect these from non-conforming CAs.
The solution is to use full DER-encoding of a signed integer obtained
with i2d_ASN1_INTEGER.

The change also addresses a correctness issue, as ASN1_STRING accessors
should not be used on ASN1_INTEGER.

src/event/ngx_event_openssl.h
src/event/ngx_event_openssl_stapling.c

index 010711481f1a990f07f95e2883e02cb1a4592ff4..1538cf062bdb628966d2a969d8b17132b74416bc 100644 (file)
 #endif
 
 
-#if (OPENSSL_VERSION_NUMBER < 0x1010000fL)
-#define ASN1_STRING_get0_data(x)     (x)->data
-#endif
-
-
 #if (OPENSSL_VERSION_NUMBER >= 0x30000000L && !defined SSL_get_peer_certificate)
 #define SSL_get_peer_certificate(s)  SSL_get1_peer_certificate(s)
 #endif
index 2b815ade65ee5ebde5c6e5654980193831be932d..ec44e8bc6d3dbedb7f9770f52f1e97ef84688007 100644 (file)
@@ -2669,9 +2669,9 @@ ngx_ssl_ocsp_create_key(ngx_ssl_ocsp_ctx_t *ctx)
     const X509_NAME  *name;
 
     serial = X509_get_serialNumber(ctx->cert);
-    length = ASN1_STRING_length(serial);
+    length = i2d_ASN1_INTEGER(serial, NULL);
 
-    if (length > 20) {
+    if (length <= 2 || length > 23) {
         return NGX_ERROR;
     }
 
@@ -2696,7 +2696,7 @@ ngx_ssl_ocsp_create_key(ngx_ssl_ocsp_ctx_t *ctx)
 
     p += 20;
 
-    ngx_memcpy(p, ASN1_STRING_get0_data(serial), length);
+    (void) i2d_ASN1_INTEGER(serial, &p);
 
     ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ctx->log, 0,
                    "ssl ocsp key %xV", &ctx->key);