- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想将自定义信任管理器分配给特定的 org.apache.axis.client.Call。对于 Java 中的常规 HTTP 客户端,我只需创建一个 SSLContext 和 TrustManager。
这在 Apache Axis 中有可能吗?
最佳答案
这在 Apache Axis 中是很有可能的,当您想要创建自定义 SSLContext 和 TrustManager 时,您就发现了。您可以创建一个实现 Axis SecureSocketFactory 接口(interface)的类,并定义一个将返回自定义套接字的 create() 方法。在调用您的调用之前,您必须通过以下代码行告诉 Axis 您想要使用此自定义套接字工厂:
AxisProperties.setProperty("axis.socketSecureFactory", "com.ade.martini.YourSecureSocketFactory");
之后,您可以像往常一样调用 Axis:
Service service = new Service();
Call call = (Call) service.createCall();
// set your endpoint, operation, etc.
call.invoke(...);
YourSecureSocketFactory
类可能如下所示:
package com.ade.martini;
import org.apache.axis.components.net.BooleanHolder;
import org.apache.axis.components.net.SecureSocketFactory;
import javax.net.ssl.*;
import java.io.*;
import java.net.Socket;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import java.util.Hashtable;
public class YourSecureSocketFactory implements SecureSocketFactory {
private String KEYSTORE_TYPE = "JKS";
private String PROTOCOL = "SSL";
private String ALGORITHM = "SunX509";
private int DEFAULT_PORT = 443;
protected SSLSocketFactory sslFactory = null;
private String keystoreFile;
private String keystorePass;
private KeyStore kstore = null;
public AxisSecureSocketFactory(Hashtable attributes) {
}
public Socket create(String host, int port, StringBuffer otherHeaders, BooleanHolder useFullURL)
throws Exception {
if (sslFactory == null) initFactory();
if (port<=0) port = DEFAULT_PORT;
Socket sslSocket = sslFactory.createSocket(host, port);
return sslSocket;
}
protected void initFactory() throws IOException {
/* One way to find certificates */
keystoreFile = "yourkeystore.jks";
keystorePass = "password";
try {
SSLContext sslContext = getContext();
sslFactory = sslContext.getSocketFactory();
} catch (Exception e) {
if (e instanceof IOException) {
throw (IOException) e;
}
throw new IOException(e.getMessage());
}
}
/* this method will accept all certificates and therefore should NOT
be used in most production settings */
private TrustManager[ ] getTrustManagers() {
TrustManager[ ] certs = new TrustManager[ ] {
new X509TrustManager() {
public X509Certificate[ ] getAcceptedIssuers() { return null; }
public void checkClientTrusted(X509Certificate[ ] certs, String t) { }
public void checkServerTrusted(X509Certificate[ ] certs, String t) { }
}
};
return certs;
}
protected SSLContext getContext() throws Exception {
kstore = initKeyStore(keystoreFile, keystorePass);
KeyManagerFactory kmf = KeyManagerFactory.getInstance(ALGORITHM);
kmf.init(kstore, keystorePass.toCharArray());
SSLContext sslContext = SSLContext.getInstance(PROTOCOL);
sslContext.init(kmf.getKeyManagers(), getTrustManagers(), new SecureRandom());
return (sslContext);
}
private KeyStore initKeyStore(String keystoreFile, String keystorePass)
throws IOException {
try {
KeyStore kstore = KeyStore.getInstance(KEYSTORE_TYPE);
ClassLoader classLoader = YourSecureSocketFactory.class.getClassLoader();
File file = new File(classLoader.getResource(keystoreFile).getFile());
InputStream istream = new FileInputStream(file);
kstore.load(istream, keystorePass.toCharArray());
return kstore;
} catch (FileNotFoundException fnfe) {
throw fnfe;
} catch (IOException ioe) {
throw ioe;
} catch (Exception ex) {
ex.printStackTrace();
throw new IOException("Exception trying to load keystore " + keystoreFile + ": " + ex.getMessage());
}
}
}
如果您在 create()
方法中放置一个断点,您会注意到它会在您调用 Axis 时执行。看到这段代码正在执行,即确认 Axis 正在使用您的自定义套接字以及我们定义的自定义 TrustManager。
请注意,我在示例代码中使用的 TrustManager 将接受来自服务器的所有 证书。这通常不是您在生产中想要的行为。
关于ssl - Apache 轴自定义 TrustManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27300946/
我如何在 grails 中使用以下代码—— TrustManager[] trustAllCerts = new TrustManager[]{ new X509Tru
我正在尝试创建一个 TrustManagers 数组,其中填充了从 Base64 编码的 PEM 字符串解码的 CA 证书,以便在 SSLSocketFactory 中传递它。这是我的代码: publ
我正在围绕我们内部使用的一些其余 Web 服务构建一个小型包装器 Java 类。我们使用安全的 HTTPS 连接。通常,SSL 只允许受信任的证书。我希望包装类的用户能够将 X509Certifica
我正在努力使我的 Android 应用程序符合 Android 的新政策,即根据此 requirement and instructions 拥有安全应用程序. 1) 我首先将 SSL 和 https
我想将自定义信任管理器分配给特定的 org.apache.axis.client.Call。对于 Java 中的常规 HTTP 客户端,我只需创建一个 SSLContext 和 TrustManage
在什么情况下会在 Java 中使用 HostnameVerifier 而不是 TrustManager?一个比另一个推荐吗?查看 Java 文档(Interface HostnameVerifier
我试图找出 HTTPS 连接中使用的 TrustManager 和 keyManager 之间的区别。如果发布了相同的引用资料,那将会很有帮助,因为我无法获得正确的信息。 谢谢和问候,苏伦达尔 最佳答
在我们的应用程序中,当应用程序与服务器通信时,我会额外检查证书(公钥固定)(针对 MITMA)。为了与服务器通信,我使用 HttpClient。另外我在生产中有一些代理服务器,所以我需要使用 SNI。
在我的项目使用 1.4.0.M3 版本的 Spring Boot 前几周,它使用 tomcat-embedded-core-8.0.33。在这里,我能够使用以下代码创建多连接器: @Bean Embe
我有一个要求,可以提供一个中间 CA 来信任,但不能提供签署它的 CA。并将其用作信任库,我希望能够信任具有由该中间 CA 签名的证书的 SSL 服务器。默认实现是期望构建整个链,直到找到受信任的自签
我已经阅读了很多关于设置我的 SSL 客户端/服务器系统(无 HTTP)的资料。 我的灵感来自 the secure chat example和 the websocket ssl server ex
在开发者控制台中我的应用名称旁边看到了来自 Google 的警告,内容涉及 TrustManager 的不安全实现。我浏览了代码,但没有使用 TrustManager 或 checkServerTru
在 Mac 上的 Eclipse 4.3.2 Java 1.7 中调试某些代码时,我出现了非常奇怪的行为。 我有一些库(没有源代码),可能定义它自己的TrustManager(我的猜测)。当在调试期间
我正在尝试在 IBM 云 VM (Ubuntu 18) 上启动一个 spring 应用程序。我使用的命令是 java -jar application.jar。它使用 spring 数据和 SSL 证
我正在尝试使用以下代码绕过证书: private static HttpClient wrapClient(HttpClient base) 抛出 AGException { 尝试 { SSLCont
在我当前基于 netty (3.5.2) 的服务器中 I am able to ask the client for a certificate using TLS renegotiation .根据
对 keystore 和信任库使用 KeyStore 对象有什么区别?而不是使用 KeyManager 和 TrustManager? 让我解释一下我为什么要问。我正在使用 RESTEasy,需要使用
首先我不得不承认,我知道接受所有证书可以被认为是没有安全性的。我们有“真正的”证书,但只在我们的实时系统上。我们测试系统上的证书是自签名的。所以只要我们在开发,我们就必须使用测试服务器,这迫使我禁用证
我一直在尝试使用 apache HttpClient 库注册我的自定义 TrustManger。以下链接包含有关如何执行此操作的说明:Https Connection Android 不幸的是,我想使
我有一个与 HTTPS RPC 通信的应用程序。 HTTP 服务器正在使用 CAcert 签名证书。 我正在使用自定义 TrustManager 来验证证书。 因为我不能确定,CAcert 包含在所有
我是一名优秀的程序员,十分优秀!