是否有一个OPENSSL api可以解析证书并判断它是客户端证书还是服务器证书



我有一个要求,我有一个证书,我需要判断它是客户端证书还是服务器证书。是否有一个开放的 ssl api 可以告诉同样的事情。例如,一个类似的用例,如果我们想判断证书是否是 CA,我们可以使用该函数

*静态 int check_ca(const X509 x) 在 OpenSSL 中找到

理论上,证书可用于客户端和服务器身份验证,具体取决于在启动或接收SSL/TLS握手时是否使用了证书

但是,您可以通过设置证书的"扩展密钥用法"字段来优化此行为。您可以在执行命令openssl x509 -in cert -text -noout时看到此字段,您可能会得到类似

    X509v3 extensions:
        X509v3 Key Usage: critical
            Digital Signature, Key Encipherment, Data Encipherment, Key Agreement
        X509v3 Extended Key Usage: 
            TLS Web Server Authentication, TLS Web Client Authentication

此字段使用 openssl 配置文件(位于 /etc/ssl/openssl.cnf 中)进行配置。

有关手册页的更多信息: man x509v3_config

有一个要求,我有一个证书,我需要告诉它是客户端证书还是服务器证书。

大多数 PKI 中有两种类型的证书。它们是最终实体证书(如客户端和服务器使用的证书)以及 CA 和从属 CA 证书。最终实体证书缺乏 CA=true基本约束。CA 和从属证书具有CA=true约束,它们对最终实体证书进行认证。另请参阅 Apache 的 PKI 术语表。

有一些密钥用法位可以帮助您确定密钥经过认证可以执行的操作。然而,它们的关键使用位严重不足,甚至没有涵盖最高级别的用例(如服务器身份验证与代理/拦截)。

有些扩展可以进一步指定密钥的用途,但它们特定于 PKI。例如,Microsoft使用扩展来标识最终用户/用户证书中的用户。有关良好的讨论,请参阅Thomas Porin的回答如何在PKIX证书中编码用户名?


是否有可以解析证书并判断它是客户端证书还是服务器证书的 OPENSSL API?

否,因为它们都是最终实体证书。无论是使用它的人还是服务器都无关紧要。您可以使用扩展名标记包含信息的证书,但随后需要添加其他应用程序层逻辑来识别它。

最新更新