gpt4 book ai didi

java - 如何为 Java HTTPS *服务器*配置 SSL 密码套件?

转载 作者:搜寻专家 更新时间:2023-11-01 00:58:58 24 4
gpt4 key购买 nike

注意:对于 Java HTTPS 客户端,这个问题已经被问过很多次了;我的问题是关于配置服务器

我正在尝试使用 MockWebServer 来测试我的 OkHttpClient 配置。我的代码命中的真实 Web 服务器刚刚放弃了 TLS v1.0 支持,因此我正在更改我的代码以使用 TLS v1.2 并使用服务器的首选密码套件。我想使用模拟真实服务器的内存 Web 服务器来测试此更改,但我不知道如何在我的测试中使用特定的密码套件列表配置 SSLContext . (我需要访问的所有方法都在 SSLContextImpl 及其内部类中得到了很好的保护。)

我能想到的最好的方法是完全包装一个 SSLServerSocketFactory,覆盖 4 个 createServerSocket() 方法,然后在 SSLServerSocket 上调用 setEnabledCipherSuites()返回它,类似于此答案对客户端上的 SSLSocketFactoryEx 的处理方式:https://stackoverflow.com/a/23365536/278800

令人沮丧的是,使用特定的 TLS 版本就像调用例如SSLContext.getInstance("TLSv1.2"),但没有类似的简单方法来配置密码套件。

最佳答案

我最终采用的方法是包装底层 SSLSocketFactory,并在返回之前调用 SSLSocket 上的 sslSocket.setEnabledCipherSuites(..),如下所示:

final class MySSLSocketFactory extends SSLSocketFactory {
final SSLSocketFactory wrappedSSLSocketFactory;

MySSLSocketFactory(SSLSocketFactory wrappedSSLSocketFactory) {
this.wrappedSSLSocketFactory = wrappedSSLSocketFactory;
}

@Override
public String[] getDefaultCipherSuites() {
return getMyCipherSuites();
}

@Override
public String[] getSupportedCipherSuites() {
return getMyCipherSuites();
}

@Override
public Socket createSocket(Socket s, String host, int port, boolean autoClose) throws IOException {
final SSLSocket sslSocket = (SSLSocket) wrappedSSLSocketFactory.createSocket(s, host, port, autoClose);

// change the supported cipher suites on the socket, *before* it's returned to the client
sslSocket.setEnabledCipherSuites(getMyCipherSuites());

return sslSocket;
}

// other overloaded createSocket() methods do the same

private String[] getMyCipherSuites() {
// TODO: change this to return whatever cipher suites you want the server to use, from CipherSuite
return new String[] {...};
}
}

关于java - 如何为 Java HTTPS *服务器*配置 SSL 密码套件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51273490/

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