注意:对于 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/