证书解码器 - 在线解码X.509 PEM证书
解码和检查X.509 PEM证书。查看主体、颁发者、有效期、扩展、SAN和指纹 — 100%客户端处理,数据不会发送到服务器。
常见问题
什么是证书解码器?
证书解码器是一个在线工具,用于解析X.509 PEM编码的数字证书并以人类可读的格式显示其内容。X.509证书是SSL/TLS中用于建立安全HTTPS连接的标准格式。它们使用ASN.1 DER(Distinguished Encoding Rules)编码,并以Base64编码包装在PEM(Privacy-Enhanced Mail)格式中。此工具提取关键信息,如域名(Subject)、颁发证书的证书颁发机构(Issuer)、有效期、公钥详细信息和安全扩展——无需安装OpenSSL或使用命令行工具。
如何使用此证书解码器?
1. 从.pem、.crt或.cer文件获取您的PEM证书,或从您的Web服务器或浏览器导出。2. 将PEM文本粘贴到输入文本区域。证书应以-----BEGIN CERTIFICATE-----开头,以-----END CERTIFICATE-----结尾。3. 工具会自动解码证书并显示结果——无需点击按钮。4. 查看证书摘要卡以获取快速概览(域名、颁发者、过期状态)。5. 通过详细信息、扩展和链选项卡浏览更多信息。6. 点击任何字段旁边的复制按钮复制其值。7. 对于证书链,按顺序粘贴所有证书。工具将解析每个证书并显示链层次结构。
我的证书数据安全吗?会发送到服务器吗?
您的证书数据100%安全,永远不会离开您的浏览器。所有证书解析——ASN.1解码、扩展提取、指纹计算——完全在客户端使用JavaScript执行。该工具使用@peculiar/x509库进行ASN.1解析,使用浏览器原生的Web Crypto API进行指纹计算。没有数据传输到任何服务器,没有分析工具跟踪您的证书内容,除了浏览器标签页的内存之外,没有数据存储在任何地方。
PEM和DER格式有什么区别?
DER(Distinguished Encoding Rules)是根据ASN.1规则对X.509证书数据进行编码的原始二进制格式。它是一种紧凑的二进制表示,人类不可读。PEM(Privacy-Enhanced Mail)是围绕DER数据的基于文本的包装器。它将DER字节进行Base64编码,并添加-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----标记。PEM是证书交换中最常见的格式,因为它可以安全地作为文本复制和粘贴,嵌入配置文件中,并通过基于文本的协议传输。此工具接受PEM格式。
什么是证书链?此工具如何处理它?
证书链(或信任链)是将网站的叶证书链接到受信任的根证书颁发机构(CA)的证书序列。链通常由以下部分组成:1)叶证书——包含域名的服务器自身证书,2)中间CA证书——由根CA颁发以委派签名权限的证书,3)根CA证书——受信任的证书颁发机构的自签名证书。当您粘贴包含多个证书的PEM块时,此工具会解析每个证书并按链顺序显示它们,识别每个证书的位置(叶、中间、根)。
什么是X.509 v3扩展?
X.509 v3扩展是证书中传达附加信息的可选字段。常见扩展包括:用于附加域名和IP的主体备用名称(SAN),用于允许的加密操作的密钥用途(数字签名、密钥加密),用于特定目的(如TLS服务器身份验证或代码签名)的扩展密钥用途,用于指示证书是否为CA的基本约束,用于构建证书链的颁发机构/主体密钥标识符,以及用于吊销检查的CRL分发点。扩展可以是关键的(验证者必须理解)或非关键的(信息性的)。
证书指纹是如何计算的?
证书指纹(或拇指印)是整个DER编码证书字节的加密哈希。它不是证书本身的一部分——而是作为引用特定证书的紧凑标识符在外部计算的。此工具使用浏览器的Web Crypto API(crypto.subtle.digest())计算SHA-256和SHA-1两种指纹。结果以冒号分隔的十六进制格式显示(例如,AB:CD:EF:12:34:...)。出于安全考虑,SHA-256指纹是首选;SHA-1指纹包含在内是为了与旧系统兼容。
代码示例
// Certificate Decoder - JavaScript Implementation
// Uses Web Crypto API for fingerprint computation
/**
* Extract the DER bytes from a PEM string
* @param {string} pem - PEM-encoded certificate
* @returns {ArrayBuffer} DER-encoded certificate bytes
*/
function pemToDer(pem) {
const base64 = pem
.replace(/-----BEGIN CERTIFICATE-----/g, '')
.replace(/-----END CERTIFICATE-----/g, '')
.replace(/\s/g, '');
const binary = atob(base64);
const bytes = new Uint8Array(binary.length);
for (let i = 0; i < binary.length; i++) {
bytes[i] = binary.charCodeAt(i);
}
return bytes.buffer;
}
/**
* Parse multiple certificates from a PEM chain
* @param {string} pemText - PEM text (may contain multiple certificates)
* @returns {string[]} Array of individual PEM certificate strings
*/
function extractPemBlocks(pemText) {
const regex = /-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----/g;
return pemText.match(regex) || [];
}
/**
* Compute SHA-256 fingerprint of a DER-encoded certificate
* @param {ArrayBuffer} derBytes - DER-encoded certificate
* @returns {Promise<string>} Colon-separated hex fingerprint
*/
async function computeSha256Fingerprint(derBytes) {
const hashBuffer = await crypto.subtle.digest('SHA-256', derBytes);
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray
.map(b => b.toString(16).padStart(2, '0').toUpperCase())
.join(':');
}
// Usage with @peculiar/x509:
// import { X509Certificate } from '@peculiar/x509';
// const cert = new X509Certificate(pem);
// console.log('Subject:', cert.subject);
// console.log('Issuer:', cert.issuer);