未找到sun.security.ssl.SSLSessionImpl

时间:2018-03-20 12:00:04

标签: java ssl kotlin glassfish

当我尝试使用okhttpjavax.ws.rs.client.Client时,会发生以下错误

  

java.lang.NoSuchMethodError:   。sun.security.ssl.SSLSessionImpl(Lsun /安全/ SSL / ProtocolVersion; Lsun /安全/ SSL /密文; Ljava / util的/收藏; Lsun /安全/ SSL / SessionID的; Ljava /郎/字符串;我)V

在sun.security.ssl包中搜索,没有SSLSessionImpl类

我正在使用Mac OS 10.13.3(17D102)

java -version
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)

在Glassfish 5.0上运行我的战争

的build.gradle

buildscript {
    ext.kotlin_version = '1.2.30'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-noarg:$kotlin_version"
        classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version"
    }
}

group 'invoice-administration-api'
version '1.0-SNAPSHOT'

apply plugin: 'idea'
apply plugin: 'war'
apply plugin: 'kotlin'
apply plugin: 'kotlin-jpa'
apply plugin: 'kotlin-allopen'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compileOnly group: 'javax', name: 'javaee-api', version: '8.0'
    compile group: 'org.hibernate', name: 'hibernate-core', version: '5.2.13.Final'
    compile group: 'org.glassfish.jersey.media', name: 'jersey-media-json-jackson', version: '2.26'
}

allOpen {
    annotation('javax.ejb.Stateless')
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

7 个答案:

答案 0 :(得分:7)

出现此问题是因为Glassfish将本机sun.*类嵌入到[glassfish5_home]/glassfish/modules/endorsed/grizzly-npn-bootstrap.jar中,因此它与[JDK_HOME]/jre/lib/jsse.jar中包含的其他类冲突

因此,请编辑grizzly-npn-bootstrap.jar(之前进行复制)文件并删除sun文件夹。

答案 1 :(得分:6)

编辑:因为这是“正确的答案”,Java 1.8.0-151可能会缺少安全补丁。我不建议降级到这样一个旧的Java版本。

请查看Payara项目或Glassfish的新版本。

-

尝试将Java版本降级为Java 1.8.0-151。它应该工作。

在使用Java 8 161的glassfish 5中存在一个问题,创建了issue,但是关于这个问题的夜间版本没有变化,我昨天(3月19日)检查过。

答案 2 :(得分:2)

上述错误可能会导致在浏览器中显示该错误:

连接已重置加载页面时,服务器的连接已重置。     该站点可能暂时不可用或太忙。请稍后重试。     如果您无法加载任何页面,请检查计算机的网络连接。     如果您的计算机或网络受到防火墙或代理的保护,请确保允许Firefox访问Web。

解决方案 下载:http://central.maven.org/maven2/org/glassfish/grizzly/grizzly-npn-bootstrap/1.8.1/grizzly-npn-bootstrap-1.8.1.jar 并替换您的galssfish / payara grizzly-npn-bootstrap.jar。

mv grizzly-npn-bootstrap-1.8.1.jar glassfish5 / glassfish / modules / endorsed / grizzly-npn-bootstrap.jar

答案 3 :(得分:2)

我刚刚遇到了这个令人沮丧的问题,我确实想在对我有用的https://stackoverflow.com/a/52479362/4722577上方对Antoine的回答进行一些扩展。

请注意,我有Glassfish 5.0和Java openjdk version "1.8.0_232" OpenJDK Runtime Environment (build 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09) OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)

  1. 正如Antoine所说,我将grizzly-npn-bootstrap.jar复制到了另一个位置作为备份。

  2. 我做了jar -xvf grizzly-npn-bootstrap.jar来查看jar中确切的类和文件夹位置。这给了我以下输出:

