gpt4 book ai didi

java - 我怎样才能让一台服务器接受 2 个不同网站的安全流量

转载 作者:行者123 更新时间:2023-12-05 05:29:22 25 4
gpt4 key购买 nike

使用“let's encrypt”,我为我的 2 个网站创建了证书。我使用 certbot/openssl/keytool 最终得到:site1.keystore 和 site2.keystore

这是我简化的 java 代码:

public class TestServer
{
public static void main(String[] args) throws Exception
{
int port = 1443;
char[] passphrase = "changeit".toCharArray();

KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(new FileInputStream ("/path/to/site1.keystore"), passphrase);

KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, passphrase);

SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(kmf.getKeyManagers(), null, null);

SSLServerSocketFactory ssf = null;
ssf = ctx.getServerSocketFactory();

ServerSocket ss = ssf.createServerSocket(port);
while (true)
{
Socket socket = ss.accept();
OutputStream out = socket.getOutputStream();
String response = "Hello from secure server";
out.write(("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nContent-Length: " + response.length() + "\r\n\r\n" + response).getBytes());
out.flush();
socket.close();
}
}
}

如果我使用 site1.keystore ,我可以连接到 site1如果我使用 site2.keystore ,我可以连接到 site2到目前为止一切顺利...

为了能够连接到两个站点,我将两个 keystore 合并到一个 all.keystore 中

不幸的是,它没有按预期工作......也许有人知道缺少什么?

最佳答案

在挖掘“服务器名称指示”(感谢 luk2302)之后,我找到了 2 种可能的解决方案来解决我的问题。最简单的方法是为我的 2 个站点设置一个证书;这可以通过以下方式实现:

sudo certbot certonly --force-renewal --standalone -d site1.com -d site2.com ...

然后像往常一样构建我的 keystore 。

如果我仍然希望每个站点有一个证书,解决方案会更复杂:接受任何套接字连接,读取并分析 TLS header ,获取服务器名称目标,然后我们知道哪个是所需的证书。

关于这个主题有一个很好的技术说明: https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SNIExamples

关于java - 我怎样才能让一台服务器接受 2 个不同网站的安全流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75006116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com