java https: // localhost (SSL) – возможно без установки сертификатов на клиенте?

После прочтения следующего, я все еще придерживаюсь создания минимального https : // localhost автономного установочного веб-сервера java-приложения. Он должен быть без библиотеки, использовать Java 8 и принимать соединения из браузера без предварительной установки каких-либо специальных сертификатов клиентов. Я не понимаю, возможно ли это с самоподписанными сертификатами, потому что он должен работать только для «localhost».

  • Как заставить SSL-сервер поддерживать HTTP и https в java?
  • Мой простой Java-сервер HTTPS работает только для локального хоста
  • Простой Java HTTPS-сервер

До сих пор я генерировал некоторые ключевые файлы, используя

openssl genrsa -aes128 -out privkey.pem 2048 # makes privkey.pem openssl req -new -x509 -key privkey.pem # makes cert.crt 

и я объединил минимальную минимальную функцию настройки Kotlin

 private fun ssl():SSLServerSocketFactory { val password = "MYPASSWORD".toCharArray() val kmf = KeyManagerFactory.getInstance("SunX509") val tmf = TrustManagerFactory.getInstance("SunX509") val sslContext = SSLContext.getInstance("TLS") // initialise the keystore KeyStore.getInstance("JKS").let { ks-> FileInputStream("lig.keystore").use { ks.load(it, password) } kmf.init(ks, password) tmf.init(ks) } // setup the HTTPS context and parameters sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null) return sslContext.serverSocketFactory } ssl().createServerSocket().use { serverSocket -> serverSocket.reuseAddress = true serverSocket.bind(InetSocketAddress(port)) logger.info { "WebServer ready and listening on ${serverSocket.localPort}" } 

Но у меня возникли проблемы с его завершением: нужно ли сделать файл lig.keystore ? Можно ли это сделать даже без установки сертификатов в браузере клиента?

    Существует два распространенных подхода к получению безопасного соединения между клиентом (браузером) и сервером через HTTPS:

    1. Вы можете получить сертификат SSL для сервера, подписанного корневым центром сертификации (CA), которому по умолчанию доверяет веб-браузер пользователя.

    2. Вы можете создать самоподписанный SSL-сертификат и импортировать его в свой веб-браузер в качестве доверенного сертификата.

    То, что вы сделали до сих пор, похоже, состоит в создании серверного хранилища на стороне сервера с самозаверяющим сертификатом в нем и (более или менее) настроил сервер Kotlin для его использования. Проблема заключается в клиенте (браузере). Не существует безопасного способа заставить браузер доверять самозаверяющему сертификату без участия пользователя. (Безопасно … как безопасно для пользователя!)

    И никакой законный CA никогда не должен выдавать SSL-сертификат для «localhost»; например https://www.ssl2buy.com/wiki/how-to-get-ssl-certificate-for-web-applications-that-runs-on-localhost

    Тупик.

    Хорошо, так что давайте отступим. Цель использования протокола HTTPS / SSL – обеспечить:

    1. Веб-браузер пользователя разговаривает с правильным сервером, а не с каким-то другим сервером, который олицетворяет его.

    2. Соединение между браузером и сервером зашифровывается, так что третье лицо не может отслеживать трафик.

    Но вы пытаетесь сделать это для подключения localhost . IP-адрес localhost – это обратный адрес. Если ядро ​​ОС не скомпрометировано, вам гарантировано, что сетевые пакеты, отправленные через loopback-соединение, не покинут хост.

    1. Вы можете отклонить проблему «олицетворения». Предполагая, что машина пользователя не была скомпрометирована, никто не может запускать «поддельный» сервер на машине пользователя.

    2. Вы можете отклонить проблему «snooping». Предполагая, что машина пользователя не была скомпрометирована:

      • Пакеты не будут отключены, поэтому их нельзя будет отслеживать в любых «внешних» сетях.
      • Единственный человек, который может «отследить» пакеты в сети loopback, сам пользователь.

    Итак, решение прост. Используйте «http» для вашего «localhost» соединения. Он должен быть защищен … при условии, что машина пользователя не была скомпрометирована.

    Примечание: если компьютер пользователя был взломан , тогда у плохих парней есть другие способы перехвата трафика, который SSL не будет защищать.

    Intereting Posts
    Не удается получить доступ к внешнему классу из анонимного класса Использование JPA + H2 с Spring Boot + Kotlin – Загрузка с ошибкой Почему экземпляр $ MockitoMock $ не идентифицируется как макет? Как запустить другой файл .kt / Class в той же папке src? Kotlin – Operator '==' не может применяться к «Редактируемому!». и 'String' при сравнении строки Учреждения в Котлине ArrayBroadcastChannel: второй абонент не обновляет пользовательский интерфейс Как обрабатывать обработку ошибок в одном месте в rxjava с помощью обертки (Java + Kotlin) Autowiring: ожидается не менее 1 бит, который квалифицируется как кандидат на автоподключение для этой зависимости @Rule> должен быть public ValidationError в тесте Kotlin Junit RxJava Subject: Слушайте другой тип, который тот, который он испускает Библиотека Kotlin 'rxkotlin-0.21.0.jar' имеет неподдерживаемый формат. Обновите библиотеку или плагин kotlin alias собственность делегирование исключает исключение Проблема генериков Котлина Зачем нужен репозиторий и сервис + контракт