Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

ssl-validator

Package Overview
Dependencies
Maintainers
8
Versions
13
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

ssl-validator - npm Package Compare versions

Comparing version 1.0.5 to 1.0.6

10

CHANGELOG.md
# SSL Validator Changelog
## 1.0.6 - 2020-02-25
- update ramda dependency to `0.27.0`
- added missing async keyword to the function validateSSLKey
- fixed domainRegTest and added tests around validation of domains to wildcard certs
- Update development/test dependencies
- Update pem dependency
- Add Node 11, 12, and 13 to travis.yml
- Remove Node 8 and 9 from travis.yml (since mocha/eslint no longer support them). Note that ssl-validator itself still works on node 8/9.
***

@@ -4,0 +14,0 @@

7

lib/utils.js

@@ -26,4 +26,4 @@ const {

const domainRegTest = /^[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9]$)/;
const checkDomainTest = domainRegTest.test.bind(domainRegTest);
const domainSegmentTest = /^[A-Za-z0-9-]{1,63}$/;
const checkDomainSegment = domainSegmentTest.test.bind(domainSegmentTest);

@@ -36,3 +36,4 @@ const isDomainMatch = curry((toCheck, base) => {

if (!toCheck.endsWith(base)) { return false; } // it's not a subdomain
if (!checkDomainTest(toCheck.slice(0, -base.length))) { return false; }
const domainSegment = toCheck.slice(0, -base.length);
if (domainSegment.startsWith('-') || domainSegment.endsWith('-') || !checkDomainSegment(domainSegment)) { return false; }
return true;

@@ -39,0 +40,0 @@ });

@@ -42,3 +42,3 @@ const { find, trim, isNil, mergeRight } = require('ramda');

