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


11

我一直在尝试与LDAPS服务器(Active Directory)建立SSL连接,但是仍然遇到问题。我尝试使用此:

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

而且那也不起作用。

我想念什么?那永远不行吗?

ssl  openssl 

为了清楚起见,当从Windows提供服务时,LDAPS似乎在建立连接时不显示CA证书。因此,您应该获取CA X.509证书,导出为base64并按照下面的答案进行分配。在我的情况下,使用python-ldap在GLOBAL范围(而不是ldap.initialize()实例)中将其分配为:ldap.set_option(ldap.OPT_X_TLS_CACERTFILE,'./ca_issuer_cert.pem') 在此之后,我能够按预期使用STARTTLS(在LDAP端口389内)。
mbrownnyc

Answers:


4

这就是我所看到的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:password选项,如下所示:

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

但这也不起作用。

有趣的是,cacerts文件上有密码,openssl并不抱怨​​它无法读取cacerts文件。在我看来,这很可恶。那还是其他东西响了吗?


3

该错误是opensl所说的:“我无法将证书链跟随到受信任的根目录”。我只是对自己的AD服务器执行了相同的命令,但得到了完整的证书链,但是最重要的证书却有确切的错误。如果您拥有签署证书的CA的发布密钥,则可以使用-CAfile-CApath选项进行指定


好的,谢谢您的回复。所以我尝试了。通过在-showcerts选项上执行相同的操作来获得CA证书,并获取其他证书。那应该是CA证书,对不对?尝试使用该证书代替pem文件中的服务器证书,并得到相同的错误消息。还有其他想法吗?

在这种情况下,很有可能由于其他原因(例如过期)而使验证失败。
sysadmin1138

1

我一直在尝试与LDAPS服务器(Active Directory)建立SSL连接,但是仍然遇到问题。我尝试使用此:

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

TLS_REQCERT=never

openldap.conf文件中,指示OpenLDAP不要尝试证书验证。如果您正在使用Apache进行LDAP身份验证,则有一个类似的选项。

如果您确实要执行证书验证,则以下内容可能会有所帮助:

我想念什么?那永远不行吗?

我不这么认为。尽管以下内容听起来很确定,但这实际上只是我最好的客人:

您尝试的操作仅适用于自签名证书。由于证书实际上是Windows CA颁发的,因此尝试将服务器证书用作自变量-CAfile不会获得任何好处。

通过在-showcerts选项上执行相同的操作来获得CA证书,并获取其他证书。那应该是CA证书,对不对?

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

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

...然后查看您拥有的其他证书之一是否与该颁发者匹配。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.