【问题标题】:Communicate with Java to TLS-encrypted CUPS print server使用 Java 与 TLS 加密的 CUPS 打印服务器通信
【发布时间】:2014-03-22 03:50:33
【问题描述】:

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

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

【问题讨论】:

    标签: java ssl cups ipp-protocol cups4j


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 2022-08-23
      • 1970-01-01
      • 2013-08-20
      相关资源
      最近更新 更多