seckit/test-cert.cjs
cheney 32626c84a6
All checks were successful
Build and Deploy / build (push) Successful in 56s
一些证书测试代码
2026-04-24 15:52:59 +08:00

160 lines
4.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 测试证书模块 - 使用 CommonJS 模块系统
const forge = require('node-forge');
// 直接测试证书生成功能
console.log('=== 测试证书模块功能 ===');
// 生成随机的序列号
const generateSerialNumber = () => {
return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER).toString();
};
// 测试生成根证书
console.log('\n1. 测试生成根证书');
try {
// 生成密钥对
const keys = forge.pki.rsa.generateKeyPair(2048);
// 创建证书
const cert = forge.pki.createCertificate();
// 设置版本
cert.version = 3;
// 设置序列号
cert.serialNumber = generateSerialNumber();
// 设置主题和颁发者(根证书自己颁发自己)
const attrs = [
{ name: 'commonName', value: 'Root CA' },
{ name: 'countryName', value: 'CN' },
{ shortName: 'ST', value: 'Beijing' },
{ name: 'localityName', value: 'Beijing' },
{ name: 'organizationName', value: 'Security Kit' },
{ shortName: 'OU', value: 'Root Certificate Authority' }
];
cert.setSubject(attrs);
cert.setIssuer(attrs);
// 设置公钥
cert.publicKey = keys.publicKey;
// 设置有效期
const notBefore = new Date();
const notAfter = new Date();
notAfter.setFullYear(notBefore.getFullYear() + 10); // 10年有效期
cert.validity.notBefore = notBefore;
cert.validity.notAfter = notAfter;
// 添加扩展
cert.setExtensions([
{
name: 'basicConstraints',
cA: true
},
{
name: 'keyUsage',
digitalSignature: true,
keyCertSign: true,
cRLSign: true
}
]);
// 使用私钥自签名
cert.sign(keys.privateKey, forge.md.sha256.create());
// 转换为PEM格式
const certPem = forge.pki.certificateToPem(cert);
console.log('✓ 根证书生成成功!');
console.log('根证书内容前200字符:', certPem.substring(0, 200) + '...');
// 测试生成应用证书
console.log('\n2. 测试生成应用证书');
// 生成应用证书的密钥对
const appKeys = forge.pki.rsa.generateKeyPair(2048);
// 创建应用证书
const appCert = forge.pki.createCertificate();
// 设置版本
appCert.version = 3;
// 设置序列号
appCert.serialNumber = generateSerialNumber();
// 设置主题
const appAttrs = [
{ name: 'commonName', value: 'test.example.com' },
{ name: 'countryName', value: 'CN' },
{ shortName: 'ST', value: 'Beijing' },
{ name: 'localityName', value: 'Beijing' },
{ name: 'organizationName', value: 'Security Kit' },
{ shortName: 'OU', value: 'Application' }
];
appCert.setSubject(appAttrs);
// 设置颁发者(根证书)
appCert.setIssuer(cert.subject.attributes);
// 设置公钥
appCert.publicKey = appKeys.publicKey;
// 设置有效期
const appNotBefore = new Date();
const appNotAfter = new Date();
appNotAfter.setFullYear(appNotBefore.getFullYear() + 5); // 5年有效期
appCert.validity.notBefore = appNotBefore;
appCert.validity.notAfter = appNotAfter;
// 添加扩展
appCert.setExtensions([
{
name: 'basicConstraints',
cA: false
},
{
name: 'keyUsage',
digitalSignature: true,
keyEncipherment: true
},
{
name: 'extendedKeyUsage',
serverAuth: true,
clientAuth: true
}
]);
// 使用根证书的私钥签名
appCert.sign(keys.privateKey, forge.md.sha256.create());
// 转换为PEM格式
const appCertPem = forge.pki.certificateToPem(appCert);
console.log('✓ 应用证书生成成功!');
console.log('应用证书内容前200字符:', appCertPem.substring(0, 200) + '...');
// 测试证书解析
console.log('\n3. 测试证书解析');
// 解析根证书
const parsedRootCert = forge.pki.certificateFromPem(certPem);
console.log('✓ 根证书解析成功!');
console.log('根证书主题:', parsedRootCert.subject.getField('CN').value);
// 解析应用证书
const parsedAppCert = forge.pki.certificateFromPem(appCertPem);
console.log('✓ 应用证书解析成功!');
console.log('应用证书主题:', parsedAppCert.subject.getField('CN').value);
console.log('应用证书颁发者:', parsedAppCert.issuer.getField('CN').value);
console.log('\n=== 所有测试通过!===');
} catch (error) {
console.error('测试失败:', error.message);
console.error(error.stack);
}