- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在尝试使用 apache HttpClient 库注册我的自定义 TrustManger。以下链接包含有关如何执行此操作的说明:Https Connection Android
不幸的是,我想使用的构造函数 (public SSLSocketFactory(SSLContext sslContext) ) 在 Android 版本的 HttpClient 中不可用。我会使用 sslContext 来初始化我的自定义 TrustManager。 Android 似乎已将其替换为“KeyStore”。
我的问题是:(如何)我可以在 Android 中使用 DefaultHttpClient 注册自定义 TrustManger? KeyStore 类中是否有替代方案?
最终我想暂时忽略证书检查......请只考虑 HttpClient 库,因为我的整个应用程序都是基于它的。
最佳答案
解决方案是创建自己的套接字工厂。
public class NetworkSSLSocketFactory implements LayeredSocketFactory {
private SSLContext sslContext;
private SSLSocketFactory socketFactory;
private X509HostnameVerifier hostnameVerifier;
/**
* Creates a socket factory that will use the {@link SSLContext} and
* {@link X509HostnameVerifier} specified. The SSLContext provided should
* have the {@link NetworkTrustManager} associated with it.
*
* @param sslContext
* @param hostnameVerifier
*/
public NetworkSSLSocketFactory(SSLContext sslContext,
X509HostnameVerifier hostnameVerifier) {
this.sslContext = sslContext;
this.socketFactory = sslContext.getSocketFactory();
this.hostnameVerifier = hostnameVerifier;
}
}
然后创建一个使用您的 TrustManager 的 SSLContext,然后创建一个 AndroidHttpClient 并将其 https 模式替换为使用您的 SocketFactory 的模式。
/**
* Return the SSLContext for use with our HttpClient or create a new Context
* if needed.
* <p>
* This context uses our {@link NetworkTrustManager}
*
* @return an {@link SSLContext}
*/
public SSLContext getSSLContext() {
if (mSSLContextInstance != null)
return mSSLContextInstance;
try {
mSSLContextInstance = SSLContext.getInstance("TLS");
TrustManager trustManager = new NetworkTrustManager(getKeyStore());
TrustManager[] tms = new TrustManager[] { trustManager };
mSSLContextInstance.init(null, tms, new SecureRandom());
} catch (NoSuchAlgorithmException e) {
Log.e(TAG, e.getMessage());
} catch (KeyManagementException e) {
Log.e(TAG, e.getMessage());
}
return mSSLContextInstance;
}
现在是客户端
/**
* Return an HttpClient using our {@link NetworkTrustManager} and
* {@link NetworkHostnameVerifier}
*
* @return an {@link HttpClient}
*/
public HttpClient getHttpClient() {
if (mHttpClientInstance != null)
return mHttpClientInstance;
SSLContext sslContext = getSSLContext();
// Now create our socket factory using our context.
X509HostnameVerifier hostnameVerifier = new NetworkHostnameVerifier();
NetworkSSLSocketFactory sslSocketFactory = new NetworkSSLSocketFactory(
sslContext, hostnameVerifier);
// Some services (like the KSOAP client) use the HttpsURLConnection
// class
// to establish SSL connections.
HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);
HttpsURLConnection.setDefaultSSLSocketFactory(sslContext
.getSocketFactory());
// Generate the Client for the Server
mHttpClientInstance = AndroidHttpClient.newInstance(getAgent(),
mContext);
// Get the registry from the AndroidHttpClient and change the
// HTTPS scheme to use our socket factory. This way we can
// control the certificate authority and trust system.
SchemeRegistry schemeRegistry = mHttpClientInstance
.getConnectionManager().getSchemeRegistry();
schemeRegistry.register(new Scheme("https", sslSocketFactory, 443));
return mHttpClientInstance;
}
如果您不知道如何创建新的 keystore ,请看这里:
/**
* Get the current KeyStore or if not yet created, create a new one. This
* will <b>NOT</b> load the KeyStore file identified by
* {@link #KEYSTORE_NAME}. To load the KeyStore file, use the function
* {@link #loadKeyStore()} which will automatically call this function (so
* you don't need to).
* <p>
*
* @return a {@link KeyStore}
*/
public KeyStore getKeyStore() {
if (mKeyStore != null)
return mKeyStore;
try {
String defaultType = KeyStore.getDefaultType();
mKeyStore = KeyStore.getInstance(defaultType);
mKeyStore.load(null, null);
} catch (Exception e) {
Log.w(TAG, e.getMessage());
}
return mKeyStore;
}
上述解决方案是一个解决方案的开始,它允许您创建一个 TrustManager 来验证“System KeyStore”的证书以及您拥有的“Private KeyStore”(两个 keystore )。然后,您无需尝试将证书添加到系统 keystore 。您可以在 getFilesDir() 文件夹中创建自己的 KeyStore。
我仍然没有完成从 HttpResult = HttpClient.execute(HttpPost) 捕获证书的逻辑;方法,但我现在正在积极地写这个。如果您需要帮助,我现在可以与您合作。
如果有人知道如何从 HttpRequestBase 对象中的 SSLSocekt 捕获/获取证书,请告诉我。我正在努力寻找它。
关于android - Android 上的 HttpClient 和自定义 TrustManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5170279/
我如何在 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 包含在所有
我是一名优秀的程序员,十分优秀!