Skip to content

Commit e6a8f3c

Browse files
author
Josef Fröhle
committedSep 11, 2018
fix(package): fix fetchCertificate to list all infos
Add also the unknown oids and names fixes #196 Signed-off-by: Josef Fröhle <[email protected]>
1 parent 6975c5d commit e6a8f3c

File tree

3 files changed

+111
-11
lines changed

3 files changed

+111
-11
lines changed
 

‎lib/pem.js

+36-11
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ function createCSR (options, callback) {
286286
* can be used as with createCSR.
287287
* @static
288288
* @param {Object} [options] Optional options object
289+
* @param {String} [options.serviceCertificate] PEM encoded certificate
289290
* @param {String} [options.serviceKey] Private key for signing the certificate, if not defined a new one is generated
290291
* @param {String} [options.serviceKeyPassword] Password of the service key
291292
* @param {Boolean} [options.selfSigned] If set to true and serviceKey is not defined, use clientKey for signing
@@ -499,9 +500,11 @@ function readCertificateInfo (certificate, callback) {
499500
'-in',
500501
'--TMPFILE--'
501502
]
502-
openssl.spawnWrapper(params, certificate, function (err, code, stdout) {
503+
openssl.spawnWrapper(params, certificate, function (err, code, stdout, stderr) {
503504
if (err) {
504505
return callback(err)
506+
} else if (stderr) {
507+
return callback(stderr)
505508
}
506509
return fetchCertificateData(stdout, callback)
507510
})
@@ -555,7 +558,7 @@ function getModulus (certificate, password, hash, callback) {
555558
helper.createPasswordFile({'cipher': '', 'password': password, 'passType': 'in'}, params, delTempPWFiles[delTempPWFiles.length])
556559
}
557560

558-
openssl.spawnWrapper(params, certificate, function (sslErr, code, stdout) {
561+
openssl.spawnWrapper(params, certificate, function (sslErr, code, stdout, stderr) {
559562
function done (err) {
560563
if (err) {
561564
return callback(err)
@@ -570,7 +573,7 @@ function getModulus (certificate, password, hash, callback) {
570573
}
571574
}
572575
helper.deleteTempFiles(delTempPWFiles, function (fsErr) {
573-
done(sslErr || fsErr)
576+
done(sslErr || fsErr || stderr)
574577
})
575578
})
576579
}
@@ -591,9 +594,11 @@ function getDhparamInfo (dh, callback) {
591594
'--TMPFILE--'
592595
]
593596

594-
openssl.spawnWrapper(params, dh, function (err, code, stdout) {
597+
openssl.spawnWrapper(params, dh, function (err, code, stdout, stderr) {
595598
if (err) {
596599
return callback(err)
600+
} else if (stderr) {
601+
return callback(stderr)
597602
}
598603

599604
var result = {}
@@ -656,9 +661,11 @@ function getFingerprint (certificate, hash, callback) {
656661
'-' + hash
657662
]
658663

659-
openssl.spawnWrapper(params, certificate, function (err, code, stdout) {
664+
openssl.spawnWrapper(params, certificate, function (err, code, stdout, stderr) {
660665
if (err) {
661666
return callback(err)
667+
} else if (stderr) {
668+
return callback(stderr)
662669
}
663670
var match = stdout.match(/Fingerprint=([0-9a-fA-F:]+)$/m)
664671
if (match) {
@@ -825,9 +832,9 @@ function checkCertificate (certificate, passphrase, callback) {
825832
helper.createPasswordFile({'cipher': '', 'password': passphrase, 'passType': 'in'}, params, delTempPWFiles[delTempPWFiles.length])
826833
}
827834

828-
openssl.spawnWrapper(params, certificate, function (sslErr, code, stdout) {
835+
openssl.spawnWrapper(params, certificate, function (sslErr, code, stdout, stderr) {
829836
function done (err) {
830-
if (err) {
837+
if (err && err.trim() !== 'verify OK') {
831838
return callback(err)
832839
}
833840
var result
@@ -843,7 +850,7 @@ function checkCertificate (certificate, passphrase, callback) {
843850
callback(null, result)
844851
}
845852
helper.deleteTempFiles(delTempPWFiles, function (fsErr) {
846-
done(sslErr || fsErr)
853+
done(sslErr || fsErr || stderr)
847854
})
848855
})
849856
}
@@ -925,7 +932,7 @@ function verifySigningChain (certificate, ca, callback) {
925932
// certificate incl. intermediate certificates
926933
params.push('--TMPFILE--')
927934

928-
openssl.spawnWrapper(params, files, function (err, code, stdout) {
935+
openssl.spawnWrapper(params, files, function (err, code, stdout, stderr) {
929936
if (err) {
930937
return callback(err)
931938
}
@@ -945,13 +952,23 @@ function fetchCertificateData (certData, callback) {
945952
var validity = {}
946953
var san
947954

955+
var ky, i
956+
948957
// serial
949958
if ((serial = certData.match(/\s*Serial Number:\r?\n?\s*([^\r\n]*)\r?\n\s*\b/)) && serial.length > 1) {
950959
certValues.serial = serial[1]
951960
}
952961

953-
if ((subject = certData.match(/\s*Subject:\r?\n(\s*((C|L|O|OU|ST|CN|DC|emailAddress)\s=\s[^\r\n]+\r?\n))*\s*\b/)) && subject.length > 1) {
962+
if ((subject = certData.match(/\s*Subject:\r?\n(\s*(([a-zA-Z0-9.]+)\s=\s[^\r\n]+\r?\n))*\s*\b/)) && subject.length > 1) {
954963
subject = subject[0]
964+
tmp = matchAll(subject, /\s([a-zA-Z0-9.]+)\s=\s([^\r\n].*)/g)
965+
for (i = 0; i < tmp.length; i++) {
966+
ky = tmp[i][1].toString()
967+
if (ky.match('(C|ST|L|O|OU|CN|emailAddress|DC)')) {
968+
continue
969+
}
970+
certValues[ky] = tmp[i][2].toString()
971+
}
955972

956973
// country
957974
tmp = subject.match(/\sC\s=\s([^\r\n].*?)[\r\n]/)
@@ -1026,8 +1043,16 @@ function fetchCertificateData (certData, callback) {
10261043
}) : tmp[0][1]) : ''
10271044
}
10281045

1029-
if ((issuer = certData.match(/\s*Issuer:\r?\n(\s*(C|L|O|OU|ST|CN|DC|emailAddress)\s=\s[^\r\n].*\r?\n)*\s*\b/)) && issuer.length > 1) {
1046+
if ((issuer = certData.match(/\s*Issuer:\r?\n(\s*([a-zA-Z0-9.]+)\s=\s[^\r\n].*\r?\n)*\s*\b/)) && issuer.length > 1) {
10301047
issuer = issuer[0]
1048+
tmp = matchAll(issuer, /\s([a-zA-Z0-9.]+)\s=\s([^\r\n].*)/g)
1049+
for (i = 0; i < tmp.length; i++) {
1050+
ky = tmp[i][1].toString()
1051+
if (ky.match('(C|ST|L|O|OU|CN|emailAddress|DC)')) {
1052+
continue
1053+
}
1054+
certValues.issuer[ky] = tmp[i][2].toString()
1055+
}
10311056

10321057
// country
10331058
tmp = issuer.match(/\sC\s=\s([^\r\n].*?)[\r\n]/)

‎test/fixtures/pem196.pem

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIGFjCCA/6gAwIBAgIIJ5ucCoLSHoowDQYJKoZIhvcNAQELBQAwSzEsMCoGA1UE
3+
AwwjRW50aWRhZCBDZXJ0aWZpY2Fkb3JhIFB1YmxpY2EgQURTSUIxDjAMBgNVBAoM
4+
BUFEU0lCMQswCQYDVQQGEwJCTzAeFw0xODA0MTkyMjAxMzFaFw0xODA0MjIyMjAx
5+
MzFaME0xCzAJBgNVBC4TAkNJMRswGQYDVQQDDBJJTFNFIFNJTEVTIEJFQ0VSUkEx
6+
CzAJBgNVBAYTAkJPMRQwEgYHKwYBAQEBAAwHNDcxMjI4NjCCASIwDQYJKoZIhvcN
7+
AQEBBQADggEPADCCAQoCggEBANU/nRjNgV359qnNoeGFDc54ZSu+ewUgerYa3N0Q
8+
z67vm1RihYo5dWgZRb4SSWMh9fJxSEjr2DpWOpOwhOGj1+0LGdHFVeDRyaF2ftEE
9+
TXtR3Zif//uYQe4IkIGPBovqhbMMChMoR6yEQp41nZXdy1MUFAUc/jv20uKy2kwW
10+
EGbMlhZolZTxb+usyFPBXswmd2zyoiQc9rza36aaXwFo5kX5g5h1ZICdWFybuexW
11+
B3PjU7zc/MgSD2fUeq6DZnQZuhjQEe6IeiOALsDPFIFmxA71CA7elfIPOi/FuyCb
12+
T9nytF5aIKzoXqX+FgzpRJnJnLMYju8GCPtXHd15eba9MOUCAwEAAaOCAfowggH2
13+
MIGFBggrBgEFBQcBAQR5MHcwQwYIKwYBBQUHMAKGN2h0dHBzOi8vd2VidGVzdC5m
14+
aXJtYWRpZ2l0YWwuYm8vdGVzdGZpcm1hZGlnaXRhbF9iby5wZW0wMAYIKwYBBQUH
15+
MAGGJGh0dHA6Ly93ZWJ0ZXN0LmZpcm1hZGlnaXRhbC5iby9vY3NwLzAdBgNVHQ4E
16+
FgQUWIM6e2y6hsQpY5q9mwW1Pi12puUwHwYDVR0jBBgwFoAUdaV7ANOxKdxh5iBJ
17+
pnkWLGdmvUIwVAYDVR0gBE0wSzBJBgxgRAAAAAEOAQIAAQEwOTA3BggrBgEFBQcC
18+
ARYraHR0cHM6Ly93ZWJ0ZXN0LmZpcm1hZGlnaXRhbC5iby9lY2Fkc2liLnBkZjCB
19+
nAYDVR0fBIGUMIGRMIGOoDugOYY3aHR0cHM6Ly93ZWJ0ZXN0LmZpcm1hZGlnaXRh
20+
bC5iby90ZXN0ZmlybWFkaWdpdGFsX2JvLmNybKJPpE0wSzEsMCoGA1UEAwwjRW50
21+
aWRhZCBDZXJ0aWZpY2Fkb3JhIFB1YmxpY2EgQURTSUIxDjAMBgNVBAoMBUFEU0lC
22+
MQswCQYDVQQGEwJCTzAOBgNVHQ8BAf8EBAMCBPAwJwYDVR0lBCAwHgYIKwYBBQUH
23+
AwIGCCsGAQUFBwMDBggrBgEFBQcDBDANBgkqhkiG9w0BAQsFAAOCAgEAT9ms6z1g
24+
ardIFD3l90bv8tug7ktK9Rp4d6DLuAjvgDN6fuXCNSwH4nydMJSUS9KlHAaBtFVD
25+
7/RLDVIcoq+FQStXuAjZnOP3fAPgnPr8601rXFhrF2cP1Z7yTR88L9SRu4Xhordl
26+
qPUiSnY1mKiwb7NvjKrFd1Md5zdAraCLtGJw8JGy/QbJIATq+spHTRb7sXnrNh++
27+
AoZOAx//8lzZkQcO8fZjwFvhXYcaRrafzKUnbU1KuTSx7KKnROzrtO8dHafiJ8/0
28+
wAWemFkV7fGSDq7IVN1YSTp46vNh4GDt9613x+vE2CLPlWATFDhC6o7b7+0J+g8q
29+
Ac0uUBzqSIhh5HRFIbSmC6o2I48JDB8bWWApjyh6rDpJhvl6cUHbyOzFSceXmf+S
30+
UPvMHk/4A1mpXyrbPCX4zkREyoydxwWNhL/QJWiXF7gKR3miXUVFIiv+RIiT97fC
31+
/GYcLF1RgJENPI7j2JFbqXGXpxoozLziESp51NxTpiusKqUQhBerq/MM97uENwX7
32+
qr1Qdti0YqKVeth7vgkzhdlSzyyNqripalR/O58uFxRSedU+qLmeT6rJW6FU7KHr
33+
Nr/lVEdzOCFyBln866lF/qN2oLkxJvJCjjuRKbgTzv7V2a5itR4B+4DMUh+iiygb
34+
aptRpqCDtfmC6IjiFUCL4RiwwyxsYgsuwsI=
35+
-----END CERTIFICATE-----

‎test/pem.spec.js

+40
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,46 @@ describe('General Tests', function () {
353353
})
354354
})
355355
})
356+
357+
it('Read CertInformation form ./test/fixtures/pem196.pem', function (done) {
358+
var certInfo = {
359+
issuer: {
360+
country: 'BO',
361+
state: '',
362+
locality: '',
363+
organization: 'ADSIB',
364+
organizationUnit: '',
365+
commonName: 'Entidad Certificadora Publica ADSIB',
366+
dc: ''
367+
},
368+
serial: '2854046357827755658 (0x279b9c0a82d21e8a)',
369+
'1.3.6.1.1.1.1.0': '#0C0734373132323836',
370+
dnQualifier: 'CI',
371+
country: 'BO',
372+
state: '',
373+
locality: '',
374+
organization: '',
375+
organizationUnit: '',
376+
commonName: 'ILSE SILES BECERRA',
377+
emailAddress: '',
378+
dc: '',
379+
validity: {
380+
start: 1524175291000,
381+
end: 1524434491000
382+
},
383+
signatureAlgorithm: 'sha256WithRSAEncryption',
384+
publicKeySize: '2048 bit',
385+
publicKeyAlgorithm: 'rsaEncryption'
386+
}
387+
388+
var d = fs.readFileSync('./test/fixtures/pem196.pem').toString()
389+
pem.readCertificateInfo(d, function (error, data) {
390+
hlp.checkError(error)
391+
hlp.checkCertificateData(data, certInfo)
392+
hlp.checkTmpEmpty()
393+
done()
394+
})
395+
})
356396
})
357397

358398
describe('#.createCertificate tests', function () {

0 commit comments

Comments
 (0)
Please sign in to comment.