Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调试SSLSocket.startHandshake异常_Java_Ssl_Exception - Fatal编程技术网

Java 调试SSLSocket.startHandshake异常

Java 调试SSLSocket.startHandshake异常,java,ssl,exception,Java,Ssl,Exception,我有一个基于java TLS的客户机/服务器应用程序,我在2-3年前编写过,从那时起,我几乎每天都在不同的linux安装上使用它。我没有用java做很多工作——写这篇文章实际上是一个练习 不管怎么说,从那以后,它从来没有让我感到悲伤,直到昨天,我突然无法通过Fedora31盒子的服务器进行身份验证。原因是前一天openjdk的更新。其他没有更新的机器没有问题。但是,我尝试使用OracleJDK13进行重建,问题再次出现 我想说清楚: 引发异常的服务器未更新 现在唯一失败的客户机是那些从jdk更

我有一个基于java TLS的客户机/服务器应用程序,我在2-3年前编写过,从那时起,我几乎每天都在不同的linux安装上使用它。我没有用java做很多工作——写这篇文章实际上是一个练习

不管怎么说,从那以后,它从来没有让我感到悲伤,直到昨天,我突然无法通过Fedora31盒子的服务器进行身份验证。原因是前一天openjdk的更新。其他没有更新的机器没有问题。但是,我尝试使用OracleJDK13进行重建,问题再次出现

我想说清楚:

  • 引发异常的服务器未更新
  • 现在唯一失败的客户机是那些从jdk更新系统连接的客户机

  • 编译整个应用程序并使用最新的Oracle JDK进行测试有一个问题——客户端无法连接到服务器。因此,我必须修复或回滚JRE,并在任何地方使用它。>_ 事实证明,在握手过程中,您可以使用以下方法获得一些出色的调试输出:

    java --Djavax.net.debug=all ...
    
    更多信息:

    因为只有一个客户端系统在更新后出现问题,所以拒绝连接的客户端才有意义。原因是:

    TrustAnchor with subject "CN=myAuthority, C=CA"
    does not have keyCertSign bit set in KeyUsage extension
    
    检查时,它没有,这有点令人惊讶,因为这是成功用于签署所有(其他工作)客户端和服务器证书的证书。在进行身份验证时,这一点也有点神秘,但更严格的安全性并不是一件坏事

    最终的原因是我一直在使用一个脚本来重新生成证书,这个脚本最初用于创建CA。这是创建自签名CA证书时传递给
    keytool
    的参数的一部分:

    -ext KU=keyCertSign -ext KU=cRLSign
    
    证书确实有后者,这意味着以前的值已被替换。正确的方法是将它们列在一起:

    -ext KU=keyCertSign,cRLSign
    

    在所有这些之后,替换根PKIX基础设施上的整个缺陷并不难。

    事实证明,在握手过程中,您可以使用以下方法获得一些出色的调试输出:

    java --Djavax.net.debug=all ...
    
    更多信息:

    因为只有一个客户端系统在更新后出现问题,所以拒绝连接的客户端才有意义。原因是:

    TrustAnchor with subject "CN=myAuthority, C=CA"
    does not have keyCertSign bit set in KeyUsage extension
    
    检查时,它没有,这有点令人惊讶,因为这是成功用于签署所有(其他工作)客户端和服务器证书的证书。在进行身份验证时,这一点也有点神秘,但更严格的安全性并不是一件坏事

    最终的原因是我一直在使用一个脚本来重新生成证书,这个脚本最初用于创建CA。这是创建自签名CA证书时传递给
    keytool
    的参数的一部分:

    -ext KU=keyCertSign -ext KU=cRLSign
    
    证书确实有后者,这意味着以前的值已被替换。正确的方法是将它们列在一起:

    -ext KU=keyCertSign,cRLSign
    

    在所有这些之后,在根PKIX基础设施上替换整个有缺陷的PKIX基础设施并不难。

    您确定信任库是相同的吗?具体地说,就是服务器证书有CA证书吗?另外,作为一个例子,更新的OpenSSL安装(例如在Debian中)的默认设置发生了更改,因此不再允许使用1024位或更少密钥的证书,或者使用SHA1进行签名。通过更新某些库,像这样的默认设置可能已更改。您可能还希望比较工作客户端和非工作客户端在有线级别的TLS握手。可以--尽管密钥对使用2048位RSA(在中编辑)。您确定信任库是相同的吗?具体地说,就是服务器证书有CA证书吗?另外,作为一个例子,更新的OpenSSL安装(例如在Debian中)的默认设置发生了更改,因此不再允许使用1024位或更少密钥的证书,或者使用SHA1进行签名。通过更新某些库,像这样的默认设置可能已更改。您可能还想比较工作客户机和非工作客户机在有线级别的TLS握手。可以——尽管密钥对使用2048位RSA(在中编辑)。