我正在尝试与为其所有连接设置了“需要加密”的CUPS打印服务器进行通信。这意味着,当您尝试与其建立连接时,它会要求将连接升级为TLS加密的连接,Cups4j和Jspi似乎都无法处理它。
有没有办法从Java应用程序(使用这些库或其他库)连接到这样的服务器?
答案 0 :(得分:0)
您的主要问题是CUPS / IPP是使用HTTP到TLS升级的罕见协议之一,如RFC 2817中所述。(https://
根本不使用它,请参阅RFC 2818.)这样做的结果是,您在现有库中找到的升级支持要少得多。
原则上,将普通Socket
升级为SSLSocket
isn't too difficult。但是,由于IPP依赖于HTTP,因此很可能您的库使用的库不支持此功能,因为很少有HTTP库支持RFC 2817。
我没有看过Cups4J,但Jspi clearly relies on Apache HTTP Client(可能是版本3.x)。
Support for RFC 2817 was discussed in 2011 on Apache HTTP Client mailing list,但目前尚不清楚这是否已进入图书馆。无论如何,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库自动处理。 (您可能必须确保您的证书也是可信的,但这是一个不同的问题。)