Skip to content

Commit b0adcdc

Browse files
Merge pull request #31 from kaleido-io/ca-cert-debugging3
Bug Fix and Other Enhancements to CA Support for mTLS
2 parents 4c27c48 + 826dff4 commit b0adcdc

File tree

6 files changed

+37
-19
lines changed

6 files changed

+37
-19
lines changed

src/app.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import YAML from 'yamljs';
2424
import { eventEmitter as blobsEventEmitter } from './handlers/blobs';
2525
import * as eventsHandler from './handlers/events';
2626
import { eventEmitter as messagesEventEmitter } from './handlers/messages';
27-
import { genTLSContext, init as initCert, loadCAs } from './lib/cert';
27+
import { genTLSContext, init as initCert, loadPeerCAs } from './lib/cert';
2828
import { config, init as initConfig } from './lib/config';
2929
import { Logger } from './lib/logger';
3030
import RequestError, { errorHandler } from './lib/request-error';
@@ -43,7 +43,7 @@ let wss : WebSocket.Server
4343
let delegatedWebSocket: WebSocket | undefined = undefined;
4444

4545
export const refreshCACerts = async () => {
46-
await loadCAs()
46+
await loadPeerCAs()
4747
p2pServer.setSecureContext(genTLSContext())
4848
};
4949
setRefreshCACerts(refreshCACerts)

src/custom.d.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,9 @@ declare global {
2323
[s: string]: string,
2424
0: string,
2525
},
26-
client: {
27-
authorized: boolean
28-
getCertificate: () => {
29-
issuer: {
30-
O: string
31-
}
32-
},
26+
socket: {
3327
getPeerCertificate: () => {
34-
issuer: {
28+
subject: {
3529
O: string
3630
OU: string
3731
}

src/lib/cert.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,36 @@ const log = new Logger('lib/certs.ts')
2323

2424
export let key: string;
2525
export let cert: string;
26+
export let certBundle: string;
2627
export let ca: string[] = [];
2728
export let peerID: string;
2829

2930
export const init = async () => {
3031
log.debug("Reading key file");
3132
key = (await fs.readFile(path.join(utils.constants.DATA_DIRECTORY, utils.constants.KEY_FILE))).toString();
33+
log.debug("Loaded key");
3234
log.debug("Reading cert file");
3335
cert = (await fs.readFile(path.join(utils.constants.DATA_DIRECTORY, utils.constants.CERT_FILE))).toString();
36+
37+
let caCertPath = path.join(utils.constants.DATA_DIRECTORY, utils.constants.CA_FILE);
38+
if (await utils.fileExists(caCertPath)) {
39+
log.debug("Reading CA file");
40+
certBundle = (await fs.readFile(caCertPath)).toString() + cert;
41+
log.debug("Loaded CA + cert");
42+
} else {
43+
certBundle = cert;
44+
log.debug("Loaded cert");
45+
}
46+
log.debug("\n" + certBundle);
47+
48+
log.debug("Deriving peer ID from cert");
3449
const certData = utils.getCertData(cert);
3550
peerID = utils.getPeerID(certData.organization, certData.organizationUnit);
36-
await loadCAs();
51+
52+
await loadPeerCAs();
3753
};
3854

39-
export const loadCAs = async () => {
55+
export const loadPeerCAs = async () => {
4056
const peerCertsPath = path.join(utils.constants.DATA_DIRECTORY, utils.constants.PEER_CERTS_SUBDIRECTORY);
4157
log.debug(`Reading peer CAs from ${peerCertsPath}`);
4258
const peerCerts = await fs.readdir(peerCertsPath);
@@ -49,6 +65,10 @@ export const loadCAs = async () => {
4965
}
5066
}
5167
log.debug(`Loaded ${ca.length} peer certificate(s)`);
68+
for (const caCert of ca) {
69+
log.debug("Outputting CA cert");
70+
log.debug(caCert);
71+
}
5272
};
5373

5474
export const genTLSContext = () => {

src/lib/utils.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { X509 } from 'jsrsasign';
2222
import { ICertData, IFile } from './interfaces';
2323
import { Logger } from './logger';
2424
import RequestError from './request-error';
25+
import { TLSSocket } from "tls";
2526

2627
export const constants = {
2728
LOG_LEVEL: process.env.LOG_LEVEL || 'info',
@@ -149,4 +150,9 @@ export const getCertData = (cert: string): ICertData => {
149150
certData.organizationUnit = ou[1];
150151
}
151152
return certData;
152-
};
153+
};
154+
155+
export const extractPeerSenderFromRequest = (req: Request): string => {
156+
const cert = ((req.socket) as TLSSocket).getPeerCertificate();
157+
return getPeerID(cert.subject.O, cert.subject.OU);
158+
};

src/routers/api.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { v4 as uuidV4 } from 'uuid';
2222
import * as blobsHandler from '../handlers/blobs';
2323
import * as eventsHandler from '../handlers/events';
2424
import * as messagesHandler from '../handlers/messages';
25-
import { ca, cert, key, peerID } from '../lib/cert';
25+
import { ca, cert, certBundle, key, peerID } from '../lib/cert';
2626
import { config, persistPeers } from '../lib/config';
2727
import { IStatus } from '../lib/interfaces';
2828
import RequestError from '../lib/request-error';
@@ -41,7 +41,7 @@ router.get('/id', async (_req, res, next) => {
4141
res.send({
4242
id: peerID,
4343
endpoint: config.p2p.endpoint ?? `https://${config.p2p.hostname}:${config.p2p.port}`,
44-
cert
44+
cert: certBundle
4545
});
4646
} catch (err) {
4747
next(err);

src/routers/p2p.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@ router.head('/ping', (_req, res) => {
3131

3232
router.post('/messages', async (req: Request, res, next) => {
3333
try {
34-
const cert = req.client.getPeerCertificate();
35-
const sender = utils.getPeerID(cert.issuer.O, cert.issuer.OU);
34+
const sender = utils.extractPeerSenderFromRequest(req);
3635
const message = await utils.extractMessageFromMultipartForm(req);
3736
eventEmitter.emit('event', {
3837
id: uuidV4(),
@@ -48,8 +47,7 @@ router.post('/messages', async (req: Request, res, next) => {
4847

4948
router.put('/blobs/*', async (req: Request, res, next) => {
5049
try {
51-
const cert = req.client.getPeerCertificate();
52-
const sender = utils.getPeerID(cert.issuer.O, cert.issuer.OU);
50+
const sender = utils.extractPeerSenderFromRequest(req);
5351
const file = await utils.extractFileFromMultipartForm(req);
5452
const blobPath = path.join(utils.constants.RECEIVED_BLOBS_SUBDIRECTORY, sender, req.params[0]);
5553
const metadata = await blobsHandler.storeBlob(file, blobPath);

0 commit comments

Comments
 (0)