提兵百万西湖上,立马吴山第一峰!这篇文章主要讲述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 intSERVER_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 搭建https Server】步骤一: 生成证书
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 -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的所有信息官网上有详细说明:
http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#Debug
然后再使用最刚开始贴出来代码即可, 亲测可行。
推荐阅读
- [Android Pro]Android开发实践(为什么要继承onMeasure())
- Android中的Glide加载图片
- Android --AsyncTask异步任务
- Android补间动画笔记
- Android 使用Fragment界面向下跳转并一级级返回
- 解决某些Android Permission denied
- android的生命周期
- android WebView总 结
- Android_AsyncTask异步任务