Android https自定义ssl证书使用
1,服务端配置单向认证,给出server.crt
2,通过命令生成bks文件
keytool -import -alias cert123 -file server.crt -keystore cert123.bks -storetype BKS -providerClass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath ./bcprov-jdk15on-146.jar -storepass cert160223
keytool使用java自带keytool工具
另外一个重要JCE Provider 必须使用http://www.bouncycastle.org/download/bcprov-jdk15on-146.jar ,而且必须此版本,其他版本会有问题
3,android 中代码配置
1import java.io.InputStream; 2import java.security.KeyStore; 3 4import android.content.Context; 5 6public class MyHttpClient extends DefaultHttpClient { 7 8 private static Context context; 9 10 public static void setContext(Context context) { 11 MyHttpClient.context = context; 12 } 13 14 public MyHttpClient(HttpParams params) { 15 super(params); 16 } 17 18 public MyHttpClient(ClientConnectionManager httpConnectionManager, HttpParams params) { 19 super(httpConnectionManager, params); 20 } 21 22 @Override 23 protected ClientConnectionManager createClientConnectionManager() { 24 SchemeRegistry registry = new SchemeRegistry(); 25 registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 26 27 // 用我们自己定义的 SSLSocketFactory 在 ConnectionManager 中注册一个 443 端口 28 registry.register(new Scheme("https", newSslSocketFactory(), 443)); 29 return new SingleClientConnManager(getParams(), registry); 30 } 31 32 private SSLSocketFactory newSslSocketFactory() { 33 try { 34 // Get an instance of the Bouncy Castle KeyStore format 35 KeyStore trusted = KeyStore.getInstance("BKS"); 36 // 从资源文件中读取你自己创建的那个包含证书的 keystore 文件 37 38 InputStream in = MyHttpClient.context.getResources().openRawResource(R.raw.codeprojectssl); //这个参数改成你的 keystore 文件名 39 try { 40 // 用 keystore 的密码跟证书初始化 trusted 41 trusted.load(in, "这里是你的 keystore 密码".toCharArray()); 42 } finally { 43 in.close(); 44 } 45 // Pass the keystore to the SSLSocketFactory. The factory is responsible 46 // for the verification of the server certificate. 47 SSLSocketFactory sf = new SSLSocketFactory(trusted); 48 // Hostname verification from certificate 49 // http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e506 50 sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER); // 这个参数可以根据需要调整, 如果对主机名的验证不需要那么严谨, 可以将这个严谨程度调低些. 51 return sf; 52 } catch (Exception e) { 53 throw new AssertionError(e); 54 } 55 } 56}
此时应该就可以了,这是单向认证代码。