SSL证书错误:validation错误:num = 20:无法获取本地颁发者证书

我一直在试图获得SSL连接到LDAPS服务器(Active Directory)工作,但仍然有问题。 我试着用这个:

openssl s_client -connect the.server.edu:3269 

结果如下:

 verify error:num=20:unable to get local issuer certificate 

我想,好吧,好的服务器是几年前的一个旧的生产服务器。 也许CA不存在。 然后我把输出中的证书放到一个pem文件中,然后试着:

 openssl s_client -CAfile mycert.pem -connect the.server.edu:3269 

而这也没有工作。

我错过了什么? 不应该一直工作?

这个错误是openssl的说法,“我不能遵循证书链到受信任的根”。 我只是对我自己的AD服务器做了同样的命令,我得到了一个完整的证书链,但是最高级的证书有这个确切的错误。 如果您拥有签署证书的CA的pub-key,则可以使用-CAfile-CApath选项指定它

所以这就是我所看到的CA证书名称:

 depth=1 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at //www.verisign.com/rpa (c)10/CN=VeriSign Class 3 International Server CA - G3 verify error:num=20:unable to get local issuer certificate verify return:0 

这是我在上面第二次尝试完成-showcerts之后所导入的证书的名称。 我通过这样做在密钥库中列出了证书:

 $JAVA_HOME/bin/keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts 

我在那里看到CA证书。

 Alias name: versign2006 Creation date: Jan 21, 2011 Entry type: trustedCertEntry Owner: CN=VeriSign Class 3 International Server CA - G3, OU=Terms of use at www.verisign.com/rpa (c)10, OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5, OU="(c) 2006 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US Serial number: 641be820ce020813f32d4d2d95d67e67 Valid from: Sun Feb 07 19:00:00 EST 2010 until: Fri Feb 07 18:59:59 EST 2020 Certificate fingerprints: MD5: BA:B0:65:B4:3B:9C:E8:40:30:21:7D:C5:C6:CD:3F:EB SHA1: B1:8D:9D:19:56:69:BA:0F:78:29:51:75:66:C2:5F:42:2A:27:71:04 

为了确保openssl使用我在服务器上使用的密钥库,我使用-CAfile参数:

 openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts 

知道CA的Java密钥库有密码,我尝试使用-pass pass:密码选项,如下所示:

 openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts -pass pass:changeit 

但是这也不起作用。

有趣的是,cacerts文件有一个密码,openssl不抱怨它不能读取cacerts文件。 这对我来说似乎很腥。 那个还是别的什么都响了?

我一直在试图获得SSL连接到LDAPS服务器(Active Directory)工作,但仍然有问题。 我试着用这个:

如果您使用OpenLDAP,则可以设置:

 TLS_REQCERT=never 

在你的openldap.conf文件中,它指示OpenLDAP不要尝试证书validation。 如果您使用Apache进行LDAP身份validation,也有类似的选项。

如果您确实想要执行证书validation,以下可能会有所帮助:

我错过了什么? 不应该一直工作?

我不这么认为。 虽然以下内容听起来可能是确切的,但它确实是我最好的客人:

你所尝试的只能用于自签名证书。 因为证书实际上是由Windows CA颁发的,所以尝试使用服务器证书作为-CAfile的参数不会给你任何东西。

通过与-showcerts选项做同样的事情获得了CA证书,抓住了另一个证书。 这应该是CA证书,对吗?

不一定,不。 无法保证远程服务器在其输出中显示CA证书。 您需要先查看服务器证书的颁发者:

 openssl x509 -in server.crt -noout -text | grep Issuer 

…然后看看您是否有其他证书与发行人相匹配。