如何在Android上使NanoHTTPD接受客户端与专用客户端证书的连接

时间:2017-08-15 01:03:13

标签: android ssl ssl-certificate

我使用NanoHTTPD在Android设备上制作网络服务。但它将信任所有证书并接受来自所有客户端的SSL连接。我想限制特定客户端的访问权限。

更新: 我试着像这样工作:

        String KEYSTOREPASS = "test";
        char[]ctpass = KEYSTOREPASS.toCharArray();
        KeyStore ks = KeyStore.getInstance("PKCS12");

        //Directly load cert from Resources
        //ks.load(ctx.getResources().openRawResource(R.raw.cayan_cert),kspass);

        //Or dynamically generate a cert and use it
        ipAddressInCN = MainApplication.getIPAddress();

        //Use the current IP Address to generate a cert that signed by hard coded CA, and add to keystore
        String CN = "CN=" + ipAddressInCN;
        ks.load(null, null);
        GenerateCSR.AddCertToKeyStore(ks, ctpass, CN);

        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init(ks, ctpass);

        SSLContext sc = SSLContext.getInstance("TLS");

        TrustManager[] tm = new TrustManager[]{new X509TrustManager() {

            public java.security.cert.X509Certificate[] getAcceptedIssuers() {

                return new java.security.cert.X509Certificate[0];
            }

            public void checkClientTrusted(java.security.cert.X509Certificate[] certs,
                                           String authType) {
                System.out.println("abc");
                return;
            }

            public void checkServerTrusted(java.security.cert.X509Certificate[] certs,
                                           String authType) {

                return;
            }

        }};

        sc.init(kmf.getKeyManagers(), tm, null);
        server.makeSecure(sc.getServerSocketFactory(), null);

我尝试将断点设置为我的自定义信任管理器函数,但它们永远不会被调用。

1 个答案:

答案 0 :(得分:0)

  

但它会信任所有证书并接受来自所有客户端的SSL连接。

不正确。它只接受来自具有可信证书的客户端的SSL连接,除非你已经安装了一些脑死信任所有证书垃圾,在这种情况下你应该删除它们。

  

我想仅限制来自特定客户端的访问权限。

您应该通过授权来实现,您必须在NanoHTTPD中实现。