代码之家  ›  专栏  ›  技术社区  ›  Newtopian

是什么导致SSL协商在.NET下成功而在Java下失败?

  •  1
  • Newtopian  · 技术社区  · 14 年前

    服务器正在使用双重身份验证。

    所有内容都基于证书(x509)存储在windows证书存储区(windows MY和windows ROOT)中


    是的,双重身份验证实际上是客户机和服务器身份验证。

    到目前为止,使用bountyCastle提供程序而不是SunMSCAPI似乎更进一步,但仍然无法让客户端身份验证正常工作。

    客户机平台CXF 2.2.9,Sun JDK 1.6\U 21 服务器IIS 6ASP.NET不幸的是,我只能收集,我没有对服务器的控制,必须按原样使用它。

    更新 我现在正在使用一个JKS密钥库,但是仍然遇到了问题。客户端似乎没有将其证书作为身份验证过程的一部分发送到服务器。结果,我从服务器得到一个403.7错误。

    有趣的是,我收到这个错误消息作为一个HTML页面,必须首先解密之前,它是可读的!

    3 回复  |  直到 14 年前
        1
  •  4
  •   Bruno    14 年前

    大概是吧 双重认证 ,您的意思是除了使用服务器证书身份验证(更常见)之外,还使用客户端证书身份验证。

    了解两边使用了哪些版本的平台以及应用了哪些修补程序将是非常有用的。

    有可能有些问题来自于重新协商修复 CVE-2009-3555 (或缺乏固定)。

    RFC 5746 .

    当该漏洞最初被披露时(大约在2009年11月),一些平台和库(如sunjava或OpenSSL)推出了一个快速修复程序,它只是不允许任何重新协商(因此只有客户端证书的初始协商才有效)。后来,一旦rfc5746被编写出来,这些库就开始推出支持这个扩展的实现。

    Microsoft Security Bulletin MS10-049 - Critical .

    http://blogs.technet.com/b/srd/archive/2010/08/10/ms10-049-an-inside-look-at-cve-2009-3555-the-tls-renegotiation-vulnerability.aspx

    从本质上讲,如果您试图与一个只支持旧协商样式的服务器进行对话,而这个堆栈只支持新的重新协商样式,或者根本不支持重新协商,那么这是行不通的。

    如果您的服务器使用IIS或类似环境运行,则可以使用启用初始客户端证书协商 netsh clientcertnegotiation=enable 选项。

        2
  •  3
  •   Colin Hebert    14 年前

    这将导入您的自签名证书。

    cd JAVA_HOME/jre/lib/security
    keytool -import -file server_cert.cer -keystore cacerts
    
        3
  •  0
  •   Community CDub    7 年前

    我将此作为一个答案发布,尽管我现在意识到这个问题的表述不正确,因为我被抛出了一个循环,因为我的.NET示例实际上是在执行一个黑客来绕过这个问题。

    如何让Java在不要求证书的服务器上执行客户端身份验证?

    答案其实就在我们的眼皮底下,然而要得到答案就需要正确的问题!!

    Java HTTPS client certificate authentication

    Client SSL authentication causing 403.7 error from IIS

    尽管客户端“不应该”在未被请求时发送证书,但我发现通过调整密钥库中的客户端证书以包含以下内容:

    • 客户端私钥

    将所有这些内容推送到同一个证书存储中,并将其用作密钥库。然后再次加载证书链作为信任存储。从那以后就可以了。尽管如此,仍然有失败的可能。解决这个特定问题的最安全的方法是让服务器通过提供一个接受的CA列表主动向客户机请求身份验证证书。