使用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的设置,因为使用haproxy
或haproxy
通常也可以完美地阅读和理解它;)
有一个这可能有一些更新的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理器并将其导入到密钥库中,并且清晰地显示了证书链。
截图: