すべての接続に対して「暗号化が必要」に設定されている CUPS プリント サーバーと通信しようとしています。つまり、接続を確立しようとすると、接続を TLS 暗号化にアップグレードするように求められ、Cups4jもJspiもそれを処理できないようです。
(これらのライブラリまたは他のライブラリを使用して) Java アプリケーションからそのようなサーバーに接続する方法はありますか?
あなたの主な問題は、RFC 2817 で説明されているように、CUPS/IPP が HTTP から TLS へのアップグレードを使用するまれなプロトコルの 1 つであることです (https://
これはまったく使用されていません。RFC 2818 を参照してください)。このアップグレードでは、既存のライブラリでのサポートがはるかに少なくなります。
原則として、プレーンSocket
をにアップグレードするSSLSocket
ことはそれほど難しくありません。ただし、IPP は HTTP に依存しているため、RFC 2817 をサポートする HTTP ライブラリはほとんどないため、ライブラリが使用するライブラリがこれをサポートしていない可能性があります。
私は Cups4J を見ていませんが、Jspi は明らかに Apache HTTP クライアント(おそらくバージョン 3.x) に依存しています。
RFC 2817 のサポートは、2011 年に Apache HTTP クライアント メーリング リストで議論されましたが、これがライブラリに組み込まれたかどうかは明らかではありません。いずれにせよ、Jspi コードはそれよりも古いため、動作しないと想定するのが妥当です。
考えられる回避策:
一部の IPP サーバーは、アップグレード (RFC 2817) または初期接続 (従来の方法である RFC 2818) を介して TLS の両方をサポートしているようですhttps://
。おそらくあなたもそうです。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 ライブラリによって自動的に処理されます。(証明書も信頼できることを確認する必要があるかもしれませんが、それは別の問題です。)