@@ -51,6 +51,8 @@ static char *ngx_stream_ssl_password_file(ngx_conf_t *cf, ngx_command_t *cmd,
51
51
void * conf );
52
52
static char * ngx_stream_ssl_session_cache (ngx_conf_t * cf , ngx_command_t * cmd ,
53
53
void * conf );
54
+ static char * ngx_stream_ssl_ocsp_cache (ngx_conf_t * cf , ngx_command_t * cmd ,
55
+ void * conf );
54
56
static char * ngx_stream_ssl_alpn (ngx_conf_t * cf , ngx_command_t * cmd ,
55
57
void * conf );
56
58
@@ -80,6 +82,14 @@ static ngx_conf_enum_t ngx_stream_ssl_verify[] = {
80
82
};
81
83
82
84
85
+ static ngx_conf_enum_t ngx_stream_ssl_ocsp [] = {
86
+ { ngx_string ("off" ), 0 },
87
+ { ngx_string ("on" ), 1 },
88
+ { ngx_string ("leaf" ), 2 },
89
+ { ngx_null_string , 0 }
90
+ };
91
+
92
+
83
93
static ngx_conf_post_t ngx_stream_ssl_conf_command_post =
84
94
{ ngx_stream_ssl_conf_command_check };
85
95
@@ -212,6 +222,27 @@ static ngx_command_t ngx_stream_ssl_commands[] = {
212
222
offsetof(ngx_stream_ssl_srv_conf_t , crl ),
213
223
NULL },
214
224
225
+ { ngx_string ("ssl_ocsp" ),
226
+ NGX_STREAM_MAIN_CONF |NGX_STREAM_SRV_CONF |NGX_CONF_FLAG ,
227
+ ngx_conf_set_enum_slot ,
228
+ NGX_STREAM_SRV_CONF_OFFSET ,
229
+ offsetof(ngx_stream_ssl_srv_conf_t , ocsp ),
230
+ & ngx_stream_ssl_ocsp },
231
+
232
+ { ngx_string ("ssl_ocsp_responder" ),
233
+ NGX_STREAM_MAIN_CONF |NGX_STREAM_SRV_CONF |NGX_CONF_TAKE1 ,
234
+ ngx_conf_set_str_slot ,
235
+ NGX_STREAM_SRV_CONF_OFFSET ,
236
+ offsetof(ngx_stream_ssl_srv_conf_t , ocsp_responder ),
237
+ NULL },
238
+
239
+ { ngx_string ("ssl_ocsp_cache" ),
240
+ NGX_STREAM_MAIN_CONF |NGX_STREAM_SRV_CONF |NGX_CONF_TAKE1 ,
241
+ ngx_stream_ssl_ocsp_cache ,
242
+ NGX_STREAM_SRV_CONF_OFFSET ,
243
+ 0 ,
244
+ NULL },
245
+
215
246
{ ngx_string ("ssl_conf_command" ),
216
247
NGX_STREAM_MAIN_CONF |NGX_STREAM_SRV_CONF |NGX_CONF_TAKE2 ,
217
248
ngx_conf_set_keyval_slot ,
@@ -777,6 +808,7 @@ ngx_stream_ssl_create_srv_conf(ngx_conf_t *cf)
777
808
* sscf->alpn = { 0, NULL };
778
809
* sscf->ciphers = { 0, NULL };
779
810
* sscf->shm_zone = NULL;
811
+ * sscf->ocsp_responder = { 0, NULL };
780
812
*/
781
813
782
814
sscf -> handshake_timeout = NGX_CONF_UNSET_MSEC ;
@@ -792,6 +824,8 @@ ngx_stream_ssl_create_srv_conf(ngx_conf_t *cf)
792
824
sscf -> session_timeout = NGX_CONF_UNSET ;
793
825
sscf -> session_tickets = NGX_CONF_UNSET ;
794
826
sscf -> session_ticket_keys = NGX_CONF_UNSET_PTR ;
827
+ sscf -> ocsp = NGX_CONF_UNSET_UINT ;
828
+ sscf -> ocsp_cache_zone = NGX_CONF_UNSET_PTR ;
795
829
796
830
return sscf ;
797
831
}
@@ -846,6 +880,10 @@ ngx_stream_ssl_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
846
880
847
881
ngx_conf_merge_ptr_value (conf -> conf_commands , prev -> conf_commands , NULL );
848
882
883
+ ngx_conf_merge_uint_value (conf -> ocsp , prev -> ocsp , 0 );
884
+ ngx_conf_merge_str_value (conf -> ocsp_responder , prev -> ocsp_responder , "" );
885
+ ngx_conf_merge_ptr_value (conf -> ocsp_cache_zone ,
886
+ prev -> ocsp_cache_zone , NULL );
849
887
850
888
conf -> ssl .log = cf -> log ;
851
889
@@ -959,6 +997,23 @@ ngx_stream_ssl_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
959
997
}
960
998
}
961
999
1000
+ if (conf -> ocsp ) {
1001
+
1002
+ if (conf -> verify == 3 ) {
1003
+ ngx_log_error (NGX_LOG_EMERG , cf -> log , 0 ,
1004
+ "\"ssl_ocsp\" is incompatible with "
1005
+ "\"ssl_verify_client optional_no_ca\"" );
1006
+ return NGX_CONF_ERROR ;
1007
+ }
1008
+
1009
+ if (ngx_ssl_ocsp (cf , & conf -> ssl , & conf -> ocsp_responder , conf -> ocsp ,
1010
+ conf -> ocsp_cache_zone )
1011
+ != NGX_OK )
1012
+ {
1013
+ return NGX_CONF_ERROR ;
1014
+ }
1015
+ }
1016
+
962
1017
if (ngx_ssl_dhparam (cf , & conf -> ssl , & conf -> dhparam ) != NGX_OK ) {
963
1018
return NGX_CONF_ERROR ;
964
1019
}
@@ -1231,6 +1286,85 @@ ngx_stream_ssl_session_cache(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
1231
1286
}
1232
1287
1233
1288
1289
+ static char *
1290
+ ngx_stream_ssl_ocsp_cache (ngx_conf_t * cf , ngx_command_t * cmd , void * conf )
1291
+ {
1292
+ ngx_stream_ssl_srv_conf_t * sscf = conf ;
1293
+
1294
+ size_t len ;
1295
+ ngx_int_t n ;
1296
+ ngx_str_t * value , name , size ;
1297
+ ngx_uint_t j ;
1298
+
1299
+ if (sscf -> ocsp_cache_zone != NGX_CONF_UNSET_PTR ) {
1300
+ return "is duplicate" ;
1301
+ }
1302
+
1303
+ value = cf -> args -> elts ;
1304
+
1305
+ if (ngx_strcmp (value [1 ].data , "off" ) == 0 ) {
1306
+ sscf -> ocsp_cache_zone = NULL ;
1307
+ return NGX_CONF_OK ;
1308
+ }
1309
+
1310
+ if (value [1 ].len <= sizeof ("shared:" ) - 1
1311
+ || ngx_strncmp (value [1 ].data , "shared:" , sizeof ("shared:" ) - 1 ) != 0 )
1312
+ {
1313
+ goto invalid ;
1314
+ }
1315
+
1316
+ len = 0 ;
1317
+
1318
+ for (j = sizeof ("shared:" ) - 1 ; j < value [1 ].len ; j ++ ) {
1319
+ if (value [1 ].data [j ] == ':' ) {
1320
+ break ;
1321
+ }
1322
+
1323
+ len ++ ;
1324
+ }
1325
+
1326
+ if (len == 0 || j == value [1 ].len ) {
1327
+ goto invalid ;
1328
+ }
1329
+
1330
+ name .len = len ;
1331
+ name .data = value [1 ].data + sizeof ("shared:" ) - 1 ;
1332
+
1333
+ size .len = value [1 ].len - j - 1 ;
1334
+ size .data = name .data + len + 1 ;
1335
+
1336
+ n = ngx_parse_size (& size );
1337
+
1338
+ if (n == NGX_ERROR ) {
1339
+ goto invalid ;
1340
+ }
1341
+
1342
+ if (n < (ngx_int_t ) (8 * ngx_pagesize )) {
1343
+ ngx_conf_log_error (NGX_LOG_EMERG , cf , 0 ,
1344
+ "OCSP cache \"%V\" is too small" , & value [1 ]);
1345
+
1346
+ return NGX_CONF_ERROR ;
1347
+ }
1348
+
1349
+ sscf -> ocsp_cache_zone = ngx_shared_memory_add (cf , & name , n ,
1350
+ & ngx_stream_ssl_module_ctx );
1351
+ if (sscf -> ocsp_cache_zone == NULL ) {
1352
+ return NGX_CONF_ERROR ;
1353
+ }
1354
+
1355
+ sscf -> ocsp_cache_zone -> init = ngx_ssl_ocsp_cache_init ;
1356
+
1357
+ return NGX_CONF_OK ;
1358
+
1359
+ invalid :
1360
+
1361
+ ngx_conf_log_error (NGX_LOG_EMERG , cf , 0 ,
1362
+ "invalid OCSP cache \"%V\"" , & value [1 ]);
1363
+
1364
+ return NGX_CONF_ERROR ;
1365
+ }
1366
+
1367
+
1234
1368
static char *
1235
1369
ngx_stream_ssl_alpn (ngx_conf_t * cf , ngx_command_t * cmd , void * conf )
1236
1370
{
@@ -1308,6 +1442,27 @@ ngx_stream_ssl_init(ngx_conf_t *cf)
1308
1442
ngx_stream_core_main_conf_t * cmcf ;
1309
1443
1310
1444
cmcf = ngx_stream_conf_get_module_main_conf (cf , ngx_stream_core_module );
1445
+ cscfp = cmcf -> servers .elts ;
1446
+
1447
+ for (s = 0 ; s < cmcf -> servers .nelts ; s ++ ) {
1448
+
1449
+ sscf = cscfp [s ]-> ctx -> srv_conf [ngx_stream_ssl_module .ctx_index ];
1450
+
1451
+ if (sscf -> ssl .ctx == NULL ) {
1452
+ continue ;
1453
+ }
1454
+
1455
+ cscf = cscfp [s ]-> ctx -> srv_conf [ngx_stream_core_module .ctx_index ];
1456
+
1457
+ if (sscf -> ocsp ) {
1458
+ if (ngx_ssl_ocsp_resolver (cf , & sscf -> ssl , cscf -> resolver ,
1459
+ cscf -> resolver_timeout )
1460
+ != NGX_OK )
1461
+ {
1462
+ return NGX_ERROR ;
1463
+ }
1464
+ }
1465
+ }
1311
1466
1312
1467
h = ngx_array_push (& cmcf -> phases [NGX_STREAM_SSL_PHASE ].handlers );
1313
1468
if (h == NULL ) {
0 commit comments