cduran@cduran-VirtualBox:~/Documents$ jar -xvf grizzly-npn-bootstrap.jar 
 inflated: META-INF/MANIFEST.MF
  created: META-INF/
  created: META-INF/maven/
  created: META-INF/maven/org.glassfish.grizzly/
  created: META-INF/maven/org.glassfish.grizzly/grizzly-npn-bootstrap/
 inflated: META-INF/maven/org.glassfish.grizzly/grizzly-npn-bootstrap/pom.properties
 inflated: META-INF/maven/org.glassfish.grizzly/grizzly-npn-bootstrap/pom.xml
  created: org/
  created: org/glassfish/
  created: org/glassfish/grizzly/
  created: org/glassfish/grizzly/npn/
 inflated: org/glassfish/grizzly/npn/AlpnClientNegotiator.class
 inflated: org/glassfish/grizzly/npn/AlpnServerNegotiator.class
 inflated: org/glassfish/grizzly/npn/ClientSideNegotiator.class
 inflated: org/glassfish/grizzly/npn/NegotiationSupport.class
 inflated: org/glassfish/grizzly/npn/ServerSideNegotiator.class
  created: sun/
  created: sun/security/
  created: sun/security/ssl/
 inflated: sun/security/ssl/Alerts.class
 inflated: sun/security/ssl/AlpnExtension$Builder.class
 inflated: sun/security/ssl/AlpnExtension.class
 inflated: sun/security/ssl/ClientHandshaker$1.class
 inflated: sun/security/ssl/ClientHandshaker$2.class
 inflated: sun/security/ssl/ClientHandshaker.class
 inflated: sun/security/ssl/ExtensionType.class
 inflated: sun/security/ssl/GrizzlyNPN.class
 inflated: sun/security/ssl/HandshakeMessage$1.class
 inflated: sun/security/ssl/HandshakeMessage$CertificateMsg.class
 inflated: sun/security/ssl/HandshakeMessage$CertificateRequest.class
 inflated: sun/security/ssl/HandshakeMessage$CertificateVerify$1.class
 inflated: sun/security/ssl/HandshakeMessage$CertificateVerify.class
 inflated: sun/security/ssl/HandshakeMessage$ClientHello.class
 inflated: sun/security/ssl/HandshakeMessage$DH_ServerKeyExchange.class
 inflated: sun/security/ssl/HandshakeMessage$DistinguishedName.class
 inflated: sun/security/ssl/HandshakeMessage$ECDH_ServerKeyExchange.class
 inflated: sun/security/ssl/HandshakeMessage$Finished.class
 inflated: sun/security/ssl/HandshakeMessage$HelloRequest.class
 inflated: sun/security/ssl/HandshakeMessage$NextProtocol$Builder.class
 inflated: sun/security/ssl/HandshakeMessage$NextProtocol.class
 inflated: sun/security/ssl/HandshakeMessage$RSA_ServerKeyExchange.class
 inflated: sun/security/ssl/HandshakeMessage$ServerHello.class
 inflated: sun/security/ssl/HandshakeMessage$ServerHelloDone.class
 inflated: sun/security/ssl/HandshakeMessage$ServerKeyExchange.class
 inflated: sun/security/ssl/HandshakeMessage.class
 inflated: sun/security/ssl/Handshaker$1.class
 inflated: sun/security/ssl/Handshaker$DelegatedTask.class
 inflated: sun/security/ssl/Handshaker.class
 inflated: sun/security/ssl/HelloExtensions.class
 inflated: sun/security/ssl/NextProtocolNegotiationExtension$Builder.class
 inflated: sun/security/ssl/NextProtocolNegotiationExtension.class
 inflated: sun/security/ssl/SSLEngineImpl.class
 inflated: sun/security/ssl/ServerHandshaker$1.class
 inflated: sun/security/ssl/ServerHandshaker$2.class
 inflated: sun/security/ssl/ServerHandshaker$3.class
 inflated: sun/security/ssl/ServerHandshaker.class

  1. 观察到jar文件在根级别包含3个文件夹: META-INF org sun 。再次从Antoine的答案中,我们要删除sun文件夹。
  2. 我不知道通过指定要删除的文件夹来重新创建jar的命令行方式,因此我在此命令中通过添加 META-INF 重新创建了grizzly-npn-bootstrap.jar。 >和 org 文件夹:jar -cvf grizzly-npn-bootstrap.jar META-INF/* org/*
  3. 随后,如果我执行jar -xvf grizzly-npn-bootstrap.jar命令,我将得到以下输出(注意不再列出 sun 文件夹):
cduran@cduran-VirtualBox:~/glassfish-5.0-web-profile/glassfish5/glassfish/modules/endorsed$ jar -xvf grizzly-npn-bootstrap.jar 
  created: META-INF/
 inflated: META-INF/MANIFEST.MF
  created: META-INF/maven/
  created: META-INF/maven/org.glassfish.grizzly/
  created: META-INF/maven/org.glassfish.grizzly/grizzly-npn-bootstrap/
 inflated: META-INF/maven/org.glassfish.grizzly/grizzly-npn-bootstrap/pom.properties
 inflated: META-INF/maven/org.glassfish.grizzly/grizzly-npn-bootstrap/pom.xml
  created: org/glassfish/
  created: org/glassfish/grizzly/
  created: org/glassfish/grizzly/npn/
 inflated: org/glassfish/grizzly/npn/ClientSideNegotiator.class
 inflated: org/glassfish/grizzly/npn/ServerSideNegotiator.class
 inflated: org/glassfish/grizzly/npn/AlpnClientNegotiator.class
 inflated: org/glassfish/grizzly/npn/NegotiationSupport.class
 inflated: org/glassfish/grizzly/npn/AlpnServerNegotiator.class
  1. 重新启动玻璃鱼。

在此之后,我不再收到上面发布的OP的错误消息:

java.lang.NoSuchMethodError: sun.security.ssl.SSLSessionImpl。(Lsun / security / ssl / ProtocolVersion; Lsun / security / ssl / CipherSuite; Ljava / util / Collection; Lsun / security / ssl / SessionId; Ljava / lang / String; I)V

答案 4 :(得分:0)

Maybe a little bit more elegant is to use the existing fix done in the npn-grizzly jar:

mkdir -p scratch/glassfish5/glassfish/modules/endorsed && cd scratch
wget http://download.oracle.com/glassfish/5.0.1/nightly/glassfish-5.0.1-b02-12_03_2018.zip
wget http://central.maven.org/maven2/org/glassfish/grizzly/grizzly-npn-bootstrap/1.8.1/grizzly-npn-bootstrap-1.8.1.jar
mv grizzly-npn-bootstrap-1.8.1.jar glassfish5/glassfish/modules/endorsed/grizzly-npn-bootstrap.jar
jar uvf glassfish-5.0.1-b02-12_03_2018.zip glassfish5/glassfish/modules/endorsed/grizzly-npn-bootstrap.jar 
echo "you have a patched archive for runnig with Java 8 patchlevel 191"

HTH

答案 5 :(得分:0)

java 1.8.0_161中安全密码的更改破坏了Glassfish 5,0的基础Grizzly服务器中的SSL功能。上一个有效的Java版本是1.8.0_152  在撰写本文时,我可以确认Java 1.8.0_202与Glassfish 5.1(现在可以从Eclipse.org进行维护并可以从Eclipse.org下载)一起使用了。随附的grizzly-npn-bootstrap版本是1.9.0。无需删除或更改任何内容。

答案 6 :(得分:0)

几天前,我对该问题进行了深入研究,并通过查看JDK源代码找到了根本原因。我认为您现在正在使用openjdk。 这是高达1.8.0_242的openjdk中的错误。 在SSLSessionEngine中使用SSLSessionImpl时,不会实例化它。它用作静态类,但是仅是最终类。 此问题已在1.8.0_252中修复,因此建议您将其升级到此版本。或切换到Oracle jdk1.8.0的任何内部版本,因​​为其中没有此类错误。 希望能帮助到你。 Openjdk: SSLSessionEngine.java SSLSessionImpl.java Oracle JDK: SSLSessionEngine.java