Связь с Java на сервере печати CUPS с шифрованием TLS
Я пытаюсь установить связь с сервером печати CUPS, в котором для всех подключений установлено "Требуется шифрование". Это означает, что, когда вы пытаетесь установить соединение с ним, он просит обновить соединение до соединения с шифрованием TLS, и ни Cups4j, ни Jspi, похоже, не могут его обработать.
Есть ли способ подключиться к такому серверу из приложения Java (используя эти библиотеки или другие)?
1 ответ
Ваша основная проблема заключается в том, что CUPS/IPP является одним из редких протоколов, использующих обновление HTTP до TLS, как описано в RFC 2817. (https://
не использует это вообще, см. RFC 2818.) Следствием этого является то, что вы найдете гораздо меньше поддержки в существующих библиотеках для этого обновления.
В принципе, модернизация равнины Socket
в SSLSocket
не так уж сложно Однако, поскольку IPP использует HTTP, вполне вероятно, что библиотеки, используемые вашей библиотекой, не поддерживают это, поскольку немногие библиотеки HTTP поддерживают RFC 2817.
Я не смотрел на Cups4J, но Jspi явно полагается на Apache HTTP Client (вероятно, версию 3.x).
Поддержка RFC 2817 обсуждалась в 2011 году в списке рассылки Apache HTTP Client, но неясно, попало ли что-то из этого в библиотеку. В любом случае, код Jspi старше этого, поэтому справедливо предположить, что он не будет работать.
Возможный обходной путь:
Некоторые серверы IPP поддерживают оба протокола TLS через обновление (RFC 2817) или через начальное соединение (RFC 2818, традиционный 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-библиотекой. (Возможно, вам придется убедиться, что ваш сертификат тоже заслуживает доверия, но это другая проблема.)