我有一个证书链:
$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
尝试了同样的事情,那里没有运气。任何帮助表示赞赏。
答案 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
中的服务器证书/链也是如此,除了它几乎总是被使用而不是很少使用。