HttpsServer 处理程序未被调用
HttpsServer Handlers were not getting called
我正在使用以下 HttpsServer 来实现一个简单的安全服务器。首先,我创建了密钥库并生成了密钥对,并且在密钥库中有一个自签名证书。我正在使用以下代码来设置代码。
server = HttpsServer.create(new InetSocketAddress( SERVER_PORT), conversationCount);
SSLContext sslContext = SSLContext.getInstance("TLS");
char[] password= "XXXXX".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream("server_keystore");
ks.load(fis, password);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
而我的服务器代码如下
server.setHttpsConfigurator( getConfigurator(sslContext));
server.createContext("/", new RootRequestHandler());
server.setExecutor(threadPool);
server.start();
threadPool= Executors.newFixedThreadPool(conversationCount);
threadPool.execute(new Runnable() {
public void run() {
System.out.println("Asynchronous task");
}
});
我的配置器如下所示。
private HttpsConfigurator getConfigurator( SSLContext sslContext) {
return new HttpsConfigurator(sslContext) {
@Override
public void configure (HttpsParameters params) {
SSLEngine m_engine = sslContext.createSSLEngine();
final SSLContext context = getSSLContext();
final SSLParameters sslParams = context.getDefaultSSLParameters();
params.setNeedClientAuth(false);
params.setSSLParameters(sslParams);
params.setCipherSuites(m_engine.getEnabledCipherSuites());
params.setProtocols(m_engine.getEnabledProtocols());
}
};
}
每当我打开 https://localhost:8001/ "This web page is not available" "ERR_CONNECTION_CLOSED" 错误时,都会在浏览器上显示。
我还用单元测试测试了代码,但测试失败并出现以下错误。
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
我知道,每当我从浏览器调用服务器时,我都看到配置代码总是被调用而不是处理程序。即使调用了服务器,请求也不会定向到某些方式。我无法弄清楚我在这里做错了什么。希望有人能帮助我。
在代码中反复试验后,我发现代码没有任何问题,所以我更改了我一直使用的键的类型。然后我意识到错误出在密钥上,并且由于某种原因 EC 密钥不可用而 RSA 密钥可用。
我正在使用以下 HttpsServer 来实现一个简单的安全服务器。首先,我创建了密钥库并生成了密钥对,并且在密钥库中有一个自签名证书。我正在使用以下代码来设置代码。
server = HttpsServer.create(new InetSocketAddress( SERVER_PORT), conversationCount);
SSLContext sslContext = SSLContext.getInstance("TLS");
char[] password= "XXXXX".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream("server_keystore");
ks.load(fis, password);
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, password);
TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
tmf.init(ks);
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
而我的服务器代码如下
server.setHttpsConfigurator( getConfigurator(sslContext));
server.createContext("/", new RootRequestHandler());
server.setExecutor(threadPool);
server.start();
threadPool= Executors.newFixedThreadPool(conversationCount);
threadPool.execute(new Runnable() {
public void run() {
System.out.println("Asynchronous task");
}
});
我的配置器如下所示。
private HttpsConfigurator getConfigurator( SSLContext sslContext) {
return new HttpsConfigurator(sslContext) {
@Override
public void configure (HttpsParameters params) {
SSLEngine m_engine = sslContext.createSSLEngine();
final SSLContext context = getSSLContext();
final SSLParameters sslParams = context.getDefaultSSLParameters();
params.setNeedClientAuth(false);
params.setSSLParameters(sslParams);
params.setCipherSuites(m_engine.getEnabledCipherSuites());
params.setProtocols(m_engine.getEnabledProtocols());
}
};
}
每当我打开 https://localhost:8001/ "This web page is not available" "ERR_CONNECTION_CLOSED" 错误时,都会在浏览器上显示。
我还用单元测试测试了代码,但测试失败并出现以下错误。
javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
我知道,每当我从浏览器调用服务器时,我都看到配置代码总是被调用而不是处理程序。即使调用了服务器,请求也不会定向到某些方式。我无法弄清楚我在这里做错了什么。希望有人能帮助我。
在代码中反复试验后,我发现代码没有任何问题,所以我更改了我一直使用的键的类型。然后我意识到错误出在密钥上,并且由于某种原因 EC 密钥不可用而 RSA 密钥可用。