使用opensslvalidation来validation证书链

我正在用以下组件构build一个自己的证书链:
Root Certificate - Intermediate Certificate - User Certificate
根证书是一个自签名证书,中级证书由中级用户和用户签名。

现在我想validation用户证书是否具有根证书的锚点。


openssl verify -verbose -CAfile RootCert.pem Intermediate.pem
validation是好的。 在接下来的步骤中,我将validation用户证书
openssl verify -verbose -CAfile Intermediate.pem UserCert.pem
并且validation在0深度查找中显示错误20:无法获得本地颁发者证书

哪里不对?

从“validation”文档:“如果find一个证书是自己的发行者,它被认为是根CA”。 换句话说,根CA需要自签名validation才能工作。 这就是为什么你的第二个命令不起作用。

试试这个:

 openssl verify -CAfile RootCert.pem -untrusted Intermediate.pem UserCert.pem 

它会validation你的整个链条在一个命令。

这是cat的less数合法工作之一:

 openssl verify -verbose -CAfile <(cat Intermediate.pem RootCert.pem) UserCert.pem 

更新:

正如Greg Smethells在评论中指出的那样, 这个命令隐含地信任Intermediate.pem 。 我build议阅读格雷格参考文章的第一部分(第二部分是专门关于pyOpenSSL和这个问题不相关)。

如果post消失,我会引用重要的段落:

不幸的是,当使用上面给出的推荐命令时,实际上是根/自签名的“中间”证书将被视为可信的CA

$ openssl verify -CAfile <(cat geotrust_global_ca.pem rogue_ca.pem)fake_sometechcompany_from_rogue_ca.com.pem fake_sometechcompany_from_rogue_ca.com.pem:OK

看来openssl会在遇到根证书时立即停止validation链,如果是自签名的,也可能是Intermediate.pem。 在这种情况下,不考虑RootCert.pem。 因此,请确保Intermediate.pem来自可信来源,然后再依靠上述命令。

问题是, openssl -verify不能完成这项工作。

正如Priyadi所说 , openssl -verify在第一个自签名证书上停止,因此你不能真正地validation链,因为中间证书通常是自签名的。

我假设你想101%的确定,证书文件是正确的,然后再尝试将它们安装在生产性Web服务中。 这个配方在这里执行完全这个飞行前检查。

请注意, 彼得的答案是正确的 ,但openssl -verify的输出结果并不能确定一切事情真正起作用。 是的,它可能会发现一些问题,但不是全部。

这是一个脚本,在安装到Apache之前执行validation证书链的工作。 也许这可以通过一些更神秘的OpenSSL魔法来增强,但我不是OpenSSL大师和以下作品:

 #!/bin/bash # This Works is placed under the terms of the Copyright Less License, # see file COPYRIGHT.CLL. USE AT OWN RISK, ABSOLUTELY NO WARRANTY. # # COPYRIGHT.CLL can be found at http://permalink.de/tino/cll # (CLL is CC0 as long as not covered by any Copyright) OOPS() { echo "OOPS: $*" >&2; exit 23; } PID= kick() { [ -n "$PID" ] && kill "$PID" && sleep .2; PID=; } trap 'kick' 0 serve() { kick PID= openssl s_server -key "$KEY" -cert "$CRT" "$@" -www & PID=$! sleep .5 # give it time to startup } check() { while read -r line do case "$line" in 'Verify return code: 0 (ok)') return 0;; 'Verify return code: '*) return 1;; # *) echo "::: $line :::";; esac done < <(echo | openssl s_client -verify 8 -CApath /etc/ssl/certs/) OOPS "Something failed, verification output not found!" return 2 } ARG="${1%.}" KEY="$ARG.key" CRT="$ARG.crt" BND="$ARG.bundle" for a in "$KEY" "$CRT" "$BND" do [ -s "$a" ] || OOPS "missing $a" done serve check && echo "!!! =========> CA-Bundle is not needed! <========" echo serve -CAfile "$BND" check ret=$? kick echo case $ret in 0) echo "EVERYTHING OK" echo "SSLCertificateKeyFile $KEY" echo "SSLCertificateFile $CRT" echo "SSLCACertificateFile $BND" ;; *) echo "!!! =========> something is wrong, verification failed! <======== ($ret)";; esac exit $ret 

