java - 如何显示 Jetty HTTPS 客户端可用的协议(protocol)和密码套件?

标签 java ssl https cryptography jetty

我已配置 Jetty 嵌入式服务器以包含/排除某些协议(protocol)和密码套件。有没有办法举报那些在职服务的人?我想到了类似于 javax.net.ssl.SSLServerSocket 的 getSupportedCipherSuites() 和 getSupportedProtocols() 之类的东西,但对于 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();

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

编辑(更多信息):

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

SSLv2Hello
SSLv3
TLSv1
TLSv1.1
TLSv1.2

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

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

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

我认为对于我的环境来说,结果将是:

SSLv2Hello
SSLv3
TLSv1
TLSv1.1

(TLSv1.2 已禁用)

最佳答案

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

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

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 消息。

关于java - 如何显示 Jetty HTTPS 客户端可用的协议(protocol)和密码套件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18716048/

相关文章:

java - java中的序列化和同步有什么区别?

java - 返回数组列表如何破坏封装?

java - 我们如何在 HTTPS 中执行我们自己的证书验证步骤

ssl - keystore 中的私钥。握手时使用哪个?

perl - HTTP::Daemon::SSL 自动获取并提供中间证书

java - 使用 PrivateKey、PublicKey 和 Certificate 对象设置 SSLContext

java - 反序列化Json,结构相同但字段名不同

ssl - 主机名与对端提供的证书主题不匹配,但完全匹配

oracle - 如何使用 SSL 和 JDBC 设置 Oracle

curl - 使用 HTTPS 的 CouchDB cookie 身份验证