Openssl验证链式CA和链式证书

时间:2017-06-05 18:22:37

标签: ssl nginx openssl certificate certificate-authority

我有一个证书链: $file = '/directory/xmlfile.xml'; if(!$xml = simplexml_load_file($file)) { exit('Failed to open '.$file); } else { // Load XSLT $xsl = new DOMDocument; $xsl->load('/path/to/xsl_script.xsl'); // Configure transformer $proc = new XSLTProcessor; $proc->importStyleSheet($xsl); // Transform XML source $newXML = new DOMDocument; $newXML = $proc->transformToXML($xml); // Echo new XML tree echo $newXML; // Save output to file $xmlfile = '/path/to/output.xml'; file_put_contents($xmlfile, $newXML); }

当我将CA的客户端证书验证为root CA -> intermediate CA -> org CA -> client Cert时,它可以正常运行:

root CA -> intermediate CA -> org CA

但是,当我使用org CA($ cat org_1_ca/ca_crt.pem intermediate_ca/ca_crt.pem root_ca/ca_crt.pem > /tmp/test123.pem $ openssl verify -CAfile /tmp/test123.pem client/client_crt.pem client_crt.pem: OK )链接我的客户端证书,并将链的其余部分作为CA(org CA -> client Cert)时,它不会:

root CA -> intermediate CA

这是根本错误还是$ cat intermediate_ca/ca_crt.pem root_ca/ca_crt.pem > /tmp/test12.pem $ openssl verify -CAfile /tmp/test12.pem client/org1_client_crt.pem client/org1_client_crt.pem: C = US, ST = CA, L = LA, O = PP, OU = TEST, CN = user error 20 at 0 depth lookup:unable to get local issuer certificate 不喜欢的东西?我用nginx和openssl verify尝试了同样的事情,那里没有运气。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

openssl命令行verify操作仅从作为操作数的文件中读取一个证书,第一个证书,或者如果给出多个证书,则从每个文件中读取。这与使用-CAfile -trusted -untrusted选项指定的文件不同,后者可以(通常也包含多个证书)。

您的文件client/org1_client_crt.pem可能包含客户端证书和组织CA'证书,按此顺序。仅使用客户端证书,组织CA' cert被忽略,因此您没有有效的链来验证。

如果要使用命令行来模拟/测试接收者(对于客户端证书,服务器)将执行的验证,请提供叶证书作为操作数,并提供所有其他传输(链)证书{{1} },以及锚点和任何已知的'信任库中的中间体是明确的或默认的。

没有-untrusted操作;我假设你的意思是openssl connect,其中的选项包括openssl s_client,因为使用客户端证书链是有意义的。{1}} -connect的{​​{1}}选项同样仅使用文件中的第一个证书。除了最新版本1.1.0之外,命令行上没有选项来指定客户端链,即使在那里它没有记录,因此您必须仔细阅读帮助消息或代码,尽管API /库我一直支持你自己编写的代码。

如果你想将一个带有完整链的客户端证书发送到服务器(就像你应该根据RFC一样),通过1.0.2,假设服务器请求客户端身份验证,这是不常见的,而不是nginx的默认值(以及其他) ,你必须使用一个技巧:提供 truststore 中客户端链所需的所有证书,另外到验证服务器所需的锚点,显式使用-cert和/或s_client,或者使用(如果需要,修改)默认信任库,除非您的-CAfile是较旧的非RedHat版本,其中默认信任库不起作用只在-CApath

openssl中的服务器证书/链也是如此,除了它几乎总是被使用而不是很少使用。