Связь с 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-библиотекой. (Возможно, вам придется убедиться, что ваш сертификат тоже заслуживает доверия, но это другая проблема.)

Другие вопросы по тегам