android搭建https,android 搭建https Server(示例代码)

本文档介绍如何在Android上使用NanoHTTPD框架创建一个仅支持单向HTTPS认证的HTTP服务器。首先,需要生成BKS格式的证书,并修改java.security文件以支持BouncyCastle提供者。然后,将证书放入资源目录并加载到服务器中。最后,通过SSLContext初始化服务器,实现HTTPS服务。整个过程包括证书的生成、资源配置和服务器启动的详细步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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

效果图如下:

133cfb9479e047a4b6414d9853bb8241.jpg

步骤二:将生成的test.keystore放在资源的raw目录下

c9b7535983a243a59845fe9dbcb981c9.jpg

关于SSL的所有信息官网上有详细说明:

然后再使用最刚开始贴出来代码即可,亲测可行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值