1

我正在尝试与为其所有连接设置“需要加密”的 CUPS 打印服务器通信。这意味着,当您尝试建立与它的连接时,它会要求将连接升级到 TLS 加密的连接,而Cups4jJspi似乎都无法处理它。

有没有办法从 Java 应用程序连接到这样的服务器(使用这些库或其他库)?

4

1 回答 1

0

您的主要问题是 CUPS/IPP 是使用 HTTP 到 TLS 升级的罕见协议之一,如 RFC 2817 中所述。(https://根本不使用它,请参阅 RFC 2818。)结果是您会发现现有库中对此升级的支持要少得多。

原则上,将 plain 升级Socket为 anSSLSocket 并不太难。但是,由于 IPP 依赖于 HTTP,因此您的库使用的库可能不支持这一点,因为很少有 HTTP 库支持 RFC 2817。

我没有看过 Cups4J,但Jspi 显然依赖于 Apache HTTP Client(可能是 3.x 版)。

2011 年在 Apache HTTP Client mailing list 上讨论了对 RFC 2817 的支持,但尚不清楚这是否已进入库。无论如何,Jspi 代码比这更旧,所以假设它不会工作是公平的。

一种可能的解决方法:

一些 IPP 服务器似乎通过升级(RFC 2817)或通过初始连接(RFC 2818,传统https://方式)同时支持 TLS。也许你的也是。检查它是否为 TLS 连接侦听另一个端口(例如,通过将 HTTPS 客户端指向它)。(如果服务器使用端口统一,这也可能是同一个端口。)

如果这可行,在 Jspi 中的一个快速补丁IppHttpConnection.java应该使您能够使它使用https://连接而不是http://连接:

private static URI toHttpURI(URI uri) {
    if (uri.getScheme().equals("ipp")) {
        String uriString = uri.toString().replaceFirst("ipp", "http");

我不确定是否ipps://是标准的,但您可以使用相同的技巧并在方案中替换ipps://为。https://其余的应该由底层 HTTP 库自动处理。(您可能还必须确保您的证书也是可信的,但这是一个不同的问题。)

于 2014-02-20T22:56:40.230 回答