const validateSSLKey = (key) => {
const validateSSLKey = async (key) => {
key = trim(String(key));

@@ -45,0 +45,0 @@ if (!isKeyValidFormat(key)) {

{
"name": "ssl-validator",
"version": "1.0.5",
"version": "1.0.6",
"description": "Validator for certificates, bundles, and keys",

@@ -40,10 +40,10 @@ "main": "lib/index.js",

"dependencies": {
"pem": "^1.14.2",
"ramda": "^0.26.1"
"pem": "^1.14.4",
"ramda": "^0.27.0"
},
"devDependencies": {
"@losant/eslint-config-losant": "^1.3.6",
"husky": "^2.7.0",
"lint-staged": "^8.2.1",
"mocha": "^5.2.0",
"@losant/eslint-config-losant": "^1.3.11",
"husky": "^4.2.3",
"lint-staged": "^10.0.8",
"mocha": "^7.0.1",
"should": "^13.2.3"

@@ -58,3 +58,8 @@ },

}
},
"mocha": {
"reporter": "spec",
"recursive": true,
"check-leaks": true
}
}

@@ -37,2 +37,4 @@ # Node SSL Validator

```javascript
const { validateSSL } = require('ssl-validator');
await validateSSL(cert, options);

@@ -53,2 +55,4 @@ ```

```javascript
const { validateSSLCert } = require('ssl-validator');
await validateSSLCert(cert, options);

@@ -66,2 +70,4 @@ ```

```javascript
const { validateSSLKey } = require('ssl-validator');
await validateSSLKey(key);

@@ -75,2 +81,4 @@ ```

```javascript
const { validateCertBundle } = require('ssl-validator');
await validateCertBundle(cert, bundle, options);

@@ -88,2 +96,4 @@ ```

```javascript
const { validateCertKeyPair } = require('ssl-validator');
await validateCertKeyPair(cert, key, options);

@@ -101,2 +111,4 @@ ```

```javascript
const { validateCertToDomain } = require('ssl-validator');
await validateCertToDomain(cert, domain, options);

@@ -123,2 +135,4 @@ ```

```javascript
const { isValidSSL } = require('ssl-validator');
if (!(await isValidSSL(cert))) {

@@ -125,0 +139,0 @@ return { message: 'Sorry, the certificate supplied is not valid.' };

@@ -0,1 +1,52 @@

module.exports.validWildCardKey = `-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC6iTFLz75M9XxU
TdX/xIh3mQSchRPQI5b3F6NbIfNxGCif8+cJznwMn54mMA+qeYFvyXUBIB8blU6O
3/xx3NpbplL6QWI+Ck07ZdCPZp33tPN65DZ/7SbWXVi4szzQlPZhlmFiIPCqlRU8
Lo/FcF/JXAHjk+1tJ61ZWhiqM3721h8L4/o3nkDjtVgr0rn1t1yr5fgGcB/HaB70
oNEOBh17cRB4yKBej5lnOH/U9cDXPsUBLZaWOJ2IQX4NZZwYnINfDa97xkLYrwC0
Z+e6EVxXyAgHMRM29KDfuwLoFGuOEj3xX0G8JlF9uYegy3u4y486B2/HA+NagtW0
wUflqwBPAgMBAAECggEAH8DC13jhmBAhvegSCZvW7yTpGAu/N6sXQ7COajD5U8Md
Bz1pks3HaA6zySRdRlOwqOrONAbXxMZBvSh7vJYvxXImpdsDcjQmuXm3avG46jWv
TLgUXuprtgnl1GsOayMwXaRPp3ib/y2pk7kJWD6sz4YN/ENuIyqh45fmovJpJnM6
Fk7QMQrVjh+VCeNBSfPPTe2DIMlX9L7ZfpY9d3jHJCv1wv7fyqbnJHelEGbBhMWr
d6f6g+kxcKrc+BMz6/XpBnvckVZZ9WP3Dr4DKVoblgidGYpaOWFzF3S07acReBtP
HhQwCZAsab/UTd7oQWhabkOkE+lUf+CIa9UszjBwYQKBgQDkHs/5giav9swujerK
q6jKmgTedVVoa8YABubXBJ19SZcFfIVu+psDFccegfD6Ak0eiT8VpGDtZVmsDiuI
yI+LliZ4ISC3n1IxiEdWy6kdTEHHuhGVzMGhdpjB36rBaKQWguZPBOMTIeyb+tqn
+z3Qp7tOJIQSrJOVayL94pM06wKBgQDRVVR5I7prupWP1hMAs5bZQiRD67B/xw3U
dGMklm/or7ceYHtNz2Dy8qcKrJvozfyRU5iKCMvoc8PNKBGwMxhTv5y0hunxZC8W
hbBbKEwLo8xOYyo8ESvTykBaIQMoAhLXc4lr7d9U5QUMYL/yTIwYjnyK1d5wu2dl
dCv/N+9ZLQKBgQCdKwF9VYeUGsTImmyW4Dg2BnGuV0bV39MWN6sZn4tmQ6pyVD2W
ncDpGjsLMNm3VpiNnl/BaHSDex2SJl0mK5CCypuMjr585J77k3obOcw1bFGx6ues
vtr1hMFwacq64H6VJ/DHpoVQrEHZoba+n6ISPU4WY6A/QXmZK6x7IXzsqwKBgGZT
s+tTj7lBiAK7vqZFI6QoNNoOyERt5VDJY/1qnGG+I2FyAFRU3ytjekw5fC0dJC1W
E+bFzgdfL4OF5r+e+nFV5SBKIumg83Oq/j5RQHsgIqrexrJ+IlJxN2vXX1ebS+KN
08syiE1TdlhKowmqaYFHhZHIYefxc+WgGDG2AgYxAoGACmN1Fc/I0zVCpD9trh2S
fI9hdC4kp/cDNfPaiwrcC4bjEJgwCrCpOilAaQ81oQ7Y1S1e5BSbi37x4am1HFSH
QKRxcbdxtsdjF3+YxI6r3FUvqQVNflILl+XORntuEV53jMnzPsqtcIhF3yeoAxBw
UuByDE2vZ2EE7Scz2CHYL0E=
-----END PRIVATE KEY-----`;
module.exports.validWildCardCert = `-----BEGIN CERTIFICATE-----
MIIDiDCCAnACCQC/5MoAGtoZyTANBgkqhkiG9w0BAQsFADCBhTELMAkGA1UEBhMC
VVMxCzAJBgNVBAgMAk9IMRMwEQYDVQQHDApDaW5jaW5uYXRpMQ8wDQYDVQQKDAZM
b3NhbnQxDTALBgNVBAsMBFRlc3QxEjAQBgNVBAMMCSoueHh4LmNvbTEgMB4GCSqG
SIb3DQEJARYRbXllbWFpbEBnbWFpbC5jb20wHhcNMjAwMjI1MjMxODE5WhcNMjEw
MjI0MjMxODE5WjCBhTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk9IMRMwEQYDVQQH
DApDaW5jaW5uYXRpMQ8wDQYDVQQKDAZMb3NhbnQxDTALBgNVBAsMBFRlc3QxEjAQ
BgNVBAMMCSoueHh4LmNvbTEgMB4GCSqGSIb3DQEJARYRbXllbWFpbEBnbWFpbC5j
b20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6iTFLz75M9XxUTdX/
xIh3mQSchRPQI5b3F6NbIfNxGCif8+cJznwMn54mMA+qeYFvyXUBIB8blU6O3/xx
3NpbplL6QWI+Ck07ZdCPZp33tPN65DZ/7SbWXVi4szzQlPZhlmFiIPCqlRU8Lo/F
cF/JXAHjk+1tJ61ZWhiqM3721h8L4/o3nkDjtVgr0rn1t1yr5fgGcB/HaB70oNEO
Bh17cRB4yKBej5lnOH/U9cDXPsUBLZaWOJ2IQX4NZZwYnINfDa97xkLYrwC0Z+e6
EVxXyAgHMRM29KDfuwLoFGuOEj3xX0G8JlF9uYegy3u4y486B2/HA+NagtW0wUfl
qwBPAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAKnGjfntho1liTz/7+D/B5/xmEFN
kYGpME7lhKWyep83ycMAVKi+wouDh6XiQ9EfUYvzfthD89qNxFvX/zdWWk1oaSR2
xGNmrU0B8V+TbCxHvTS13B07HU+Pj4CScFVrkLh4TLKQReDmaSHvj/l2YlOIFFs+
Xk84rWz66PB6+jD7K2p3OhbyicygWAw4O1oOtsH/SU6ER4w7c4a0c4fHesf/9Fjl
1JjW/B+Zd2uyIq6cJ7386bJamcufCuigO5iV0CmN+lmq3Pui/ulktZH5v4AhJiwT
sc3VIgKc8Q/H0CEONLX4hX8Hu1ucRhiIGcTT+x5N9tEr9i4BVGSrr6T2Hdk=
-----END CERTIFICATE-----`;
module.exports.validCert = `-----BEGIN CERTIFICATE-----

@@ -2,0 +53,0 @@ MIIDBzCCAe+gAwIBAgIJAPb5ShpCQoPwMA0GCSqGSIb3DQEBBQUAMBoxGDAWBgNV

@@ -9,3 +9,5 @@ const should = require('should');

badCert,
badKey
badKey,
validWildCardCert,
validWildCardKey
} = require('./__fixtures__/valid-ssl');

