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

使用SSL访问Web服务时出错

  •  12
  • Elie  · 技术社区  · 14 年前

    我有一个程序,它应该向Web服务发送一个文件,这需要一个SSL连接。我运行程序如下:

    SET JAVA_HOME=C:\Program Files\Java\jre1.6.0_07
    SET com.ibm.SSL.ConfigURL=ssl.client.props
    "%JAVA_HOME%\bin\java" -cp ".;Test.jar" ca.mypackage.Main
    

    这很好,但是当我把第一行改为

    SET JAVA_HOME=C:\Program Files\IBM\SDP\runtimes\base_v7\java\jre
    

    我得到以下错误:

    com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.net.SocketException: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory
    at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:119)
    at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:140)
    at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:86)
    at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:593)
    at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:552)
    at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:537)
    at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:434)
    at com.sun.xml.internal.ws.client.Stub.process(Stub.java:247)
    at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:132)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:242)
    at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:222)
    at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:115)
    at $Proxy26.fileSubmit(Unknown Source)
    at com.testing.TestingSoapProxy.fileSubmit(TestingSoapProxy.java:81)
    at ca.mypackage.Main.main(Main.java:63)
    Caused by: java.net.SocketException: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory
    at javax.net.ssl.DefaultSSLSocketFactory.a(SSLSocketFactory.java:7)
    at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:1)
    at com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:110)
    at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:14)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:902)
    at com.ibm.net.ssl.www2.protocol.https.b.getOutputStream(b.java:86)
    at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:107)
    ... 14 more
    Caused by: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory
    at javax.net.ssl.SSLJsseUtil.b(SSLJsseUtil.java:20)
    at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:36)
    at javax.net.ssl.HttpsURLConnection.getDefaultSSLSocketFactory(HttpsURLConnection.java:16)
    at javax.net.ssl.HttpsURLConnection.<init>(HttpsURLConnection.java:36)
    at com.ibm.net.ssl.www2.protocol.https.b.<init>(b.java:1)
    at com.ibm.net.ssl.www2.protocol.https.Handler.openConnection(Handler.java:11)
    at java.net.URL.openConnection(URL.java:995)
    at com.sun.xml.internal.ws.api.EndpointAddress.openConnection(EndpointAddress.java:206)
    at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.createHttpConnection(HttpClientTransport.java:277)
    at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:103)
    ... 14 more
    

    因此,这个问题似乎与我正在使用的JRE有关,但似乎没有意义的是,非IBMJRE工作正常,但IBMJRE不正常。有什么想法或建议吗?

    7 回复  |  直到 8 年前
        1
  •  4
  •   Fazal    14 年前

    如果您的非IBMJRE是Sun,那么它已经随附了SSL类实现。

    IBMJRE似乎根本不包含SSL实现类。

        2
  •  20
  •   Jeff Olson    14 年前

    尝试在设置代码的某个位置添加这两行:

    Security.setProperty("ssl.SocketFactory.provider", "com.ibm.jsse2.SSLSocketFactoryImpl");
    Security.setProperty("ssl.ServerSocketFactory.provider", "com.ibm.jsse2.SSLServerSocketFactoryImpl");
    
        3
  •  8
  •   Community dbr    9 年前

    Java只允许一个JVM的SSL连接工厂类。如果您使用的是WebSphere Application Server v6x/7x/8x或Rational Application Developer中的任何其他WebSphere服务器工具附带的JDK,那么这些工具需要来自WebSphere Application Server Runtime的IBM(com.ibm.websphere.ssl.protocol.sslsocketFactory)特定类。 因为Java安全文件具有如下设置的JSSE套接字工厂

    # Default JSSE socket factories
    #ssl.SocketFactory.provider=com.ibm.jsse2.SSLSocketFactoryImpl
    #ssl.ServerSocketFactory.provider=com.ibm.jsse2.SSLServerSocketFactoryImpl
    
    # WebSphere socket factories (in cryptosf.jar)
    ssl.SocketFactory.provider=com.ibm.websphere.ssl.protocol.SSLSocketFactory
    ssl.ServerSocketFactory.provider=com.ibm.websphere.ssl.protocol.SSLServerSocketFactory
    

    因此,如果您取消对默认JSSE套接字工厂的注释,并注释掉WebSphere的那些工厂,那么将要吐了。

    更好的解决方法是在类路径中使用com.ibm.ws.security.crypto.jar文件。这个JAR文件依赖于com.ibm.ffdc.jar文件,所以您需要在类路径中使用它。这两个JAR文件在 <WebSphere_Install_Dirctory>/plugins/

        4
  •  2
  •   Ashish    13 年前

    可以通过取消以下JSSE道具,在WASHHOME/*/Java/JRe/LIB/Sur保卫/JavaAdvices文件中设置这些属性。

    默认JSSE套接字工厂

    ssl.socketfactory.provider=com.ibm.jsse2.sslsocketfactoryImpl ssl.serversocketfactory.provider=com.ibm.jsse2.sslserverScocketfactoryImpl

        5
  •  2
  •   peater dimitrisli    9 年前

    又一个“解决方案”似乎对我有用。创建自己的安全属性文件, my.java.security 内容如下:

    ssl.SocketFactory.provider=
    ssl.ServerSocketFactory.provider=
    

    当调用Java(或者在我的例子中是Maven)时,添加命令行选项:

    -Djava.security.properties=C:\myfiles\my.java.security
    

    摘自IBM Liberty文档: http://www-01.ibm.com/support/knowledgecenter/was_beta_liberty/com.ibm.websphere.wlp.nd.multiplatform.doc/ae/rwlp_trouble.html?lang=en

        6
  •  1
  •   JStefan    8 年前

    在搜索相同的错误消息时找到此主题,但找到了不同的解决方案。 要使用Apache Wink客户端测试HTTPS REST服务,请执行以下操作:

    ClientConfig config = new ClientConfig();
    config.setBypassHostnameVerification(true);
    RestClient client = new RestClient(config);
    

    并将工厂设置为空:

    Security.setProperty("ssl.SocketFactory.provider", "");
    Security.setProperty("ssl.ServerSocketFactory.provider", "");
    

    我的运行时是一个使用IBMWebSphereV8.5.5中的IBMJRE1.7的独立camel测试。

        7
  •  0
  •   Draken R. Shilling    8 年前

    当我的批处理应用程序试图使用ApacheWink从RESTfulWeb服务中获取数据时,我遇到了类似的问题。我使用MyEclipse作为开发环境。并使用了IBMWebSphere8.5提供的JRE。当我改为Sun 1.6 JRE时,问题得到了解决。

    推荐文章