@ghaiklor/x509
Advanced tools
Comparing version
33
index.js
@@ -1,3 +0,4 @@ | ||
var x509 = require('./build/Release/x509'); | ||
var fs = require('fs'); | ||
// eslint-disable-next-line node/no-unpublished-require | ||
const x509 = require('./build/Release/x509'); | ||
const fs = require('fs'); | ||
@@ -13,2 +14,3 @@ exports.version = x509.version; | ||
} | ||
if (!CABundlePath) { | ||
@@ -19,3 +21,2 @@ throw new TypeError('CA Bundle path is required'); | ||
fs.stat(certPath, function (certPathErr) { | ||
if (certPathErr) { | ||
@@ -26,3 +27,2 @@ return cb(certPathErr); | ||
fs.stat(CABundlePath, function (bundlePathErr) { | ||
if (bundlePathErr) { | ||
@@ -35,4 +35,3 @@ return cb(bundlePathErr); | ||
cb(null); | ||
} | ||
catch (verificationError) { | ||
} catch (verificationError) { | ||
cb(verificationError); | ||
@@ -44,14 +43,16 @@ } | ||
exports.parseCert = function (path) { | ||
const cert = x509.parseCert(path); | ||
const extensions = {}; | ||
exports.parseCert = function (path) { | ||
var ret = x509.parseCert(path); | ||
var exts = {}; | ||
for (var key in ret.extensions) { | ||
var newkey = key.replace('X509v3', '').replace(/ /g, ''); | ||
newkey = newkey.slice(0, 1).toLowerCase() + newkey.slice(1); | ||
exts[newkey] = ret.extensions[key]; | ||
for (const key in cert.extensions) { | ||
let newKey = key.replace('X509v3', '').replace(/ /g, ''); | ||
newKey = newKey.slice(0, 1).toLowerCase() + newKey.slice(1); | ||
extensions[newKey] = cert.extensions[key]; | ||
} | ||
delete ret.extensions; | ||
ret.extensions = exts; | ||
return ret; | ||
delete cert.extensions; | ||
cert.extensions = extensions; | ||
return cert; | ||
}; |
{ | ||
"name": "@ghaiklor/x509", | ||
"version": "1.0.0", | ||
"description": "Simple X509 certificate parser.", | ||
"version": "1.1.0", | ||
"description": "Simple X509 certificate parser", | ||
"main": "index.js", | ||
"license": "MIT", | ||
"homepage": "https://github.com/ghaiklor/node-x509#readme", | ||
"author": "Colton Baker", | ||
"contributors": [ | ||
{ | ||
"email": "ghaiklor@gmail.com", | ||
"name": "Eugene Obrezkov", | ||
"email": "ghaiklor@gmail.com", | ||
"url": "https://ghaiklor.com" | ||
} | ||
], | ||
"main": "index.js", | ||
"repository": { | ||
@@ -18,14 +20,40 @@ "type": "git", | ||
}, | ||
"bugs": { | ||
"email": "ghaiklor@gmail.com", | ||
"url": "https://github.com/ghaiklor/node-x509/issues" | ||
}, | ||
"keywords": [ | ||
"x509", | ||
"parser", | ||
"openssl", | ||
"certificate", | ||
"cert" | ||
], | ||
"files": [ | ||
"include", | ||
"src", | ||
"binding.gyp", | ||
"index.js" | ||
], | ||
"engines": { | ||
"node": ">=10" | ||
}, | ||
"scripts": { | ||
"test": "node test/test" | ||
"lint": "eslint --fix .", | ||
"prepublishOnly": "npm run lint && npm run test", | ||
"test": "jest" | ||
}, | ||
"publishConfig": { | ||
"tag": "latest", | ||
"registry": "https://registry.npmjs.org", | ||
"access": "public" | ||
"dependencies": { | ||
"nan": "2.14.1" | ||
}, | ||
"license": "MIT", | ||
"dependencies": { | ||
"nan": "2.14.0" | ||
"devDependencies": { | ||
"eslint": "7.6.0", | ||
"eslint-config-standard": "14.1.1", | ||
"eslint-plugin-import": "2.22.0", | ||
"eslint-plugin-jest": "23.20.0", | ||
"eslint-plugin-node": "11.1.0", | ||
"eslint-plugin-promise": "4.2.1", | ||
"eslint-plugin-standard": "4.0.1", | ||
"jest": "26.2.2" | ||
} | ||
} |
195
README.md
@@ -1,18 +0,32 @@ | ||
node-x509 | ||
========= | ||
# node-x509 | ||
_Forked from <https://github.com/Southern/node-x509>._ | ||
_The reason behind this is that original package does not build on Node.js 12._ | ||
[](https://travis-ci.com/ghaiklor/node-x509) | ||
Simple X509 certificate parser. | ||
This fork provides a compatibility with Node.js versions later than 10. | ||
The original library seems like stopped being supported. | ||
- [node-x509](#node-x509) | ||
- [Installation](#installation) | ||
- [Usage](#usage) | ||
- [Methods](#methods) | ||
- [x509.getAltNames(`cert`)](#x509getaltnamescert) | ||
- [x509.getIssuer(`cert`)](#x509getissuercert) | ||
- [x509.getSubject(`cert`)](#x509getsubjectcert) | ||
- [x509.parseCert(`cert`)](#x509parsecertcert) | ||
- [x509.verify(`cert`, `CABundlePath`, function(err, result){ /*...*/})](#x509verifycert-cabundlepath-functionerr-result-) | ||
- [Examples](#examples) | ||
- [License](#license) | ||
## Installation | ||
From NPM *(recommended)*: `npm install @ghaiklor/x509` | ||
From NPM *(recommended)*: | ||
```shell | ||
npm install @ghaiklor/x509 | ||
``` | ||
Building and testing from source: | ||
``` | ||
sudo npm install -g node-gyp | ||
```shell | ||
npm install | ||
@@ -23,128 +37,137 @@ npm test | ||
## Usage | ||
Reading from a file: | ||
```js | ||
const x509 = require('@ghaiklor/x509'); | ||
var issuer = x509.getIssuer(__dirname + '/certs/your.crt'); | ||
const issuer = x509.getIssuer(__dirname + '/certs/your.crt'); | ||
``` | ||
Reading from a string: | ||
```js | ||
const fs = require('fs'), | ||
x509 = require('@ghaiklor/x509'); | ||
var issuer = x509.getIssuer(fs.readFileSync('./certs/your.crt').toString()); | ||
const fs = require('fs'); | ||
const x509 = require('@ghaiklor/x509'); | ||
const issuer = x509.getIssuer(fs.readFileSync('./certs/your.crt').toString()); | ||
``` | ||
## Methods | ||
**Notes:** | ||
- `cert` may be a filename or a raw base64 encoded PEM string in any of these methods. | ||
#### x509.getAltNames(`cert`) | ||
### x509.getAltNames(`cert`) | ||
Parse certificate with `x509.parseCert` and return the alternate names. | ||
```js | ||
const x509 = require('x509'); | ||
var altNames = x509.getAltNames(__dirname + '/certs/nodejitsu.com.crt'); | ||
/* | ||
altNames = [ '*.nodejitsu.com', 'nodejitsu.com' ] | ||
*/ | ||
const x509 = require('@ghaiklor/x509'); | ||
const altNames = x509.getAltNames(__dirname + '/certs/nodejitsu.com.crt'); | ||
// altNames = [ '*.nodejitsu.com', 'nodejitsu.com' ] | ||
``` | ||
#### x509.getIssuer(`cert`) | ||
### x509.getIssuer(`cert`) | ||
Parse certificate with `x509.parseCert` and return the issuer. | ||
```js | ||
const x509 = require('x509'); | ||
var issuer = x509.getIssuer(__dirname + '/certs/nodejitsu.com.crt'); | ||
/* | ||
issuer = { countryName: 'GB', | ||
stateOrProvinceName: 'Greater Manchester', | ||
localityName: 'Salford', | ||
organizationName: 'COMODO CA Limited', | ||
commonName: 'COMODO High-Assurance Secure Server CA' } | ||
*/ | ||
const x509 = require('@ghaiklor/x509'); | ||
const issuer = x509.getIssuer(__dirname + '/certs/nodejitsu.com.crt'); | ||
// issuer = { | ||
// countryName: 'GB', | ||
// stateOrProvinceName: 'Greater Manchester', | ||
// localityName: 'Salford', | ||
// organizationName: 'COMODO CA Limited', | ||
// commonName: 'COMODO High-Assurance Secure Server CA' | ||
// } | ||
``` | ||
#### x509.getSubject(`cert`) | ||
### x509.getSubject(`cert`) | ||
Parse certificate with `x509.parseCert` and return the subject. | ||
```js | ||
const x509 = require('x509'); | ||
var subject = x509.getSubject(__dirname + '/certs/nodejitsu.com.crt'); | ||
/* | ||
subject = { countryName: 'US', | ||
postalCode: '10010', | ||
stateOrProvinceName: 'NY', | ||
localityName: 'New York', | ||
streetAddress: '902 Broadway, 4th Floor', | ||
organizationName: 'Nodejitsu', | ||
organizationalUnitName: 'PremiumSSL Wildcard', | ||
commonName: '*.nodejitsu.com' } | ||
*/ | ||
const x509 = require('@ghaiklor/x509'); | ||
const subject = x509.getSubject(__dirname + '/certs/nodejitsu.com.crt'); | ||
// subject = { | ||
// countryName: 'US', | ||
// postalCode: '10010', | ||
// stateOrProvinceName: 'NY', | ||
// localityName: 'New York', | ||
// streetAddress: '902 Broadway, 4th Floor', | ||
// organizationName: 'Nodejitsu', | ||
// organizationalUnitName: 'PremiumSSL Wildcard', | ||
// commonName: '*.nodejitsu.com' | ||
// } | ||
``` | ||
#### x509.parseCert(`cert`) | ||
### x509.parseCert(`cert`) | ||
Parse subject, issuer, valid before and after date, and alternate names from certificate. | ||
```js | ||
const x509 = require('x509'); | ||
var cert = x509.parseCert(__dirname + '/certs/nodejitsu.com.crt'); | ||
/* | ||
cert = { subject: | ||
{ countryName: 'US', | ||
postalCode: '10010', | ||
stateOrProvinceName: 'NY', | ||
localityName: 'New York', | ||
streetAddress: '902 Broadway, 4th Floor', | ||
organizationName: 'Nodejitsu', | ||
organizationalUnitName: 'PremiumSSL Wildcard', | ||
commonName: '*.nodejitsu.com' }, | ||
issuer: | ||
{ countryName: 'GB', | ||
stateOrProvinceName: 'Greater Manchester', | ||
localityName: 'Salford', | ||
organizationName: 'COMODO CA Limited', | ||
commonName: 'COMODO High-Assurance Secure Server CA' }, | ||
notBefore: Sun Oct 28 2012 20:00:00 GMT-0400 (EDT), | ||
notAfter: Wed Nov 26 2014 18:59:59 GMT-0500 (EST), | ||
altNames: [ '*.nodejitsu.com', 'nodejitsu.com' ], | ||
signatureAlgorithm: 'sha1WithRSAEncryption', | ||
fingerPrint: 'E4:7E:24:8E:86:D2:BE:55:C0:4D:41:A1:C2:0E:06:96:56:B9:8E:EC', | ||
publicKey: { | ||
algorithm: 'rsaEncryption', | ||
e: '65537', | ||
n: '.......' } } | ||
*/ | ||
const x509 = require('@ghaiklor/x509'); | ||
const cert = x509.parseCert(__dirname + '/certs/nodejitsu.com.crt'); | ||
// cert = { | ||
// subject: { | ||
// countryName: 'US', | ||
// postalCode: '10010', | ||
// stateOrProvinceName: 'NY', | ||
// localityName: 'New York', | ||
// streetAddress: '902 Broadway, 4th Floor', | ||
// organizationName: 'Nodejitsu', | ||
// organizationalUnitName: 'PremiumSSL Wildcard', | ||
// commonName: '*.nodejitsu.com' | ||
// }, | ||
// issuer: { | ||
// countryName: 'GB', | ||
// stateOrProvinceName: 'Greater Manchester', | ||
// localityName: 'Salford', | ||
// organizationName: 'COMODO CA Limited', | ||
// commonName: 'COMODO High-Assurance Secure Server CA' | ||
// }, | ||
// notBefore: Sun Oct 28 2012 20:00:00 GMT-0400 (EDT), | ||
// notAfter: Wed Nov 26 2014 18:59:59 GMT-0500 (EST), | ||
// altNames: [ '*.nodejitsu.com', 'nodejitsu.com' ], | ||
// signatureAlgorithm: 'sha1WithRSAEncryption', | ||
// fingerPrint: 'E4:7E:24:8E:86:D2:BE:55:C0:4D:41:A1:C2:0E:06:96:56:B9:8E:EC', | ||
// publicKey: { | ||
// algorithm: 'rsaEncryption', | ||
// e: '65537', | ||
// n: '.......' | ||
// } | ||
// } | ||
``` | ||
### x509.verify(`cert`, `CABundlePath`, function(err, result){ /*...*/}) | ||
#### x509.verify(`cert`, `CABundlePath`, function(err, result){ /*...*/}) | ||
Performs basic certificate validation against a bundle of ca certificates. | ||
It accepts an error-first callback as first argument. If the error is null, then | ||
the certificate is valid. | ||
It accepts an error-first callback as first argument. | ||
If the error is null, then the certificate is valid. | ||
The error messages are the same returned by openssl: [x509_verify_cert_error_string](https://www.openssl.org/docs/man1.0.2/crypto/X509_STORE_CTX_get_error.html) | ||
The error messages are the same returned by `openssl`: [x509_verify_cert_error_string](https://www.openssl.org/docs/man1.0.2/crypto/X509_STORE_CTX_get_error.html) | ||
**Note:** | ||
As now, this function only accepts absolute paths to existing files as arguments | ||
As now, this function only accepts absolute paths to existing files as arguments. | ||
```js | ||
const x509 = require('x509'); | ||
const x509 = require('@ghaiklor/x509'); | ||
x509.verify( | ||
__dirname + '/certs/user.com.crt', | ||
__dirname + 'enduser-example.com.chain', | ||
function(err, result){ /*...*/} | ||
__dirname + 'end-user-example.com.chain', | ||
function(err, result) { /*...*/ } | ||
); | ||
``` | ||
## Examples | ||
Checking the date to make sure the certificate is active: | ||
```js | ||
const x509 = require('x509'); | ||
var cert = x509.parseCert('yourcert.crt'), | ||
date = new Date(); | ||
const x509 = require('@ghaiklor/x509'); | ||
const cert = x509.parseCert('your_cert.crt'); | ||
const date = new Date(); | ||
@@ -154,2 +177,3 @@ if (cert.notBefore > date) { | ||
} | ||
if (cert.notAfter < date) { | ||
@@ -163,4 +187,1 @@ // Certificate has expired. | ||
MIT | ||
#### Alternative implementation / build issues | ||
If you are suffering from hard to fix build issues, there is an alternative (pure javascript) implementation using emscripten: https://github.com/encharm/x509.js (based on node-x509, slightly different API) |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Native code
Supply chain riskContains native code (e.g., compiled binaries or shared libraries). Including native code can obscure malicious behavior.
Found 1 instance in 1 package
Mixed license
License(Experimental) Package contains multiple licenses.
Found 1 instance in 1 package
No bug tracker
MaintenancePackage does not have a linked bug tracker in package.json.
Found 1 instance in 1 package
No website
QualityPackage does not have a website.
Found 1 instance in 1 package
0
-100%0
-100%0
-100%185
12.8%1
-75%26387
-96.36%8
Infinity%8
-57.89%+ Added
- Removed
Updated