【问题标题】:How to configure SSL cipher suites for a Java HTTPS *server*?如何为 Java HTTPS *server* 配置 SSL 密码套件?
【发布时间】:2018-12-18 18:53:27
【问题描述】:

注意:对于 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 版本就像调用 e.g. SSLContext.getInstance("TLSv1.2"),但没有类似的简单方法来配置密码套件。

【问题讨论】:

    标签: java ssl okhttp


    【解决方案1】:

    没有类似简单的方法来配置服务器接受的密码套件。

    呃,是的。 SSLServerSocket.setEnabledCipherSuites()。为什么你不认为这“容易”是个谜。

    【讨论】:

    • 这只是为单个套接字更改它,而不是整个服务器。您将如何在 OkHttp 的 MockWebServer(或地狱,甚至是 WireMock 服务器)之类的东西中配置密码套件?
    • 要打开 OkHttp 的功能请求吗?似乎是我们应该做的事情。
    • @JesseWilson 是这里已经发生了什么吗? github.com/square/okhttp/tree/master/okhttp-tls
    【解决方案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[] {...};
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-17
      • 2016-05-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 2016-06-06
      • 1970-01-01
      • 2015-09-25
      相关资源
      最近更新 更多