我在 Ubuntu 11.04 上使用 Apache 运行 Subversion 服务器,并尝试使用 LDAPS 进行身份验证。我已将 Apache 配置文件设置为针对 LDAP(无 S)进行身份验证,但安全版本却给我带来了...问题。显然这是证书问题。不幸的是,我是证书新手。
我发现这个问题,这似乎和我遇到的问题相同。我尝试将这一行放入LDAPVerifyServerCert off
我的 httpd.conf 中,并且成功了——但如果证书有问题,我想我不会直接忽略它,对吧?
我思考我们的 LDAP 服务器有一个自签名证书...也许您可以先帮我确认或拒绝。以下是我运行时得到的结果openssl s_client -connect myldap.xyz.edu:636 -showcerts
:
CONNECTED(00000003)
depth=0 /CN=myldap.xyz.edu
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 /CN=myldap.xyz.edu
verify error:num=27:certificate not trusted
verify return:1
depth=0 /CN=myldap.xyz.edu
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:/CN=myldap.xyz.edu
i:/DC=edu/DC=xyz/CN=myldap
-----BEGIN CERTIFICATE-----
[certificate here]
-----END CERTIFICATE-----
---
Server certificate
subject=/CN=myldap.xyz.edu
issuer=/DC=edu/DC=xyz/CN=myldap
---
Acceptable client certificate CA names
/DC=edu/DC=xyz/CN=myldap
[...]
---
SSL handshake has read 13738 bytes and written 289 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 1024 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol : TLSv1
Cipher : RC4-MD5
Session-ID: [...]
Session-ID-ctx:
Master-Key: [...]
Key-Arg : None
Start Time: 1335300252
Timeout : 300 (sec)
Verify return code: 21 (unable to verify the first certificate)
我从此输出中复制了证书(从 BEGIN 行到 END 行),将其粘贴到 中/etc/ssl/certs/myldap.xyz.edu.pem
,运行c_rehash
,然后尝试openssl s_client -connect myldap.xyz.edu:636 -CAfile /etc/ssl/certs/myldap.xyz.edu.pem -showcerts
。没有运气。它给了我完全相同的错误。
这是我的 httpd.conf 文件:
ServerName svnserver.xyz.edu
<Location />
DAV svn
SVNParentPath /var/svn
SVNPathAuthz off
AuthName "Subversion server"
AuthType Basic
AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPBindDN "[email protected]"
AuthLDAPBindPassword "[password]"
AuthLDAPURL "ldaps://myldap.xyz.edu/DC=xyz,DC=edu?sAMAccountName?sub?(objectClass=*)" NONE
Require ldap-user user1 user2
</Location>
如果我没记错的话,LDAP 服务器是运行在 Windows Server 2008 上的 Active Directory。我真的没法去摆弄它,而且我认为我不需要摆弄它——我们已经在很多地方很好地使用它了。客户端一定出了问题。我在 Google 上搜索了三天,但毫无收获。因此,任何能够 1) 解决问题、2) 指出另一个有解决方案的问题或 3) 提供教程链接的人都将不胜感激。:^)
编辑:
以下是我根据 chutz 的建议运行的命令和结果:
root@svnserver:~# openssl x509 -noout -issuer_hash < /etc/ssl/certs/myldap.xyz.edu.pem
505d0f30
root@svnserver:~# openssl x509 -noout -hash < /etc/ssl/certs/myldap.xyz.edu.pem
1045bba3
因此哈希和颁发者哈希不同,这意味着它不是自签名的。我想我现在理解得更清楚了。起初我没有意识到实体/CN=myldap.xyz.edu
和/DC=edu/DC=xyz/CN=myldap
被视为两个独立的东西,即使它们指的是同一台机器。所以我有前者的证书,但现在我需要后者的证书,对吗?我会看看我的老板能告诉我什么(他是 AD 管理员)。
编辑#2:
我获取了颁发者证书,将其放入/etc/ssl/certs/myldap1.pem
,然后运行 c_rehash。我确保检查了哈希值,并myldap1.pem
显示的主题和颁发者哈希值505d0f30
与我的证书颁发者相同myldap.xyz.edu
。所以我openssl s_client
再次尝试了该命令。起初,它给了我同样的错误,但一旦我记得添加选项-CAfile
,它就会返回
Verify return code: 10 (certificate has expired)
啊,太好了。原来我的证书将于 2009 年到期。>_< 好吧,至少我们找到了一个知道如何解决的问题。感谢您的帮助!
答案1
您的证书不是自签名证书。如果是,下面的“主题”和“颁发者”应该是相同的。
Server certificate
subject=/CN=myldap.xyz.edu
issuer=/DC=edu/DC=xyz/CN=myldap
这很可能是你无法正确验证的原因——openssl s_client -showcerts
屏幕上显示的证书不是加州证书。
为了再检查一下,请尝试运行以下命令。
openssl x509 -noout -issuer_hash < /etc/ssl/....pem
openssl x509 -noout -hash < /etc/ssl/....pem
如果两个哈希值不同,则它不是自签名证书。如果是这种情况(我怀疑是这样),您唯一的选择就是以某种方式获取颁发 CA 证书。尝试向 Active Directory 管理员索取证书,并在获取证书后执行您已经做过的操作 - 将其转储到 /etc/ssl/certs 并运行 c_rehash。
当您获得证书后,请运行openssl x509 -noout -hash
并确保它-issuer_hash
与 LDAP 证书匹配。