2014-02-20 60 views
0

我正在嘗試與其所有連接都設置爲「需要加密」的CUPS打印服務器進行通信。這意味着,當您嘗試建立到它的連接時,它會要求將連接升級到TLS加密的連接,並且​​和Jspi似乎都不能處理它。與Java通信到TLS加密的CUPS打印服務器

有什麼辦法從Java應用程序連接到這樣的服務器(使用這些庫或其他)?

回答

0

您的主要問題是CUPS/IPP是使用HTTP到TLS升級的罕見協議之一,如RFC 2817中所述。(https://完全不使用該協議,請參閱RFC 2818)。那就是說你會發現現有的庫對這次升級的支持要少得多。

原則上,將普通的Socket升級爲SSLSocketisn'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客戶端指向它)。 (這也可能是同一端口,如果服務器使用的端口統一。)

如果一切正常,快速更新來IppHttpConnection.java在Jspi應使您能夠使其使用https://連接,而不是http://連接:

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

我不確定ipps://是否爲標準配置,但您可以使用相同的技巧並在方案中將ipps://替換爲https://。剩下的應該由底層的HTTP庫自動處理。 (您可能必須確保您的證書也是可信的,但這是一個不同的問題。)