【问题标题】:How to understand TLS certificate is in PEM or DER format如何理解 TLS 证书是 PEM 或 DER 格式
【发布时间】:2026-01-20 04:15:01
【问题描述】:

我的任务是从 TLS 证书中获取“通用名称”信息。 我设法通过解析 TLS“证书”(在“hello server”之后)来做到这一点 消息并获取指向证书的指针并传递给 X509_NAME_get_text_by_NID;

p = certificate;//this is a pointer to certificate 
X509 *x;
x = d2i_X509(NULL, &p, certificate_lenght);

if (x == NULL)
{
    fout << " X509 object is null " << std::endl;
    return;
}
fout << " no x509  error " << endl;
X509_NAME_get_text_by_NID(X509_get_subject_name(x),NID_commonName, peer_CN, 256);

我希望我在做正确的事情。

我的问题是我为“DER”格式设计了我的逻辑,这些信息可以以“PEM”格式出现吗? 如果是,我如何了解证书是 PEM 还是 DER 格式?

【问题讨论】:

    标签: c ssl openssl


    【解决方案1】:

    在 TLS 握手期间发送的证书始终是 DER 中的二进制数据。你不需要关心那里的 PEM。

    如果您想使用相同的代码从其他来源加载证书,那么您需要分析它是否是纯文本(即只有 32-127 范围内的字符)。如果是,那么很可能你有一些 PEM。但不能保证您已获得证书。如果页眉和页脚存在,则需要删除它们,然后对其余部分进行 base64 解码以获取 DER,然后您可以解码 DER。

    【讨论】:

    • 非常感谢。我搜索此信息,但在 RFC、Wiki 或网络中找不到。如果您可以与我分享包含此信息的文档,我会宽慰:)。
    • @KadirErdemDemir 您正在寻找哪些确切信息? DER 是 RFC 5280 中定义的唯一证书格式。PEM 和其他任何东西都是 DER 证书的包装器和容器。 OpenSSL 中使用的 PEM 文件格式没有在任何标准中定义,尽管“PEM”术语在 RFC 中定义,后来被重命名为简单的 base64 :)。