我一直在尝试建立与 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
但这也不起作用。
我遗漏了什么?这不是应该一直有效吗?
答案1
该错误是 openssl 的说法,“我无法按照证书链找到受信任的根”。我刚刚对自己的 AD 服务器执行了相同的命令,并获得了完整的证书链,但顶级证书有相同的错误。如果您有签署证书的 CA 的公钥,则可以使用-CAfile
或-CApath
选项指定它
答案2
这就是我所看到的 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
我一直在尝试建立与 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
...然后查看您拥有的其他证书是否与该颁发者相匹配。