我正在尝试与为其所有连接设置“需要加密”的 CUPS 打印服务器通信。这意味着,当您尝试建立与它的连接时,它会要求将连接升级到 TLS 加密的连接,而Cups4j和Jspi似乎都无法处理它。
有没有办法从 Java 应用程序连接到这样的服务器(使用这些库或其他库)?
您的主要问题是 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 库自动处理。(您可能还必须确保您的证书也是可信的,但这是一个不同的问题。)