请注意,在所有EVERYTHING OK之后的输出是Apache的设置,因为使用haproxyhaproxy通常也可以完美地阅读和理解它;)

有一个这可能有一些更新的GitHub Gist

这个脚本的先决条件:

  • 例如在Ubuntu上,通常在/etc/ssl/certs拥有可信的CA根数据
  • 创build一个目录DIR你存储3个文件:
    • 包含证书的DIR/certificate.crt certificate.crt
    • DIR/certificate.key其中包含您的Web服务的密钥(没有密码)
    • 包含CA-Bundle的DIR/certificate.bundle 。 关于如何准备捆绑,请参阅下文。
  • 现在运行这个脚本: ./check DIR/certificate (这个假设脚本被命名为check in当前目录)
  • 脚本输出CA-Bundle is not needed 。 这意味着你(读取: /etc/ssl/certs/ )已经信任签名证书。 但是这在WWW中是不太可能的。
  • 对于此testing端口4433必须在您的工作站上未使用。 最好只在安全的环境下运行,因为它很快向公众开放4433端口,这可能会看到外部连接在恶劣的环境中。

如何创buildcertificate.bundle文件?

在WWW中,信任链通常是这样的:

  • 来自/etc/ssl/certs可信/etc/ssl/certs
  • 未知的中间证书,可能由另一个CA交叉签名
  • 你的证书( certificate.crt

现在,评估从下到上进行,这意味着,首先读取您的证书,然后需要未知的中间证书,然后查看交叉证书,然后查看/etc/ssl/certs以查找适当的可信证书。

必须严格按照正确的处理顺序来组成这个捆绑包,这意味着,首先需要的证书(签名证书的中间证书)首先在捆绑中。 那么需要交叉签名证书。

通常你的CA(签名证书的权威)将会提供这样一个合适的ca-bundle-file。 如果没有,你需要select所有需要的中间证书,并把它们放在一个文件中(在Unix上)。 在Windows上,你可以打开一个文本编辑器(如notepad.exe ),并将证书粘贴到文件中,首先需要在顶部和其他人。

还有一件事。 这些文件需要使用PEM格式。 一些CA颁发DER(二进制)格式。 PEM易于识别:ASCII可读。 有关如何将某些东西转换为PEM的信息,请参阅如何将.crt转换为.pem,然后沿着黄砖路行驶。

例:

你有:

  • intermediate2.crt签署你的certificate.crt的中间certificate.crt
  • intermediate1.crt另一个中间证书,中间证书intermediate2.crt
  • crossigned.crt是来自另一个CA的交叉签名证书,签署了intermediate1.crt
  • crossintermediate.crt这是另一个中间人签署crossigned.crt其他CA(你可能永远不会看到这样的事情)

那么适当的cat看起来像这样:

 cat intermediate2.crt intermediate1.crt crossigned.crt crossintermediate.crt > certificate.bundle 

你怎么能找出哪些文件需要或不需要以及在哪个序列?

那么,实验,直到check告诉你一切正常。 这就像解决谜题的电脑益智游戏。 每一个。 单。 时间。 即使是专业人士。 但是,每当你需要这样做时,你会变得更好。 所以,你绝对不是一个人的痛苦。 这是SSL,你知道吗? SSL可能是我30多年来从事专业系统pipe理的最糟糕的devise之一。 有没有想过为什么密码在过去30年里还没有成为主stream? 这就是为什么。 “nuff说。

在完全相同的问题上打破了一整天,在没有SSL证书的先验知识的情况下,我下载了CERTivity密钥库pipe理器并将其导入到密钥库中,并且清晰地显示了证书链。

截图:

在这里输入图像说明