java - 使用 Jersey 1 服务 https
问题描述
我正在尝试更新旧的 RESTful API 以允许它服务于 https;我实际上并不需要增加的安全性,但我有客户抱怨混合上下文 - 这是在仅使用 REST 进行通信的已部署桌面应用程序上;不是已部署的 Web 应用程序。
这是 jersey 1 的实现,我试图避免升级到 Jersey 2。HTTP 服务非常简单:
this.server = HttpServerFactory.create(baseUri,
new DefaultResourceConfig(DataPaqResource.class));
因此,我环顾四周并从 javadocs 中提取以下内容,以根据传入的基本 uri 启动 https 或 http:
StartWebServer(String baseUri) throws IOException, NoSuchAlgorithmException{
ResourceListeners.addDataPaqResourceListener(this);
if (baseUri.startsWith("https")) {
SSLContext sslContext = SSLContext.getInstance ("SSL");
this.server = (HttpsServer) HttpServerFactory.create(baseUri,
new DefaultResourceConfig(DataPaqResource.class));
((HttpsServer) this.server).setHttpsConfigurator (new HttpsConfigurator(sslContext) {
public void configure (HttpsParameters params) {
SSLContext c = getSSLContext();
// get the default parameters
SSLParameters sslparams = c.getDefaultSSLParameters();
params.setSSLParameters(sslparams);
}
});
}else {
this.server = HttpServerFactory.create(baseUri,
new DefaultResourceConfig(DataPaqResource.class));
}
System.out.println("Started web server on " + baseUri + " imp " +
this.server.getClass().getName());
}
这适用于 http 但使用 https 我得到:
错误:客户端网络套接字在建立安全 TLS 连接之前断开
这个错误来自邮递员,但显然浏览器也失败了。基本上我知道 https 配置不正确,但我不确定如何配置它。我不需要保安;我只需要能够以最少的配置提供 https 服务。
任何和所有的帮助都感激不尽!
解决方案
解决了它 - 除了我错误地加载了密钥库之外,它基本上一切正常!
//keystore generated with
//keytool -genkeypair -keyalg RSA -alias self_signed -keypass datapaq -keystore
//datapaq.keystore -storepass datapaq
public class StartWebServer implements DataPaqResourceListener{
private HttpServer server;
private static final String password = "datapaq";
StartWebServer(String baseUri) throws IOException, NoSuchAlgorithmException, KeyStoreException, CertificateException, UnrecoverableKeyException, KeyManagementException{
ResourceListeners.addDataPaqResourceListener(this);
if (baseUri.startsWith("https")) {
this.server = (HttpsServer) HttpServerFactory.create(baseUri,
new DefaultResourceConfig(DataPaqResource.class));
SSLContext sslContext = SSLContext.getInstance ("SSL");
KeyStore ks = getKeyStore();
// Set up the key manager factory
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, password.toCharArray());
// Set up the trust manager factory
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
// Set up the HTTPS context and parameters
((HttpsServer) this.server).setHttpsConfigurator (new HttpsConfigurator(sslContext) {
public void configure (HttpsParameters params) {
try {
// Initialise the SSL context
SSLContext context = getSSLContext();
SSLEngine engine = context.createSSLEngine();
engine.setNeedClientAuth(false);
engine.setWantClientAuth(false);
params.setNeedClientAuth(false);
params.setWantClientAuth(false);
params.setCipherSuites(engine.getEnabledCipherSuites());
params.setProtocols(engine.getEnabledProtocols());
// Set the SSL parameters
SSLParameters sslParameters = context.getSupportedSSLParameters();
params.setSSLParameters(sslParameters);
} catch (Exception ex) {
ex.printStackTrace();
}
}
});
}else {
this.server = HttpServerFactory.create(baseUri,
new DefaultResourceConfig(DataPaqResource.class));
}
}
private KeyStore getKeyStore() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException {
// Initialise the keystore
char[] password = "datapaq".toCharArray();
KeyStore ks = KeyStore.getInstance("JKS");
InputStream fis = new FileInputStream("datapaq.keystore");
ks.load(fis, password);
return ks;
}
}
推荐阅读
- node.js - Docker typescript node.js 无法启动应用程序?
- java - 尝试从 Android Studio 中的 json 对象中检索 json 值
- python - discord py 通过 DM 添加角色
- joomla3.0 - JDatabaseDriver::getInstance() Joomla 中的 loadExtension
- spring - 如何在spring集成replyChannel中获取数据。能够使用 TCP 出站网关发送请求,但在未读取回复通道的情况下超时
- c++ - 模板专业化无法在没有前向声明的情况下解析此上下文方法
- java - Hyperledger Indy 创建 RevocationRegistry 失败,由于 schema_ref 而导致 credDefId 格式错误
- google-chrome-extension - Vue Devtools 落后于应用程序事件
- odoo - 如何修改脚手架命令的文件和文件夹结构?
- c# - 如何在 C# 中将变量从一种形式导出/导入到另一种形式?