【问题标题】:How to show protocols and cipher suites available to Jetty HTTPS clients?如何显示 Jetty HTTPS 客户端可用的协议和密码套件?
【发布时间】:2013-09-10 10:07:58
【问题描述】:

我已将 Jetty 嵌入式服务器配置为包含/排除某些协议和密码套件。有没有办法报告那些在工作的服务?我想到了 getSupportedCipherSuites()getSupportedProtocols() 之类的东西 javax.net.ssl.SSLServerSocket 但对于 Jetty 服务器对象。我的代码已经显示了配置中的内容:

HTTPSPDYServerConnector SSLconnector = new HTTPSPDYServerConnector(server, sslContextFactory);
SSLconnector.setPort(PortHTTPS);
...
server.setConnectors(new Connector[] { SSLconnector });
...
showInfo(sslContextFactory.getIncludeCipherSuites());
showInfo(sslContextFactory.getExcludeCipherSuites());
showInfo(sslContextFactory.getIncludeProtocols());
showInfo(sslContextFactory.getExcludeProtocols());
...
server.start();

现在我想看看有哪些协议和密码套件可供客户端使用。

编辑(更多信息):

我的环境可以使用这些协议:

SSLv2Hello
SSLv3
TLSv1
TLSv1.1
TLSv1.2

这是SSLServerSocket.getSupportedProtocols() 报告的http://www.java2s.com/Code/JavaAPI/javax.net.ssl/SSLServerSocketgetSupportedProtocols.htm 的结果

但在 Jetty 环境下,我不知道如何获取此类列表。我通过调用排除了一些协议 sslContextFactory.addExcludeProtocols()(由于 Chrome 错误 ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED in Google Chrome,我禁用了 TLSv1.2

如何获取 Jetty 服务器可用(不排除)的协议列表?

我想对于我的环境,这样的结果将是:

SSLv2Hello
SSLv3
TLSv1
TLSv1.1

(TLSv1.2 已禁用)

【问题讨论】:

  • 你需要知道这还没有显示什么?
  • 如果我不在包含/排除的协议中使用它,它不会向我显示可用的协议,如 TLSv1.2
  • 我不明白以“如果我不使用它...”开头的部分。
  • 我可以使用:sslContextFactory.setExcludeCipherSuites(new String[]{"TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA",...),然后我在日志中看到TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA。但是如果我不排除它,即使它可用并且可以被客户使用,我也不会在日志中看到它。
  • 试试 selectCipherSuites()。

标签: java ssl https cryptography jetty


【解决方案1】:

我刚刚遇到了类似的问题。

Jetty 的工作方式是实例化默认的SSLEngine,然后应用排除项和其他首选项。默认情况下,Jetty 9.4 排除以下协议:

this.addExcludeProtocols("SSL", "SSLv2", "SSLv2Hello", "SSLv3");

密码的管理方式类似,但您可以使用正则表达式。默认情况下,Jetty 9.4 不包括以下内容:

this.setExcludeCipherSuites("^.*_(MD5|SHA|SHA1)$");
        this.addExcludeCipherSuites("^TLS_RSA_.*$");
        this.addExcludeCipherSuites("^SSL_.*$");
        this.addExcludeCipherSuites("^.*_NULL_.*$");
        this.addExcludeCipherSuites("^.*_anon_.*$");

如果您自己调用包含/排除方法,您将不得不处理 Jetty 执行的特定处理顺序,这可能会造成混淆。因此,我建议您首先对空数组使用 setter 方法,以清除默认情况下 Jetty 放置的任何内容,然后然后添加您喜欢的项目。示例:

// empty the collections, we don't need no education
sslContextFactory.setExcludeProtocols(new String[]{});
sslContextFactory.setExcludeCipherSuites(new String[]{});

// tell me what you want, what you really really want
sslContextFactory.setIncludeProtocols("TLSv1","TLSv1.1","TLSv1.2");
sslContextFactory.setIncludeCipherSuites(omgIveNeverSeenSuchABigArrayOfCiphers);

如果您需要特定 Java 客户端支持的密码列表,请使用 -Djavax.net.debug=ssl:handshake:verbose 运行该客户端并查找 ClientHello 消息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2018-07-07
    • 2016-02-06
    • 2015-07-14
    • 2017-08-16
    • 1970-01-01
    相关资源
    最近更新 更多