- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们正在使用 Hana Cloud Platform Java 应用程序外部的 RESTful 服务。我们能够通过作为应用程序 JEE6 配置文件和其他 HCP 库的一部分提供的 Apache HttpClient (v4.1.3) 与 HCP 中设置的这些目标进行交互,该应用程序配置为使用 JRE 7。
我们连接的集成基础架构供应商最近禁用了 TLSv1.0,从那时起我们在尝试连接 REST 服务时遇到错误。
这是堆栈跟踪:
javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
at sun.security.ssl.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:421)
at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:128)
at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:397)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:150)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:575)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
at com.sap.core.connectivity.httpdestination.client.RequestDirectorExtender.execute(RequestDirectorExtender.java:47)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at com.sap.core.connectivity.httpdestination.impl.AbstractHttpClientWrapper$2.execute(AbstractHttpClientWrapper.java:141)
at com.sap.core.connectivity.httpdestination.impl.AbstractHttpClientWrapper$2.execute(AbstractHttpClientWrapper.java:1)
at com.sap.core.connectivity.httpdestination.impl.AbstractHttpClientWrapper.executeOperation(AbstractHttpClientWrapper.java:300)
at com.sap.core.connectivity.httpdestination.impl.AbstractHttpClientWrapper.execute(AbstractHttpClientWrapper.java:277)
at com.sap.core.connectivity.httpdestination.impl.AbstractHttpClientWrapper.execute(AbstractHttpClientWrapper.java:132)
at com.sap.core.connectivity.httpdestination.impl.AbstractHttpClientWrapper.execute(AbstractHttpClientWrapper.java:126)
at my.domain.hcp.HttpRequestSupport.service(HttpRequestSupport.java:124)
at my.domain.gap.proxy.ProxyServlet.service(ProxyServlet.java:36)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.sap.core.communication.server.CertValidatorFilter.doFilter(CertValidatorFilter.java:156)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:218)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.eclipse.virgo.web.enterprise.security.valve.OpenEjbSecurityInitializationValve.invoke(OpenEjbSecurityInitializationValve.java:44)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
at com.sap.core.jpaas.security.auth.service.lib.AbstractAuthenticator.invoke(AbstractAuthenticator.java:170)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
at com.sap.core.tenant.valve.TenantValidationValve.invokeNextValve(TenantValidationValve.java:168)
at com.sap.core.tenant.valve.TenantValidationValve.invoke(TenantValidationValve.java:94)
at com.sap.js.statistics.tomcat.valve.RequestTracingValve.invoke(RequestTracingValve.java:38)
at com.sap.core.js.monitoring.tomcat.valve.RequestTracingValve.invoke(RequestTracingValve.java:27)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1083)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:640)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:807)
我们已尝试将 JVM 参数添加到 Java 应用程序以强制它使用 TLSv1.1 或 TLSv1.2 而不是使用 TLSv1.0:
-Dhttps.protocols=TLSv1.1,TLSv1.2
设置 JVM 参数没有任何作用,Apache HttpClient 库似乎忽略了此设置。是否有另一种方法可以强制 Apache HttpClient (v4.1.3) 使用更新版本的 TLS?
最佳答案
事实证明,可以扩展类 org.apache.http.conn.ssl.SSLSocketFactory 并将其注册到 HttpClient 以强制客户端使用特定协议(protocol)。事实上,您可以使用相同的机制来更改密码、超时等。
添加此附加代码以从 HttpDestination 创建 HttpClient:
private static final String CA_CERTS_PATH = System.getProperties().getProperty("java.home") + File.separator +
"lib" + File.separator + "security" + File.separator + "cacerts";
private HttpClient createHttpClient(HttpDestination httpDestination)
throws DestinationException, KeyStoreException, IOException, CertificateException, NoSuchAlgorithmException, KeyManagementException {
HttpClient httpClient = httpDestination.createHttpClient();
try (FileInputStream fis = new FileInputStream(CA_CERTS_PATH)) {
KeyStore keyStore = KeyStore.getInstance("JKS");
keyStore.load(fis, "changeit".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), new SecureRandom());
// Instantiate the custom SSLSocketFactory
SSLSocketFactory sslSocketFactory = new CustomSSLSocketFactory(
ctx,
SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER,
new String[]{"TLSv1.1", "TLSv1.2"}
);
// Register the https scheme with the custom SSLSocketFactory
Scheme httpsScheme = new Scheme("https", 443, sslSocketFactory);
httpClient.getConnectionManager().getSchemeRegistry().register(httpsScheme);
}
return httpClient;
}
并扩展 SSLSocketFactory 类:
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.params.HttpParams;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
/**
* Custom SSLSocketFactory to limit connections to specific TLS protocols.
*
* @author Juan Heyns
*/
public class CustomSSLSocketFactory extends SSLSocketFactory {
private final String[] tlsProtocols;
public CustomSSLSocketFactory(SSLContext sslContext, X509HostnameVerifier hostnameVerifier, String[] tlsProtocols) {
super(sslContext, hostnameVerifier);
this.tlsProtocols = tlsProtocols;
}
@Override
public Socket connectSocket(Socket socket, InetSocketAddress remoteAddress, InetSocketAddress localAddress, HttpParams params) throws IOException {
return prepareSocket(super.connectSocket(socket, remoteAddress, localAddress, params));
}
@Override
public Socket createLayeredSocket(Socket socket, String host, int port, boolean autoClose) throws IOException {
return prepareSocket(super.createLayeredSocket(socket, host, port, autoClose));
}
@Override
public Socket createSocket(HttpParams params) throws IOException {
return prepareSocket(super.createSocket(params));
}
@Override
@Deprecated
public Socket createSocket() throws IOException {
return prepareSocket(super.createSocket());
}
@Override
@Deprecated
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException {
return prepareSocket(super.createSocket(socket, host, port, autoClose));
}
@Override
@Deprecated
public Socket connectSocket(Socket socket, String host, int port, InetAddress localAddress, int localPort, HttpParams params) throws IOException {
return prepareSocket(super.connectSocket(socket, host, port, localAddress, localPort, params));
}
/**
* Any socket returned from this class will first be configured.
*
* @param socket
* @return
*/
private Socket prepareSocket(Socket socket) {
if (socket instanceof SSLSocket) {
SSLSocket sslSocket = (SSLSocket) socket;
sslSocket.setEnabledProtocols(tlsProtocols);
}
return socket;
}
}
关于java - 当服务器不支持 TLS 1.0 时,带有目标的 HCP JEE6 应用程序失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41767398/
这个问题已经有答案了: The infamous java.sql.SQLException: No suitable driver found (21 个回答) How to install JDB
我目前正在使用 Java EE 创建一个网站,使用 maven、thymeleaf,并将其托管在 heroku 上(数据库插件是 JawsDBMySQL)。我创建了一个简单的 html 页面以检查它是
当我研究 3 层架构时,有人告诉我它需要三台服务器:1-网络服务器2- 应用服务器3-蓝光服务器不利的是,当我在 JEE 中工作时,有一个 Glassfish 或 JBOS 在其下运行所有模块的服
这个问题在这里已经有了答案: Several ports (8005, 8080, 8009) required by Tomcat Server at localhost are already
我有一个在集群环境中的 Glassfish 3.1.2 上运行的 Java EE 应用程序。 我想每天执行一次特定方法(即从数据库中删除一些条目)。 我创建了一个计时器: @Singleton pub
在我的 JEE 应用程序中,在 glassfish 3 上运行,我遇到以下情况: MyFacade 类 @Interceptors(SomeInterceptor.class) public void
我正在开发的休息应用程序有一个奇怪的问题。 我创建了实体类和 dao 类来管理它们。现在,当我将应用程序部署到服务器时,我可以看到我的数据库架构正在更新。现在我有这个: @Stateless
我有一个需要参数的 bash 脚本。 当我直接从 putty 调用它时,它可以工作,当我从我的 jee 程序中调用它时,它不起作用并且不会向我显示任何错误。 这是我的java代码: String[]
我按照以下顺序在eclipse indigo中安装了以下插件以开始spring开发 Spring 工具套件 M2E( maven ) 这两个安装后,报错jira 连接器未安装,所以我安装了以下插件。
本文整理了Java中org.apache.openejb.jee.oejb2.WebServiceSecurityType类的一些代码示例,展示了WebServiceSecurityType类的具体用
本文整理了Java中org.apache.openejb.jee.oejb2.WebServiceBindingType类的一些代码示例,展示了WebServiceBindingType类的具体用法。
所以我遇到了类似这里的问题... Spring 3.0 Error: The matching wildcard is strict, but no declaration can be found
这个问题在这里已经有了答案: Why there is number two in J2EE name? [duplicate] (1 个回答) 4年前关闭。 我想了解 JEE 和 J2EE 之间的区
我们有一个特殊要求,即我们只需要使用 AEM (Adobe Experience Manager) 来设计(创作)表单模板,其中包含静态图像和 html 元素(例如下拉列表、文本区域等)。 这里的问题
我会保持快速。 我正在按照the Spring documentation listed here的示例进行操作。当我使用Gradle时,我可以使用以下命令运行该应用程序: ./gradlew boo
有什么方法可以全局设置我的 REST header 吗?我尝试结合一些 JAX-RS 技巧,但没有效果。 我的所有 REST 服务都有这些注释: @Produces(MediaType.APPLICA
我在构建 Java JEE 后端来处理 session (与 tomcat 一起提供的 JEE servlet)时遇到问题。 我的前端位于另一台没有 Java、只有 html 和 JavaScript
我正在 JEE 中开发一个应用程序 我在 eclipse 下工作,并使用 Tomcat 作为应用程序服务器。 我介绍了 Java 管理扩展 (JMX) 的概念。 搜索此 API,我发现它用于从计算机或
在 JEE 7 WildFly 环境中,我想要执行任务(工作线程类的方法)而不阻塞调度程序。这样调度程序就能够启动多个独立于调度程序运行的“任务/线程”(即发即忘)。 在普通的旧 Java 中,我只需
我是 Angular 世界的新手,我从一些示例开始,将 Angular 2 与 Rest java 应用程序一起使用(使用 jax-rs )所有这些示例都使用 2 个项目,第一个项目是 JEE 项目,
我是一名优秀的程序员,十分优秀!