@@ -32,2 +34,13 @@

});
it('should validate with wildcard cert', async () => {
(await Validation.isValidSSL(validWildCardCert, { key: validWildCardKey, domain: 'm.xxx.com', skipDateValidation: false })).should.be.true();
(await Validation.isValidSSL(validWildCardCert, { key: validWildCardKey, domain: 'xxx.com', skipDateValidation: false })).should.be.false();
(await Validation.isValidSSL(validWildCardCert, { key: validWildCardKey, domain: '.xxx.com', skipDateValidation: false })).should.be.false();
(await Validation.isValidSSL(validWildCardCert, { key: validWildCardKey, domain: 'foo.bar.xxx.com', skipDateValidation: false })).should.be.false();
(await Validation.isValidSSL(validWildCardCert, { key: validWildCardKey, domain: 'foobar.xxx.com', skipDateValidation: false })).should.be.true();
(await Validation.isValidSSL(validWildCardCert, { key: validWildCardKey, domain: '-foo.xxx.com', skipDateValidation: false })).should.be.false();
(await Validation.isValidSSL(validWildCardCert, { key: validWildCardKey, domain: '-foo-.xxx.com', skipDateValidation: false })).should.be.false();
(await Validation.isValidSSL(validWildCardCert, { key: validWildCardKey, domain: 'foo-.xxx.com', skipDateValidation: false })).should.be.false();
(await Validation.isValidSSL(validWildCardCert, { key: validWildCardKey, domain: ' .xxx.com', skipDateValidation: false })).should.be.false();
});
});

