gpt4 book ai didi

AndroidHttpClient 需要更多信息。自签名 SSL。可能的?

转载 作者:太空狗 更新时间:2023-10-29 12:56:51 26 4
gpt4 key购买 nike

关于 AndroidHttpClient 的信息非常少,特别是我找不到任何好的例子。从我读到的内容来看——我可以使用这个客户端,它是为 SSL 预先配置的。我的目标是 2.2+,所以它很适合我。

  1. 关于我如何使用它有什么好的示例吗?专用于 REST 服务 POST
  2. 是否有关于如何允许自签名证书的示例?我不介意只允许任何证书而不是将特定证书导入本地商店。

谢谢!

我自己的回答(见下面的代码)。

  1. 我有带自签名证书的 IIS 服务器。我不得不采取额外的步骤并生成与外部名称相匹配的证书,而不是服务器名称。
  2. 我使用 AndroidHttpClient。据推测,此客户端具有适用于 Android 的所有“正确”设置,并从版本 8 开始支持
  3. 我在 Application 对象中创建 AndroidHttpClient 并共享。
  4. 我在注入(inject)自定义证书的地方分离了代码,以便以后很容易摆脱它。我注意到应用程序启动时确实需要一些时间才能从资源中加载证书。

我的应用单例版本。请参阅顶部的评论,其中包含有关我用来生成所有内容的命令行的详细信息。始终使用相同的密码以确保其有效。 PKS 文件密码必须匹配。

import android.net.http.AndroidHttpClient;
import android.app.Application;
import android.util.Log;
import idatt.mobile.android.providers.DBLog;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;

import java.io.InputStream;
import java.security.KeyStore;

/*
To generate PKS:
1. Created cert in IIS7 and then exported as pfx. Follow instruction on SelfSSL: http://www.robbagby.com/iis/self-signed-certificates-on-iis-7-the-easy-way-and-the-most-effective-way/
1a. Download tool: http://cid-3c8d41bb553e84f5.skydrive.live.com/browse.aspx/SelfSSL
1b. Run: SelfSSL /N:CN=mydomainname /V:1000 /S:1 /P:8081
I use port 8081 on my server
1c. Export from IIS manager to cert.pfx
2. Run command line in SSL to convert file into X.509:
openssl pkcs12 -in C:\cert.pfx -out C:\cert.cer -nodes
3. Edit file and delete all except -----BEGIN.... END CERTIFICATE----- IMPORTANT! It was working when I got proper (5) amount of dashes and put tags and data on separate lines
4. use keytool. C:\Java\JDK\bcprov.jar was downloaded separately
C:\Users\Ivan>keytool -import -v -trustcacerts -alias key_alias -file C:\cert.cer -keystore C:\mystore.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath C:\Java\JDK\bcprov.jar -storepass 123456

*/

public class MyApplication extends Application
{
private static final String LOG_TAG = "MyApplication";
private AndroidHttpClient androidHttpClient;

@Override
public void onCreate()
{
super.onCreate();
androidHttpClient = createAndroidHttpClient();
}

@Override
public void onLowMemory()
{
super.onLowMemory();
shutdownAndroidHttpClient();
}

@Override
public void onTerminate()
{
super.onTerminate();
shutdownAndroidHttpClient();
}


private AndroidHttpClient createAndroidHttpClient()
{
Log.d(LOG_TAG,"createAndroidHttpClient");

AndroidHttpClient client = AndroidHttpClient.newInstance("Android");

//This is optional call to inject custom BKS that was created from self-signed certificate
client = addCustomCertificate(client);

return client;
}

public AndroidHttpClient getAndroidHttpClient()
{
return androidHttpClient;
}

private void shutdownAndroidHttpClient()
{
if(androidHttpClient!=null && androidHttpClient.getConnectionManager()!=null)
{
androidHttpClient.getConnectionManager().shutdown();
}
}

private AndroidHttpClient addCustomCertificate(AndroidHttpClient client)
{
SSLSocketFactory sf = SSLSocketFactory.getSocketFactory();

try
{
InputStream in = getResources().openRawResource(R.raw.home_server);

KeyStore trustStore = KeyStore.getInstance("BKS");

trustStore.load(in, "123456".toCharArray());
in.close();

sf = new SSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);
}
catch (Exception t)
{
DBLog.InsertError(this, t);
}

//Lets register our custom factory here
client.getConnectionManager().getSchemeRegistry().register(new Scheme("https", sf, 443));

return client;
}
}

下面是我如何使用这个客户端(我在 AsyncTask 中调用它)

private String processPOST(String url, String requestData)
{
String responseData = null;
application = (MyApplication)getApplication();
AndroidHttpClient client = application.getAndroidHttpClient();
HttpPost request = new HttpPost(url);

try
{
StringEntity entity = new StringEntity(requestData);
entity.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
request.setEntity(entity);
ResponseHandler<String> handler = new BasicResponseHandler();
responseData = client.execute(request, handler);
}
catch (Throwable e)
{
DBLog.InsertError(ctxt, e);
}

return responseData;
}

这个组合似乎 100% 在 2.2 和 2.3 设备上工作。当我将代码 fragment 与 DefaultHttpClient 一起使用时,我遇到了 2.3.1 请求超时问题 (Nexus S)

最佳答案

您可以使用 Apache HttpClient。

    public HttpClient getNewHttpClient() {
try {
KeyStore trustStore = KeyStore.getInstance("BKS");
InputStream in = getResources().openRawResource(R.raw.mykeystore);
try {
trustStore.load(in, "mypassword".toCharArray());
} finally {
in.close();
}

SSLSocketFactory sf = new SSLSocketFactory(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);

HttpParams params = new BasicHttpParams();
HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
registry.register(new Scheme("https", sf, 443));

ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);
return new DefaultHttpClient(ccm, params);
} catch (Exception e) {
return new DefaultHttpClient();
}
}

在Web服务器中,IIS可以创建自签名证书并导出为PFX,然后使用openssl工具将其转换为PEM,将其编辑为conatin only证书,然后使用JDK和Bouncy CaSTLe的keytool创建包含证书的 keystore jar 。如上代码所示,可以将创建的 keystore 导入到您的项目中。

关于AndroidHttpClient 需要更多信息。自签名 SSL。可能的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5654825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com