Самоподписанные сертификаты - помогают пользователям узнать, что им нужно добавить корневой ЦС в доверенное хранилище сертификатов. - PullRequest
4 голосов
/ 18 мая 2009

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

Есть ли что-то, что я могу разместить на веб-странице, которая обнаружит, что они не добавили корневой ЦС в свой список доверенных, и отобразит ссылку или DIV или что-то, указывающее им, как это сделать?

Я думаю, что, может быть, DIV, в котором есть инструкции по установке CA, и Javascript, который запускает какой-то тест (пытается получить доступ к чему-то без внутренних предупреждений ??) и скрывает DIV, если тест проходит успешно. Или что-то в этом роде ...

Есть идеи от блестящего SO сообщества? :)

Ответы [ 9 ]

10 голосов
/ 22 мая 2009

Почему вы хотите это сделать? Это плохая идея обучать пользователей без разбора устанавливать сертификаты корневого ЦС только потому, что веб-сайт говорит им об этом. Вы подрываете всю цепочку доверия. Пользователь, который заботится о безопасности, проигнорирует ваш совет по установке сертификата и может прийти к выводу, что вы не относитесь серьезно к безопасности, поскольку не удосужились приобрести сертификат в существующем ЦС.

Вам действительно нужен HTTPS? Если это так, вам, вероятно, следует прикусить маркер и заключить сделку с центром сертификации, чтобы облегчить предоставление вашим клиентам надлежащих сертификатов сервера, подписанных центром сертификации. Если веб-сервер используется только для локальных подключений из настольного приложения, вы должны либо добавить самозаверяющий сертификат в список доверенных как часть процесса установки, либо вместо этого переключиться на HTTP.

2 голосов
/ 23 мая 2009

Ты не должен этого делать. Корневые сертификаты - это не то, что вы просто устанавливаете, поскольку добавление одного может поставить под угрозу любую защиту, предоставленную вам https.

Однако, если вы создаете настольное приложение, просто слушайте только 127.0.0.1. Таким образом, трафик никогда не покидает компьютер пользователя, и злоумышленник не может прослушивать его.

2 голосов
/ 20 мая 2009

Единственная идея, которую я имею, - это использовать фреймы и немного JavaScript.

Первый элемент фрейма будет действовать как сторожевой таймер, ожидающий x раз (javascript setTimeout), прежде чем показывать пользовательское сообщение об ошибке ssl пользователю с гиперссылками или инструкциями для загрузки самоподписанного сертификата.

Второй элемент frame пытается установить соединение https и в случае успеха сбрасывает сторожевой кадр, чтобы он никогда не срабатывал. Если произойдет сбой (предположим, что проверка сертификата https завершилась неудачно), сторожевое сообщение сработает и будет представлено пользователю.

В зависимости от вашего браузера вы, скорее всего, по-прежнему увидите предупреждение о безопасности с помощью этого подхода, но вы, по крайней мере, сможете продвигать свой собственный контент, не требуя от пользователей запуска ненадежного кода без надлежащей цепочки доверия (это было бы намного хуже из POV безопасности, чем принять ошибки проверки сертификата и установить ненадежный сеанс ssl)

Улучшения концепции могут быть возможны при использовании других методов тестирования, таких как XMLHttpRequest и др.

2 голосов
/ 18 мая 2009

Предполагая, что вы знаете C # и хотите установить pfx-файл. Создайте exe-файл, который будет запускаться из URL. Следуйте по этому URL-адресу

0 голосов
/ 16 марта 2016

Элемент управления ActiveX может сделать свое дело. Но я действительно не вмешивался, чтобы помочь с решением, больше чтобы не согласиться с позицией, что то, что вы делаете, представляет собой угрозу безопасности.

Для ясности, вам нужен защищенный шифр (надеюсь, AES, а не DES), и вы уже управляете своими конечными точками, просто не в состоянии полностью исключить перехватчики сетевых данных случайного режима, которые могут перехватывать пароли в виде открытого текста или другие конфиденциальные данные.

SSL - это «Уровень защищенных сокетов», и по определению он НЕ зависит от ЛЮБЫХ сертификатов.

Однако все эффективные современные шифры требуют, чтобы он аутентифицировал конечные точки туннеля, что не всегда является необходимостью для каждого приложения; разочарование, с которым я сталкивался в многочисленных внутренних процедурах автоматизации центров обработки данных, использующих API веб-служб для управления узлами, где «пользователи» были фактически процессами, которым требовался обмен зашифрованным ключом до согласования команд RESTful.

В моем случае VLAN были защищены через ACL, поэтому я действительно "мог" отправлять заголовки с открытым текстом для аутентификации. Но только печатание заставило меня немного рвать в рот.

Я уверен, что я буду обижен за то, что напечатал это, но я чрезвычайно закален в боях и сделал бы те же самые комментарии к вам через 10-15 лет моей ИТ-карьеры. Поэтому я сочувствую их заботам и очень ценю, если они достаточно увлечены безопасностью, чтобы зажечь меня. Со временем они это поймут .....

Но я согласен с тем, что ПЛОХАЯ идея «обучать» пользователей устанавливать корневые ЦС самостоятельно. С другой стороны, если вы используете самозаверяющий сертификат, вы должны обучить его его установке. И если пользователь не знает, как определить, является ли сертификат CA заслуживающим доверия, он определенно не сможет определить самоподписанный сертификат из сертификата CA, и поэтому любой из этих процессов будет иметь тот же эффект.

Если бы это был я, я бы автоматизировал этот процесс вместо того, чтобы помогать конечным пользователям, чтобы он стал настолько скрытым от них, насколько это возможно, точно так же, как правильная PKI сделала бы для предприятия.

Говоря об этом, я просто подумал о возможном решении. Используйте модель Microsoft PKI. С помощью Server 2012 R2 вы можете доставлять доверенные ключи конечным точкам, которые даже не являются членами домена, используя «управление устройством» через «рабочие пространства», и клиентские машины могут подписываться на несколько рабочих областей, поэтому они не передаются исключительно вашим, если они подписываются. Как только они это сделают и аутентифицируются, роль службы сертификации AD будет выдвигать все необходимые сертификаты корневого CA, которые присутствуют в активном каталоге или на указанном сервере LDAP. (Если вы используете автономные серверы CA)

Кроме того, я понимаю, что этой теме уже 7 лет, но я уверен, что на нее все еще ссылается большое количество людей, нуждающихся в аналогичных решениях, и они чувствуют себя обязанными разделить противоположное мнение. (Хорошо, Microsoft, где мой отклик на плагин, который я тебе дал?)

-cashman

0 голосов
/ 22 июля 2010

Мы работали над проектом JavaScript с открытым исходным кодом под названием Forge, который связан с этой проблемой. У вас есть веб-сайт, к которому ваши пользователи могут получить доступ? Если это так, то вы можете обеспечить безопасное подключение к этим настольным приложениям через свой веб-сайт, используя комбинацию Flash для междоменного + JavaScript для TLS. Вам потребуется внедрить некоторые веб-сервисы на своем веб-сайте для обработки подписывающих сертификатов сертификатами приложений для настольных компьютеров (или чтобы ваши приложения для настольных компьютеров загружали самозаверяющие сертификаты, чтобы к ним можно было получить доступ через JavaScript). Мы опишем, как это работает здесь:

http://blog.digitalbazaar.com/2010/07/20/javascript-tls-1/

Альтернативой настройке веб-сайта, но менее защищенной, поскольку она допускает атаку MiTM, является размещение JavaScript + Flash непосредственно на сервере приложений для настольных компьютеров. Ваши пользователи могут использовать приложение для настольных ПК по обычному протоколу http, чтобы загрузить сертификат JS + Flash + SSL, но затем начать использовать TLS через JS. Если вы подключены к локальному хосту, атака MiTM может быть немного менее тревожной - возможно, вам будет достаточно рассмотреть этот вариант.

0 голосов
/ 25 мая 2009

Напомним: вы настраиваете веб-серверы в настольных приложениях; каждый рабочий стол будет иметь свой собственный веб-сервер, но вы хотите использовать SSL для защиты соединения с этим веб-сервером.

Я полагаю, что здесь есть несколько проблем с сертификатами, одна из которых заключается в том, что имя хоста, используемое для доступа к рабочему столу, должно соответствовать сертификату. В этом случае у вас мало выбора, кроме как генерировать сертификаты на клиенте. Вам нужно разрешить пользователю каким-либо образом указывать имя хоста, если имя, используемое посторонними, не может быть обнаружено на самом хосте.

Я бы также предложил разрешить администратору устанавливать доверенный сертификат для тех, кто не хочет полагаться на самозаверяющие сертификаты. Таким образом, вы также можете переложить стоимость обслуживания доверенного сертификата на администраторов, которые действительно этого хотят.

Наконец, по моему опыту, браузеры либо разрешают, либо отказывают в самоподписанном сертификате, и у сервера нет возможности узнать, отклонен ли сертификат, временно принят или окончательно принят. Я предполагаю, что где-то должен быть механизм для обработки сбоев SSL, но типичное веб-программирование не работает на этом уровне. В любом случае, единственное, что может сделать веб-сервер в случае сбоя SSL, - это переключиться на не-SSL, и вы указали в комментарии, что у вас не может быть ничего не-SSL. Я думаю, вы должны попытаться снять это ограничение; стартовая страница без SSL была бы чрезвычайно полезна в этой ситуации: она может тестировать (используя фреймы или изображения или JSON или AJAX) соединение https и может ссылаться на документацию о том, как настроить сертификат или где скачать установщик для сертификата.

Если браузер не подключится из-за самозаверяющего сертификата, и вам вообще не разрешено использовать обычный HTTP, какими еще средствами вы могли бы общаться с пользователем? Других каналов нет, и вы не можете установить их, потому что у вас нет связи.

Вы упомянули в комментарии написание приложения win32 для установки сертификата. Вы можете установить сертификат во время установки самого приложения, но это не помогает никаким удаленным браузерам, а локальному браузеру не требуется SSL для доступа к localhost.

0 голосов
/ 24 мая 2009

Поскольку сервер работает на клиентском компьютере (настольный продукт), не может ли он проверить поддерживаемые браузеры на наличие установленных сертификатов с использованием функций winapi / os? Я знаю, что Firefox имеет базу данных сертификатов в каталоге профиля пользователя, и IE, вероятно, хранит информацию в реестре. Это не будет надежно для всех браузеров, но если сервер просто выбирает между «Сертификат найден» и «Пожалуйста, убедитесь, что вы установили сертификат, прежде чем продолжить», тогда никакого вреда не будет, поскольку пользователь может выбрать продолжить в любом случае.

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

0 голосов
/ 22 мая 2009

Вы можете попытаться добавить какой-либо (скрытый) элемент Flex или Java-апплет один раз за сеанс пользователя. Он просто загрузит любую страницу https вашего сервера и получит всю информацию о подключении:

com.sun.deploy.security.CertificateHostnameVerifier.verify()
or
javax.security.cert.X509Certificate.checkValidity()

Я полагаю, что у Flex (который более распространен среди пользователей) аналогичные способы проверки сертификата https с точки зрения пользователя Он также должен иметь общий сертификат ОС. хранить в то время как Java может иметь свой собственный.

...