@@ -55,42 +68,33 @@ describe('#isValid function should return true', () => {

should.exist(result);
result.issuer.should.deepEqual({
country: '',
state: '',
locality: '',
organization: '',
organizationUnit: '',
commonName: 'mycustomguy.com',
dc: ''
});
});
it('#validateSSLCert should throw error when formatting is wrong', async () => {
let error;
try {
await Validation.validateSSLCert('');
} catch (e) {
error = e;
}
error.message.should.equal('Certificate must start and end with proper formatting.');
await Validation.validateSSLCert('').should.be.rejectedWith({
message: 'Certificate must start and end with proper formatting.'
});
});
it('#validateSSLCert should throw error when formatted correctly but cert is still bad', async () => {
let error;
try {
await Validation.validateSSLCert(badCert);
} catch (e) {
error = e;
}
should.exist(error.message);
await Validation.validateSSLCert(badCert).should.be.rejected();
});
it('#validateSSLKey', async () => {
const result = await Validation.validateSSLKey(validKey);
should.exist(result);
result.should.deepEqual({
modulus: 'B0CBB05C2655CA93076A298B2386E0D1FEF8647E062E5293317B1A4BBE21E4693367E6C4B1C983AE8C8CEE03D7128735F1D7FE79E70A1B5C3453D820B7EF683AA743B970810D03F29B0DA8337F1D84BEF37E640846CA812424B4CE1522A3F5DBE85E789E5172201B7A028CA8A49141E3EAC90FF2F180F60134A20CBF811CF26217B4A9BA51592FDDF4F1DB776F88BBD5EFD227127C8EDFA56AB3E901E7F29F29669EAB3A8D6396B7CF74DF3683BEFE86E4D1AC99138A68FAA93194B1290BC25F4DFDF517686A9C2895B532C15851A2C5BAB2199155EED2700CBCD1FB2FBCAB0E49C3F17AFDD47119085F187681BB5834FC13787528BB65D8D558899A6B550147'
});
});
it('#validateSSLKey should throw error when formatting is wrong', async () => {
let error;
try {
await Validation.validateSSLKey('');
} catch (e) {
error = e;
}
error.message.should.equal('Key must start and end with proper formatting.');
await Validation.validateSSLKey('').should.be.rejectedWith({
message: 'Key must start and end with proper formatting.'
});
});
it('#validateSSLKey should throw error when formatted correctly but key is still bad', async () => {
let error;
try {
await Validation.validateSSLKey(badKey);
} catch (e) {
error = e;
}
should.exist(error.message);
await Validation.validateSSLKey(badKey).should.be.rejected();
});

@@ -102,9 +106,5 @@ it('#validateCertToDomain', async () => {

it('#validateCertToDomain should throw an error when it does not match', async () => {
let error;
try {
await Validation.validateCertToDomain(validCert, '*');
} catch (e) {
error = e;
}
error.message.should.equal('The certificate does not match the domain.');
await Validation.validateCertToDomain(validCert, '*').should.be.rejectedWith({
message: 'The certificate does not match the domain.'
});
});

@@ -116,9 +116,5 @@ it('#validateCertKeyPair', async () => {

it('#validateCertKeyPair should error when they do not match.', async () => {
let error;
try {
await Validation.validateCertKeyPair(validCert, nonMatchingKey);
} catch (e) {
error = e;
}
error.message.should.equal('The provided certificate and key do not match.');
await Validation.validateCertKeyPair(validCert, nonMatchingKey).should.be.rejectedWith({
message: 'The provided certificate and key do not match.'
});
});

@@ -130,11 +126,7 @@ it('#validateCertBundle', async () => {

it('#validateCertBundle should throw an error when they do not match', async () => {
let error;
try {
await Validation.validateCertBundle(validCert, validBundle);
} catch (e) {
error = e;
}
error.message.should.equal('Bundle does not match the certificate.');
await Validation.validateCertBundle(validCert, validBundle).should.be.rejectedWith({
message: 'Bundle does not match the certificate.'
});
});
});
});

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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc