android搭建https,android 搭建https Server(示例代码)
在android上采用http協(xié)議的服務(wù)器,需求有點(diǎn)奇葩,非要用https更是醉了。這里只要求單向https認(rèn)證,不要雙向認(rèn)證。
本文采用的開(kāi)源框架Nanohttpd(?https://github.com/NanoHttpd/nanohttpd ),在release頁(yè)面下載jar包本地進(jìn)行導(dǎo)入.
Nano的使用比較簡(jiǎn)單,集成NanoHTTPD這個(gè)類(lèi),對(duì)serve函數(shù)進(jìn)行重載即可。
這里強(qiáng)調(diào)使用是https,這個(gè)可能比較的麻煩。下面詳細(xì)進(jìn)行說(shuō)明
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;
//選擇安全協(xié)議的版本
SSLContext ctx = SSLContext.getInstance("TLS");
KeyManagerFactory keyManagers = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
inputStream = getResources().openRawResource(R.raw.test);
//選擇keystore的儲(chǔ)存類(lèi)型,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);
}
}
以上代碼不能直接使用,看懂意思就好。上面需要一步步講解的就是關(guān)于 createMySSFactory函數(shù)
步驟一:生成證書(shū)
android 上面只支持BKS格式的證書(shū),如果采用默認(rèn)的Keytool工具生成的JKS格式的,在上面的情況下就跑不通的。
然后將其放到%JAVA_HOME%\\jre\\lib\\ext這個(gè)目錄下
找到%JAVA_HOME%\\jre\\lib\\security\\java.security這個(gè)文件,進(jìn)行編輯,加入以下內(nèi)容:
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
通過(guò)cmd命令行輸入:keytool -genkey -keystore test.keystore -keyalg RSA -keypass ssltest -storepass ssltest -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider
-keystore 后面接的是生成文件的名字
-keypass 是設(shè)置的一個(gè)密碼(官方說(shuō)法是更改密鑰庫(kù)的存儲(chǔ)口令)
--storepass 是設(shè)置的一個(gè)密碼(官方說(shuō)法是更改條目的的密鑰口令)
經(jīng)過(guò)上面的命令后,可以生成一個(gè)test.keystore的文件,可以通過(guò)下面的命令進(jìn)行查看:
keytool -list -v -keystore test.keystore -storepass ssltest -storetype BKS
效果圖如下:
步驟二:將生成的test.keystore放在資源的raw目錄下
關(guān)于SSL的所有信息官網(wǎng)上有詳細(xì)說(shuō)明:
然后再使用最剛開(kāi)始貼出來(lái)代碼即可,親測(cè)可行。
總結(jié)
以上是生活随笔為你收集整理的android搭建https,android 搭建https Server(示例代码)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: IMEI手机串码和serialno
- 下一篇: android和windows技术,《技