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

Is there an OPENSSL api which can parse the certificate and tell if it is a client certificate or server certificate?

提问人:kharevbv 提问时间:3/16/2016 更新时间:3/17/2016 访问量:396

问:

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

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

OpenSSL SSL 证书 X509证书

评论


答:

2赞 oliv 3/16/2016 #1

从理论上讲,证书可以同时用于客户端和服务器身份验证,具体取决于在启动或接收 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

评论

0赞 kharevbv 3/17/2016
对我来说,那是一种有条不紊的生活
0赞 jww 3/17/2016 #2

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

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

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

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


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

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