我遇到双向身份验证问题。我使用tomcat6作为服务器,作为客户端,我尝试IE,Firefox和我自己的java应用程序。
使用其他人提供给我的PFX证书会出现问题。我必须将它们用作客户端证书,因此我只需将其添加到服务器上的受信任证书,并在用户证书的浏览器中使用它。问题是我得到了bad_certificate警报。
我已成功通过为服务器和客户端生成自己的证书并在两个密钥库等中添加可信任的公钥来成功实现双向ssl ...
当我看到wireshark日志时,我看到,该服务器发送了良好的证书请求,但当我使用自己生成的证书时,客户端发送空证书(11字节长度数据包)而不是500多字节。
可能是什么问题?为什么客户不发送好的证书? :(
答案 0 :(得分:3)
嗯,首先要检查的是查看Tomcat是否配置正确,以便从客户端请求相关路径的证书。对于Tomcat 6,这意味着您应该在conf / server.xml中配置连接器,如下所示:
<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
keystoreFile="${user.home}/.keystore" keystorePass="password"
truststoreFile="conf/truststore" truststorePass="password"
clientAuth="true" sslProtocol="TLS" />
truststoreFile&amp; truststorePass很重要 - 如果你只是添加“clientAuth = true”而不包括这两个参数,你会看到各种奇怪的行为(并没有警告你做错了什么)。 truststoreFile必须指向合法的JKS文件,该文件列出您信任的CA以签署客户端证书。如果Tomcat配置正确,浏览器应该向用户弹出一个对话框:“网站需要客户端证书”以及已导入浏览器的所有证书的列表。如果你没有看到这个,你的Tomcat设置有问题。
听起来你的设置正确,但值得仔细检查。此外,如果您正确设置了它,如果您在wireshark中跟踪以可分辨名称列出可信CA的连接,您将看到“证书请求”握手消息。同样,如果您没有看到这一点,请检查您的Tomcat设置,最重要的是检查信任库。
接下来要检查PKCS12文件本身。你可以这样做:
openssl pkcs12 -in [path-to-pkcs12-file] -nokeys | openssl x509 -noout -subject -issuer
确保颁发者的专有名称与信任库中的trustedCaCert条目之一匹配。这对Java keytool来说有点麻烦,但您可以使用以下方法仔细检查:
keytool -exportcert -keystore conf/truststore -alias [alias of trusted cert] | openssl x509 -noout -subject -inform der
如果所有这些都检查出来,但它仍然无法正常工作,那么使用openssl的s_client进行故障排除是值得的,因为您通常会从中获取更多的故障排除信息。为此,您必须将密钥与PKCS12文件中的证书分开:
openssl pkcs12 -in [PKCS12 file] -out [whatever].key
openssl s_client -tls1 -connect localhost:443 -cert [whatever].key -key [whatever].key
(您可以对“-cert”和“-key”参数使用相同的文件,因为openssl足够智能查找源文件中的“BEGIN CERTIFICATE”和“BEGIN RSA PRIVATE KEY”分隔符)。我遇到了令人沮丧的客户端证书问题,直到我使用s_client并得到提醒我的客户端证书已过期(未在其他任何地方记录或输出)时,我无法弄明白。
此外,您可能希望强烈考虑将配置转移到使用Apache而不是Tomcat - Apache是 lot 更灵活,并且当它有更多反馈时会为您提供批次与Tomcat相比,它具有SSL配置性。
答案 1 :(得分:2)
仔细查看您的客户端证书,特别是X509v3扩展“密钥用法”和“扩展密钥用法”。它们可能被标记为不信任客户端身份验证。
$ openssl pkcs12 -in server-only.pfx -nokeys | openssl x509 -noout -purpose
Enter Import Password:
MAC verified OK
Certificate purposes:
SSL client : No
SSL client CA : No
SSL server : Yes
SSL server CA : No
此证书仅针对服务器身份验证(普通HTTPS)进行签名。有关完整的详细信息,请使用openssl x509中的-text选项:
$ openssl pkcs12 -in server-only.pfx -nokeys | openssl x509 -noout -text
[..snip..]
X509v3 Key Usage:
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication
[..snip..]
如果是这种情况,您将不得不要求获取标记为使用客户端身份验证的新签名证书。