配色: 字号:
android 搭建https Server
2016-12-06 | 阅:  转:  |  分享 
  
android搭建httpsServer

在Android上采用http协议的服务器,需求有点奇葩,非要用https更是醉了。这里只要求单向https认证,不要双向认证。



本文采用的开源框架Nanohttpd(https://github.com/NanoHttpd/nanohttpd),在release页面下载jar包本地进行导入.



Nano的使用比较简单,集成NanoHTTPD这个类,对serve函数进行重载即可。



这里强调使用是https,这个可能比较的麻烦。下面详细进行说明



[java]viewplaincopy在CODE上查看代码片派生到我的代码片

publicclassCenterServiceextendsService{

privatestaticfinalStringTAG=CenterService.class.getSimpleName();

privatestaticfinalintSERVER_PORT=4567;

SoudboxServersoudboxServer;

@Override

publicvoidonCreate(){

super.onCreate();

soudboxServer=newSoudboxServer(SERVER_PORT,this);

Log.i(TAG,"createserver");

newThread(newRunnable(){

@Override

publicvoidrun(){

try{

Log.i(TAG,"serverthreadstart");

createMySSLFactory();

soudboxServer.start();

try{

longstart=System.currentTimeMillis();

Thread.sleep(100L);

while(!soudboxServer.wasStarted()){

Thread.sleep(100L);

if(System.currentTimeMillis()-start>2000){

Assert.fail("couldnotstartserver");

}

}

}catch(InterruptedExceptione){

}

Log.i(TAG,"serverstart");

}catch(IOExceptione){

e.printStackTrace();

}catch(CertificateExceptione){

e.printStackTrace();

}catch(NoSuchAlgorithmExceptione){

e.printStackTrace();

}catch(UnrecoverableKeyExceptione){

e.printStackTrace();

}catch(KeyStoreExceptione){

e.printStackTrace();

}catch(KeyManagementExceptione){

e.printStackTrace();

}

}

}).start();



}



@Nullable

@Override

publicIBinderonBind(Intentintent){

returnnull;

}



@Override

publicintonStartCommand(Intentintent,intflags,intstartId){

returnsuper.onStartCommand(intent,flags,startId);

}



@Override

publicvoidonDestroy(){

super.onDestroy();

if(null!=soudboxServer){

soudboxServer.stop();

}

}

privatestaticfinalStringKEYSTORE_PWD="ssltest";

privatevoidcreateMySSLFactory()throwsNoSuchAlgorithmException,KeyStoreException,IOException,UnrecoverableKeyException,KeyManagementException,CertificateException{

InputStreaminputStream=null;

//选择安全协议的版本

SSLContextctx=SSLContext.getInstance("TLS");

KeyManagerFactorykeyManagers=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());

inputStream=getResowww.baiyuewang.neturces().openRawResource(R.raw.test);

//选择keystore的储存类型,andorid只支持BKS

KeyStoreks=KeyStore.getInstance("BKS");



ks.load(inputStream,KEYSTORE_PWD.toCharArray());



keyManagers.init(ks,KEYSTORE_PWD.toCharArray());



ctx.init(keyManagers.getKeyManagers(),null,null);



SSLServerSocketFactoryserverSocketFactory=ctx.getServerSocketFactory();

soudboxServer.makeSecure(serverSocketFactory,null);

}

}



以上代码不能直接使用,看懂意思就好。上面需要一步步讲解的就是关于createMySSFactory函数



步骤一:生成证书



android上面只支持BKS格式的证书,如果采用默认的Keytool工具生成的JKS格式的,在上面的情况下就跑不通的。



首先到点击下个下载http://www.bouncycastle.org/download/bcprov-ext-jdk15on-155.jar



然后将其放到%JAVA_HOME%\jre\lib\ext这个目录下



找到%JAVA_HOME%\jre\lib\security\Java.security这个文件,进行编辑,加入以下内容:



security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider

通过cmd命令行输入:keytool-genkey-keystoretest.keystore-keyalgRSA-keypassssltest-storepassssltest-storetypeBKS-providerorg.bouncycastle.jce.provider.BouncyCastleProvider



-keystore后面接的是生成文件的名字



-keypass是设置的一个密码(官方说法是更改密钥库的存储口令)



--storepass是设置的一个密码(官方说法是更改条目的的密钥口令)



经过上面的命令后,可以生成一个test.keystore的文件,可以通过下面的命令进行查看:



keytool-list-v-keystoretest.keystore-storepassssltest-storetypeBKS

献花(0)
+1
(本文系thedust79首藏)