OpenSSL x509用途标记“任何目的”这是什么?

使用以下方法查看证书的详细信息:

openssl x509 -noout -text -purpose -in mycert.pem 

我发现了一堆目标标志(我发现它们是通过连接到证书的各种扩展设置的)。

其中一个目的标志是“任何目的”。 我似乎无法find此标志上的任何文档,为什么或为什么不设置。

你们有没有人知道我在哪里可以find更多关于这个目的的信息?

谢谢,

Any Purpose : YesAny Purpose CA : Yes来自openssl x509 -purpose Any Purpose CA : Yes是特殊的。 它是特定于openssl的,代表了与古代软件版本一起使用时不validation扩展名的证书。

这些特定用途标志不能closures或禁用。 从openssl源代码检查在openssl / crypto / x509v3 / v3_purp.c中定义为static X509_PURPOSE xstandard [] = {…}。 X509_PURPOSE_ANY检查validation函数返回1。

最接近这个标志的正式文件可能是由Stephen N. Henson博士撰写的,他创作的v3_purp.c – http://marc.info/?l=openssl-users&m=96219426811480和http&#xFF1A://openssl.6102.n7 .nabble.com / quot-critical-CA-FALSE-quot-but-quot-Any-Purpose-CA-Yes-quot-td29933.html 。

引用史蒂夫:

“任何目的”设置是什么都可以让任何东西通过,并没有执行任何检查。 如果没有其他select,可以忍受这种后果,人们最初会把它当作一种方式来使用破损的证书。从那时起,即使设置了“任何目的”,CA代码检查在代码中也是强制性的。 所以如果你真的试图用这个证书作为CA,它将被拒绝。

在X.509证书中,如同大多数其他事物一样,如果一个术语没有被明确定义,那么它就会从其紧邻的上下文中inheritance意义。 如果上下文是“生活”,那么“任何目的”这个词的意思就是这个意思。

因此,检查签发CA的“证书政策”,“订户协议”和“依赖方协议”,如果他们对这个标志没有提及,那么就意味着它在框中表示了什么。

KeyUsage是一个v3扩展,它可能会或可能不会出现在证书中。

id-ce-keyUsage值的一个有用的(如果有点过时的)摘要: http : //www.alvestrand.no/objectid/2.5.29.15.html [新添加的值是7 = encipherOnly和8 = decipherOnly]

诀窍是,这个“OID = 2.5.29.15 keyUsage扩展”/可能或可能不会/存在于特定的证书中。

什么OpenSSL可能与PURPOSE_ANY假设,这个扩展是/不存在/,因此,这是“由你自己的政策”决定什么使用或不使用它。 否则,没有对应于“ANY”的位图值…

来自: http : //en.wikipedia.org/wiki/Digital_certificate

密钥用法:公钥的目的(例如encryption,签名,证书签名等)。

请参阅openssl文档中的-purpose标志: http : //www.openssl.org/docs/apps/x509.html#CERTIFICATE_EXTENSIONS

大多数证书的发行都具有受限制的目的(或一组目的),例如客户端身份validation,服务器身份validation,密钥交换和代码签名。 如果它们被用于不被认可的目的(例如使用你的电子邮件证书来签署代码),它们是无效的。

任何目的扩展只是意味着证书应该总是传递使用约束,这与所有用法都是一样的。

OpenSSL的“目标”内容不完全是对v3证书的Key-Usage扩展的直接反映。

OpenSSL本身定义了一组“目的”,然后有一些逻辑确定给定证书是否与基于证书扩展select的目的一致,包括但不限于密钥使用和扩展密钥使用扩展。

如果你传递-purpose any openssl verify或者你编写的代码使用例如SSL_CTX_set_purpose()来设置OpenSSL上下文的目的为“任何”值,那么“任何目的”就是你得到的。

大部分目的都logging在man x509部分CERTIFICATE EXTENSIONS – 它解释了证书对于给定目的必须是有效的属性 – 但是这没有certificateany目的。 在源代码中,在crypto/x509v3/v3_purp.c的顶部,您可以看到crypto/x509v3/v3_purp.c的检查函数是no_check() ,它简单地返回1:实际上它禁用了用途检查。

我不确定你是否可以devise出任何证书对于any目的都是无效的情况。 我也不确定在设定目的和不设定目的之间有什么区别,应该使目的检查完全被绕过。

具体而言,OpenSSL的X509_PURPOSE_ANY /“Any Purpose”/指定-purpose any概念与RFC 5280 anyExtendedKeyUsage KeyPurposeId不同。

通常,我在根CA上设置“AnyPurpose”(这意味着这是根证书,可以颁发证书给任何其他中间或子CA),然后,当颁发中间体CA时,我设置限制…

我的根CA有:

  • AnyPolice 2.5.29.32.0,
  • CA:真2.5.4.37,
  • AnyPurpose 2.5.29.15,
  • DigitalSignature 2.5.4.37.3,
  • CRL分发点2.5.29.31,

在我的中级TLS CA上,例如我设置了:

  • Web ServerAuth TLS 1.3.6.1.5.5.7.3.1,
  • Web ClientAuth 1.3.6.1.5.5.7.3.2

这限制了TLS CA从根CA的所有属性inheritance(限制性的OID在这里只允许标记TLS证书,并且pathlen:0我将禁止子CA)。

一切都取决于你如何设置你的PKI基础设施。

在我的networking中,我为每个目的执行一个中间CA,例如:

  • 电子邮件的中间CA
  • 中间CA用于TLS
  • 中级CA for Software
  • 中间CA为身份
  • 组件的中间CA

这样,如果邮件证书出现问题,我只需要撤销电子邮件CA,而所有其他中间CA都可以。

大的authentication机构例如有一个专门的中间CA到EV。

注:这是个人PKI,如果你希望按照RFC和大型authentication机构的最佳实践做某些事情,那么还有很多额外的performance,比如包含更多的OID并设置所有这些…

例如,你可以阅读这个链接的一些标准:

https://cabforum.org/wp-content/uploads/Baseline_Requirements_V1.pdf

另一个例子,对于EV证书还有很多额外的步骤设置OID:

  • 已validation的域名2.23.140.1.2.1
  • 组织已validation2.23.140.1.2.2

而且由于我的设置不需要这些,所以我没有花费时间search和testing必要的OID来获得这个工作