android搭建https,android 搭建https Server(示例代码)
在android上采用http協議的服務器,需求有點奇葩,非要用https更是醉了。這里只要求單向https認證,不要雙向認證。
本文采用的開源框架Nanohttpd(?https://github.com/NanoHttpd/nanohttpd ),在release頁面下載jar包本地進行導入.
Nano的使用比較簡單,集成NanoHTTPD這個類,對serve函數進行重載即可。
這里強調使用是https,這個可能比較的麻煩。下面詳細進行說明
public class CenterService extends Service{
private static final String TAG = CenterService.class.getSimpleName();
private static final int SERVER_PORT = 4567;
SoudboxServer soudboxServer;
@Override
public void onCreate() {
super.onCreate();
soudboxServer = new SoudboxServer(SERVER_PORT,this);
Log.i(TAG,"create server");
new Thread(new Runnable() {
@Override
public void run() {
try {
Log.i(TAG,"server thread start ");
createMySSLFactory();
soudboxServer.start();
try {
long start = System.currentTimeMillis();
Thread.sleep(100L);
while (!soudboxServer.wasStarted()) {
Thread.sleep(100L);
if (System.currentTimeMillis() - start > 2000) {
Assert.fail("could not start server");
}
}
} catch (InterruptedException e) {
}
Log.i(TAG,"server start");
} catch (IOException e) {
e.printStackTrace();
} catch (CertificateException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnrecoverableKeyException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
}
}
}).start();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
if(null != soudboxServer){
soudboxServer.stop();
}
}
private static final String KEYSTORE_PWD = "ssltest";
private void createMySSLFactory() throws NoSuchAlgorithmException, KeyStoreException, IOException, UnrecoverableKeyException, KeyManagementException, CertificateException {
InputStream inputStream = null;
//選擇安全協議的版本
SSLContext ctx = SSLContext.getInstance("TLS");
KeyManagerFactory keyManagers = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
inputStream = getResources().openRawResource(R.raw.test);
//選擇keystore的儲存類型,andorid只支持BKS
KeyStore ks = KeyStore.getInstance("BKS");
ks.load(inputStream, KEYSTORE_PWD.toCharArray());
keyManagers.init(ks, KEYSTORE_PWD.toCharArray());
ctx.init(keyManagers.getKeyManagers(), null, null);
SSLServerSocketFactory serverSocketFactory = ctx.getServerSocketFactory();
soudboxServer.makeSecure(serverSocketFactory,null);
}
}
以上代碼不能直接使用,看懂意思就好。上面需要一步步講解的就是關于 createMySSFactory函數
步驟一:生成證書
android 上面只支持BKS格式的證書,如果采用默認的Keytool工具生成的JKS格式的,在上面的情況下就跑不通的。
然后將其放到%JAVA_HOME%\\jre\\lib\\ext這個目錄下
找到%JAVA_HOME%\\jre\\lib\\security\\java.security這個文件,進行編輯,加入以下內容:
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
通過cmd命令行輸入:keytool -genkey -keystore test.keystore -keyalg RSA -keypass ssltest -storepass ssltest -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
-keystore 后面接的是生成文件的名字
-keypass 是設置的一個密碼(官方說法是更改密鑰庫的存儲口令)
--storepass 是設置的一個密碼(官方說法是更改條目的的密鑰口令)
經過上面的命令后,可以生成一個test.keystore的文件,可以通過下面的命令進行查看:
keytool -list -v -keystore test.keystore -storepass ssltest -storetype BKS
效果圖如下:
步驟二:將生成的test.keystore放在資源的raw目錄下
關于SSL的所有信息官網上有詳細說明:
然后再使用最剛開始貼出來代碼即可,親測可行。
總結
以上是生活随笔為你收集整理的android搭建https,android 搭建https Server(示例代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IMEI手机串码和serialno
- 下一篇: html连在一起的选择器,请问关于css