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

标签 java ssl okhttp

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

相关文章:

php - 关于 Apache2 上的 SSL 设置

ssl - AWS CloudFront SSL 证书 - MalformedCertificate 错误

android - Kotlin和Retrofit:如何处理HTTP 400响应?

用于桌面应用程序开发的 Java 框架

java - 通过使用自己的 keystore 而不是将证书添加到 Java JVM 的默认 cacerts 来解决 SSLHandshakeExceptioncertificate_unknown

ssl - 从现有 SSL 证书创建 CSR 是否存在技术限制?

android - 带有证书固定的 OkHttp

android - 具有多个异步 API 调用的 Okhttp 身份验证器

java - Redis key 过期通知

java - 如何通过 Google 电子表格 API (gdata) 从 Google 电子表格中仅获取重新计算的单元格