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 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格式的,在上面的情况下就跑不通的。

首先到点击下个下载 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


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



  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
可以参考以下示例代码: ```java import com.yanzhenjie.andserver.AndServer; import com.yanzhenjie.andserver.Server; import com.yanzhenjie.andserver.Server.ServerListener; import com.yanzhenjie.andserver.http.HttpRequest; import com.yanzhenjie.andserver.http.HttpResponse; import com.yanzhenjie.andserver.util.IOUtils; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class AndServerSample { public static void main(String[] args) { // 创建AndServer Server server = AndServer.serverBuilder() .port(8080) .listener(new ServerListener() { @Override public void onStarted() { System.out.println("Server started."); } @Override public void onStopped() { System.out.println("Server stopped."); } @Override public void onException(Exception e) { System.err.println("Server exception: " + e.getMessage()); } }) .build(); // 添加处理器 server.addHandler("/hello", new HttpHandler() { @Override public void handle(HttpRequest request, HttpResponse response) { response.setHeader("Content-Type", "text/plain"); response.setBody("Hello, AndServer!"); // send response response.commit(); } }); server.addHandler("/file", new HttpHandler() { @Override public void handle(HttpRequest request, HttpResponse response) { FileInputStream fis = null; try { fis = new FileInputStream("test.txt"); byte[] bytes = IOUtils.toByteArray(fis); response.setBody(bytes); response.commit(); } catch (FileNotFoundException e) { response.setStatusCode(404); response.commit(); } catch (IOException e) { response.setStatusCode(500); response.commit(); } finally { IOUtils.closeQuietly(fis); } } }); // 启动服务器 server.startup(); } } ``` 在该示例代码中,AndServer监听本地8080端口,然后添加了两个处理器,一个是用来返回“Hello, AndServer!”字符串,另一个是用来读取文件并返回文件内容。最后启动服务器。如果需要退出服务器,可以通过`server.shutdown()`方法关闭服务器

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值