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
|
|