100 lines
2.7 KiB
TypeScript
100 lines
2.7 KiB
TypeScript
import { Router, Request, Response } from 'express';
|
|
import multer from 'multer';
|
|
import {
|
|
parseCertificate,
|
|
decodePfx,
|
|
matchKeyToCert,
|
|
parseCsr,
|
|
verifyChain,
|
|
} from '../services/certService';
|
|
|
|
const router = Router();
|
|
const upload = multer({
|
|
storage: multer.memoryStorage(),
|
|
limits: { fileSize: 10 * 1024 * 1024 },
|
|
});
|
|
|
|
router.post('/decode/pfx', upload.single('file'), (req: Request, res: Response) => {
|
|
try {
|
|
if (!req.file) {
|
|
res.status(400).json({ error: 'No file uploaded' });
|
|
return;
|
|
}
|
|
const password = req.body.password || '';
|
|
const result = decodePfx(req.file.buffer, password);
|
|
res.json(result);
|
|
} catch (e: any) {
|
|
const message = e.message?.includes('Invalid password')
|
|
? 'Invalid password or corrupted PFX file'
|
|
: e.message || 'Failed to decode PFX file';
|
|
res.status(400).json({ error: message });
|
|
}
|
|
});
|
|
|
|
router.post('/decode/pem', (req: Request, res: Response) => {
|
|
try {
|
|
const { pem } = req.body;
|
|
if (!pem) {
|
|
res.status(400).json({ error: 'No PEM data provided' });
|
|
return;
|
|
}
|
|
|
|
const pemRegex = /-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----/g;
|
|
const pems = pem.match(pemRegex) || [];
|
|
|
|
if (pems.length === 0) {
|
|
res.status(400).json({ error: 'No valid PEM certificates found in the input' });
|
|
return;
|
|
}
|
|
|
|
const certificates = pems.map((p: string) => parseCertificate(p));
|
|
res.json({ certificates });
|
|
} catch (e: any) {
|
|
res.status(400).json({ error: e.message || 'Failed to decode PEM' });
|
|
}
|
|
});
|
|
|
|
router.post('/match', (req: Request, res: Response) => {
|
|
try {
|
|
const { certificate, privateKey } = req.body;
|
|
if (!certificate || !privateKey) {
|
|
res.status(400).json({ error: 'Both certificate and private key are required' });
|
|
return;
|
|
}
|
|
const result = matchKeyToCert(certificate, privateKey);
|
|
res.json(result);
|
|
} catch (e: any) {
|
|
res.status(400).json({ error: e.message || 'Failed to compare key and certificate' });
|
|
}
|
|
});
|
|
|
|
router.post('/decode/csr', (req: Request, res: Response) => {
|
|
try {
|
|
const { pem } = req.body;
|
|
if (!pem) {
|
|
res.status(400).json({ error: 'No CSR data provided' });
|
|
return;
|
|
}
|
|
const result = parseCsr(pem);
|
|
res.json(result);
|
|
} catch (e: any) {
|
|
res.status(400).json({ error: e.message || 'Failed to decode CSR' });
|
|
}
|
|
});
|
|
|
|
router.post('/chain/verify', (req: Request, res: Response) => {
|
|
try {
|
|
const { pem } = req.body;
|
|
if (!pem) {
|
|
res.status(400).json({ error: 'No certificate chain provided' });
|
|
return;
|
|
}
|
|
const result = verifyChain(pem);
|
|
res.json(result);
|
|
} catch (e: any) {
|
|
res.status(400).json({ error: e.message || 'Failed to verify chain' });
|
|
}
|
|
});
|
|
|
|
export default router;
|