与Java通信到TLS加密的CUPS打印服务器

时间:2014-02-20 22:08:09

标签: java ssl printing cups cups4j

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

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

1 个答案:

答案 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库自动处理。 (您可能必须确保您的证书也是可信的,但这是一个不同的问题。)