Android 我的本地HttpServer存在SSL加密问题,加密未激活

Android 我的本地HttpServer存在SSL加密问题,加密未激活,android,Android,首先,我尝试设置一个没有加密的HTTP服务器。成功了。接下来,我想添加SSL加密以保护连接。所以请理解,我需要一个证书 我使用了sun.net.HttpsServer: import com.sun.net.httpserver.HttpExchange; import com.sun.net.httpserver.HttpHandler; import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpsC

首先,我尝试设置一个没有加密的HTTP服务器。成功了。接下来,我想添加SSL加密以保护连接。所以请理解,我需要一个证书

我使用了
sun.net.HttpsServer

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpsConfigurator;
import com.sun.net.httpserver.HttpsServer;
import java.net.InetSocketAddress;
import java.net.Socket;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManagerFactory;
import javax.security.auth.x500.X500Principal;

private static final String KEYSTORE_PASSWORD = "pass_store";
private static final String KEY_PASSWORD = "pass_key";
private int port = 5000;
private HttpServer mHttpServer = null;
private HttpExchange mHttpExchange=null;
private InetSocketAddress isa=null;
private Socket serverSocket =null;
private Config config;
private HttpsServer mHttpsServer = null;
我的代码:

private SSLContext getSslContext()引发异常{
KeyStore ks=KeyStore.getInstance(“PKCS12”);
load(新文件inputstream(KEYSTORE_文件),KEYSTORE_PASSWORD.toCharArray());
KeyManagerFactory kmf=KeyManagerFactory.getInstance(“X509”);
init(ks,KEY_PASSWORD.toCharArray());
TrustManagerFactory tmf=TrustManagerFactory.getInstance(“X509”);
tmf.init(ks);
SSLContext SSLContext=SSLContext.getInstance(“TLSv1.2”);
sslContext.init(kmf.getKeyManager(),tmf.getTrustManager(),null);
返回sslContext;
}
私有void startHTTPServer(){
试一试{
isa=新的InetSocketAddress(端口);
mHttpsServer=HttpsServer.create(isa,0);
SSLContext SSLContext=getSslContext();
setHttpSSConfiguration(新的HttpSSConfiguration(sslContext));
mhttpserver.createContext(“/”,rootHandler);
mhttpserver.createContext(“/index”,rootHandler);
mhttpserver.start();//startServer服务器;
}捕获(IOE异常){
e、 printStackTrace();
}捕获(例外e){
e、 printStackTrace();
}
}
私有void sendResponse(HttpExchange HttpExchange,字符串响应文本){
试一试{
//httpExchange.sendResponseHeaders(200,(long)responseText.length());
字节[]bs=responseText.getBytes(“UTF-8”);
httpExchange.SendResponseHeader(200,bs.长度);
OutputStream os=httpExchange.GetResponseBy();
操作系统写入(bs);
//OutputStream os=httpExchange.GetResponseBy();
//write(responseText.getBytes());
os.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
私有HttpHandler rootHandler=新HttpHandler(){
@凌驾
公共无效句柄(HttpExchange HttpExchange)引发IOException{
if(httpExchange.getRequestMethod().equals(“GET”)){
SharedReferences SharedReferences=GetSharedReferences(
config.mypreferences,Context.MODE_PRIVATE);
sendResponse(httpExchange,“+Config.messageCheckServerAvailable+”:“+sharedPref.getString(Config.keyPrefs_universID,null));
}
}
};

SSL加密需要使用keytool创建的证书来验证客户端。我该怎么做?谢谢。

您通常应该避免使用
com.sun
包中的类,这被认为是不好的做法。我建议您更改服务器实现。如果您有解决方案,我很感兴趣?我不知道是否有特定于Android的解决方案,但您可以查看类似或的内容。他们被广泛使用,我想他们也在安卓系统上工作。您可以查看有关如何自行设置SSL加密的文档。您可能希望查看此文档以了解背景: