@@ -324,6 +324,10 @@ function createCertificate (options, callback) {
324
324
return
325
325
}
326
326
327
+ if ( ! options . clientKey ) {
328
+ options . clientKey = ''
329
+ }
330
+
327
331
if ( ! options . serviceKey ) {
328
332
if ( options . selfSigned ) {
329
333
options . serviceKey = options . clientKey
@@ -339,95 +343,124 @@ function createCertificate (options, callback) {
339
343
}
340
344
}
341
345
342
- var params = [ 'x509' ,
343
- '-req' ,
344
- '-' + ( options . hash || 'sha256' ) ,
345
- '-days' ,
346
- Number ( options . days ) || '365' ,
347
- '-in' ,
348
- '--TMPFILE--'
349
- ]
350
- var tmpfiles = [ options . csr ]
351
- var delTempPWFiles = [ ]
346
+ readCertificateInfo ( options . csr , function ( error2 , data2 ) {
347
+ if ( error2 ) {
348
+ return callback ( error2 )
349
+ }
352
350
353
- if ( options . serviceCertificate ) {
354
- params . push ( '-CA' )
355
- params . push ( '--TMPFILE--' )
356
- params . push ( '-CAkey' )
357
- params . push ( '--TMPFILE--' )
358
- if ( options . serial ) {
359
- params . push ( '-set_serial' )
360
- if ( helper . isNumber ( options . serial ) ) {
351
+ var params = [ 'x509' ,
352
+ '-req' ,
353
+ '-' + ( options . hash || 'sha256' ) ,
354
+ '-days' ,
355
+ Number ( options . days ) || '365' ,
356
+ '-in' ,
357
+ '--TMPFILE--'
358
+ ]
359
+ var tmpfiles = [ options . csr ]
360
+ var delTempPWFiles = [ ]
361
+
362
+ if ( options . serviceCertificate ) {
363
+ params . push ( '-CA' )
364
+ params . push ( '--TMPFILE--' )
365
+ params . push ( '-CAkey' )
366
+ params . push ( '--TMPFILE--' )
367
+ if ( options . serial ) {
368
+ params . push ( '-set_serial' )
369
+ if ( helper . isNumber ( options . serial ) ) {
361
370
// set the serial to the max lenth of 20 octets ()
362
371
// A certificate serial number is not decimal conforming. That is the
363
372
// bytes in a serial number do not necessarily map to a printable ASCII
364
373
// character.
365
374
// eg: 0x00 is a valid serial number and can not be represented in a
366
375
// human readable format (atleast one that can be directly mapped to
367
376
// the ACSII table).
368
- params . push ( '0x' + ( '0000000000000000000000000000000000000000' + options . serial . toString ( 16 ) ) . slice ( - 40 ) )
369
- } else {
370
- if ( helper . isHex ( options . serial ) ) {
371
- if ( options . serial . startsWith ( '0x' ) ) {
372
- options . serial = options . serial . substring ( 2 , options . serial . length )
373
- }
374
- params . push ( '0x' + ( '0000000000000000000000000000000000000000' + options . serial ) . slice ( - 40 ) )
377
+ params . push ( '0x' + ( '0000000000000000000000000000000000000000' + options . serial . toString ( 16 ) ) . slice ( - 40 ) )
375
378
} else {
376
- params . push ( '0x' + ( '0000000000000000000000000000000000000000' + helper . toHex ( options . serial ) ) . slice ( - 40 ) )
379
+ if ( helper . isHex ( options . serial ) ) {
380
+ if ( options . serial . startsWith ( '0x' ) ) {
381
+ options . serial = options . serial . substring ( 2 , options . serial . length )
382
+ }
383
+ params . push ( '0x' + ( '0000000000000000000000000000000000000000' + options . serial ) . slice ( - 40 ) )
384
+ } else {
385
+ params . push ( '0x' + ( '0000000000000000000000000000000000000000' + helper . toHex ( options . serial ) ) . slice ( - 40 ) )
386
+ }
387
+ }
388
+ } else {
389
+ params . push ( '-CAcreateserial' )
390
+ if ( options . serialFile ) {
391
+ params . push ( '-CAserial' )
392
+ params . push ( options . serialFile + '.srl' )
377
393
}
378
394
}
395
+ if ( options . serviceKeyPassword ) {
396
+ helper . createPasswordFile ( { 'cipher' : '' , 'password' : options . serviceKeyPassword , 'passType' : 'in' } , params , delTempPWFiles [ delTempPWFiles . length ] )
397
+ }
398
+ tmpfiles . push ( options . serviceCertificate )
399
+ tmpfiles . push ( options . serviceKey )
379
400
} else {
380
- params . push ( '-CAcreateserial ' )
381
- if ( options . serialFile ) {
382
- params . push ( '-CAserial' )
383
- params . push ( options . serialFile + '.srl' )
401
+ params . push ( '-signkey ' )
402
+ params . push ( '--TMPFILE--' )
403
+ if ( options . serviceKeyPassword ) {
404
+ helper . createPasswordFile ( { 'cipher' : '' , 'password' : options . serviceKeyPassword , 'passType' : 'in' } , params , delTempPWFiles [ delTempPWFiles . length ] )
384
405
}
406
+ tmpfiles . push ( options . serviceKey )
385
407
}
386
- if ( options . serviceKeyPassword ) {
387
- helper . createPasswordFile ( { 'cipher' : '' , 'password' : options . serviceKeyPassword , 'passType' : 'in' } , params , delTempPWFiles )
388
- }
389
- tmpfiles . push ( options . serviceCertificate )
390
- tmpfiles . push ( options . serviceKey )
391
- } else {
392
- params . push ( '-signkey' )
393
- params . push ( '--TMPFILE--' )
394
- if ( options . serviceKeyPassword ) {
395
- helper . createPasswordFile ( { 'cipher' : '' , 'password' : options . serviceKeyPassword , 'passType' : 'in' } , params , delTempPWFiles )
396
- }
397
- tmpfiles . push ( options . serviceKey )
398
- }
399
408
400
- if ( options . config ) {
401
- params . push ( '-extensions' )
402
- params . push ( 'v3_req' )
403
- params . push ( '-extfile' )
404
- params . push ( '--TMPFILE--' )
405
- tmpfiles . push ( options . config )
406
- } else if ( options . extFile ) {
407
- params . push ( '-extfile' )
408
- params . push ( options . extFile )
409
- }
409
+ if ( options . config ) {
410
+ params . push ( '-extensions' )
411
+ params . push ( 'v3_req' )
412
+ params . push ( '-extfile' )
413
+ params . push ( '--TMPFILE--' )
414
+ tmpfiles . push ( options . config )
415
+ } else if ( options . extFile ) {
416
+ params . push ( '-extfile' )
417
+ params . push ( options . extFile )
418
+ } else {
419
+ var altNamesRep = [ ]
420
+ if ( data2 && data2 . san ) {
421
+ for ( var i = 0 ; i < data2 . san . dns . length ; i ++ ) {
422
+ altNamesRep . push ( 'DNS' + '.' + ( i + 1 ) + ' = ' + data2 . san . dns [ i ] )
423
+ }
424
+ for ( var i2 = 0 ; i2 < data2 . san . ip . length ; i2 ++ ) {
425
+ altNamesRep . push ( 'IP' + '.' + ( i2 + 1 ) + ' = ' + data2 . san . ip [ i2 ] )
426
+ }
427
+ for ( var i3 = 0 ; i3 < data2 . san . email . length ; i3 ++ ) {
428
+ altNamesRep . push ( 'email' + '.' + ( i3 + 1 ) + ' = ' + data2 . san . email [ i3 ] )
429
+ }
430
+ params . push ( '-extensions' )
431
+ params . push ( 'v3_req' )
432
+ params . push ( '-extfile' )
433
+ params . push ( '--TMPFILE--' )
434
+ tmpfiles . push ( [
435
+ '[v3_req]' ,
436
+ 'subjectAltName = @alt_names' ,
437
+ '[alt_names]' ,
438
+ altNamesRep . join ( '\n' )
439
+ ] . join ( '\n' ) )
440
+ }
441
+ }
410
442
411
- if ( options . clientKeyPassword ) {
412
- helper . createPasswordFile ( { 'cipher' : '' , 'password' : options . clientKeyPassword , 'passType' : 'in' } , params , delTempPWFiles )
413
- }
443
+ if ( options . clientKeyPassword ) {
444
+ helper . createPasswordFile ( { 'cipher' : '' , 'password' : options . clientKeyPassword , 'passType' : 'in' } , params , delTempPWFiles )
445
+ }
414
446
415
- openssl . exec ( params , 'CERTIFICATE' , tmpfiles , function ( sslErr , data ) {
416
- function done ( err ) {
417
- if ( err ) {
418
- return callback ( err )
419
- }
420
- var response = {
421
- csr : options . csr ,
422
- clientKey : options . clientKey ,
423
- certificate : data ,
424
- serviceKey : options . serviceKey
447
+ openssl . exec ( params , 'CERTIFICATE' , tmpfiles , function ( sslErr , data ) {
448
+ function done ( err ) {
449
+ if ( err ) {
450
+ return callback ( err )
451
+ }
452
+ var response = {
453
+ csr : options . csr ,
454
+ clientKey : options . clientKey ,
455
+ certificate : data ,
456
+ serviceKey : options . serviceKey
457
+ }
458
+ return callback ( null , response )
425
459
}
426
- return callback ( null , response )
427
- }
428
460
429
- helper . deleteTempFiles ( delTempPWFiles , function ( fsErr ) {
430
- done ( sslErr || fsErr )
461
+ helper . deleteTempFiles ( delTempPWFiles , function ( fsErr ) {
462
+ done ( sslErr || fsErr )
463
+ } )
431
464
} )
432
465
} )
433
466
}
@@ -1127,7 +1160,7 @@ function fetchCertificateData (certData, callback) {
1127
1160
certValues . san = { }
1128
1161
1129
1162
// hostnames
1130
- tmp = pregMatchAll ( 'DNS:([^,\\r\\n].*?)[,\\r\\n]' , san )
1163
+ tmp = pregMatchAll ( 'DNS:([^,\\r\\n].*?)[,\\r\\n\\s ]' , san )
1131
1164
certValues . san . dns = tmp || ''
1132
1165
1133
1166
// IP-Addresses IPv4 & IPv6
0 commit comments