Oh MyUtils

证书解码器 - 在线解码X.509 PEM证书

解码和检查X.509 PEM证书。查看主体、颁发者、有效期、扩展、SAN和指纹 — 100%客户端处理,数据不会发送到服务器。

100%客户端处理 — 您的证书数据绝不会离开浏览器
PEM证书

常见问题

什么是证书解码器?

证书解码器是一个在线工具,用于解析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);

相关工具