Добрый день, коллеги.
Я снова и снова возвращаюсь к вопросам использования HTTPS протокола в веб сервисах. Документации почти нет, примеров в стандартных конфигурациях тоже, спецов кто сталкивался с подобным среди моих знакомых нет.
Я создаю сервис для пользователей, сервис использует протокол https и собственно куплен официальный сертификат. Для пользователей я выпускаю обработку, которая должна использовать протокол https и собственно понимать сертификат.
Везде пишут что мол с сертификатом нужно проделать танцы с бубном, сохранить его в определенном формате и добавить в CACERT.PEM
Но хочу заметить что у сервиса не "кустарный" сертификат, а подписан удостоверяющим центром. Неужели в 1с все так плохо, что на клиентской стороне необходимо иметь доступ к файловой системе? И как быть через год, когда сертификат обновится? перепрописывать у сотен клиентов файлики?
Вообщем задача следующая. Как обеспечить работу с https без добавления сертификата в CACERT.PEM? Как не привязываться к данному конкретному сертификату. ведь через год сертификат поменяется? или как автоматически прописать сертификат у пользователя?
По http работало так.
Пользователь="------@mail.ru";
Пароль="********";
Прокси=Неопределено;
Попытка
Определения = Новый WSОпределения("http://www.ean13.org/ws/trade.wsdl",Пользователь,Пароль,,SSL);
Прокси = Новый WSПрокси(Определения, "http://www.ean13.org/trade/","ServiceEAN13_Trade", "Trade");
Прокси.Пользователь=Пользователь;
Прокси.Пароль=Пароль;
Исключение
Сообщить(ОписаниеОшибки());
Сообщить("Не удалось подключится к сервису http://www.ean13.org/ws/trade.wsdl. Обратитесь к системному администратору");
КонецПопытки;
Возврат Прокси;
Показать
После включения сертификата пытаюсь
Пользователь="------@mail.ru";
Пароль="********";
Прокси=Неопределено;
Попытка
SSL = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(СпособВыбораСертификатаWindows.Авто),Новый СертификатыУдостоверяющихЦентровWindows());
Определения = Новый WSОпределения("https://www.ean13.org/ws/trade.wsdl",Пользователь,Пароль,,SSL);
Прокси = Новый WSПрокси(Определения, "http://www.ean13.org/trade/","ServiceEAN13_Trade", "Trade");
//Прокси = Новый WSПрокси(Определения, "https://www.ean13.org/trade/","ServiceEAN13_Trade", "Trade");
Прокси.Пользователь=Пользователь;
Прокси.Пароль=Пароль;
Исключение
Сообщить(ОписаниеОшибки());
//Сообщить("Не удалось подключится к сервису https://www.ean13.org/ws/trade.wsdl. Обратитесь к системному администратору");
Сообщить("Не удалось подключится к сервису http://www.ean13.org/ws/trade.wsdl. Обратитесь к системному администратору");
КонецПопытки;
Возврат Прокси;
Показать
На строке
Определения = Новый WSОпределения("https://www.ean13.org/ws/trade.wsdl",Пользователь,Пароль,,SSL);
Валится с ошибкой
Ошибка при вызове конструктора (WSОпределения): При создании описания сервиса произошла ошибка. URL сервиса: https://www.ean13.org/ws/trade.wsdl: Ошибка работы с Интернет: Удаленный узел не прошел проверку
Не понял о чем тут речь. Сервис развивается, все изменения отражаются в WSDL. В данном случае у клиента всегда новый сервис.
Ты ведь видел размер wsdl? Вот он большой, и должен отобразиться в типы (описание). Не, мне вообще нравятся твои речи. Надеюсь так мыслит большинство, потому что начинаю чувствовать к этому вкус.
(24) ture, Ну что считать большим? Несколько кб это разве большой? Установка соединения и разбор WSDL происходит довольно быстро. Особенно учитывать то, что WSDL создавался руками в блокноте специально для 1с. Там вообще нет ничего лишнего.
Как вариант поднять свой сервер сертификации (поэксперементировать с самоподписанным) или распростронять его через групповые политики домена.
Управление групповой политикой > Объекты групповой политики > создать - создаем контейнер
Конфигурация компьютера - Конфигурация Windows - Параметры безопасности - Политики открытого ключа - Доверенные корневые центры сертификации. В правой части окна в меню правой кнопкой мыши выбираем Импорт и импортируем сертификат.
Политика создана, теперь самое время проверить правильность ее применения. В оснастке Управление групповой политикой выберем Моделирование групповой политики и запустим по правому щелчку Мастер моделирования.
Выполнив моделирование можем убедиться, что политика успешно применяется к указанному компьютеру, в противном случае раскрываем пункт Отклоненные объекты и смотрим причину по которой политика оказалась неприменима к данному пользователю или компьютеру.
После чего проверим работу политики на клиентском ПК, для этого обновим политики вручную командой:
Да то же интересует вопрос безопасности сервисов. И есть ли какие то способы обезопасить соединения без сертификатов?
Думаю поднять VPN у меня все клиенты это собственные магазины. Проблема только в том что их очень много.
Но вот можно ли как то защитить сервис без подключения к клиентским ПК и без vpn ?
Может сертификаты использовать... но погуглив понял что с ними проблем не меньше чем с vpn будет.
(3) TODD22, Если использовать сертификаты то это веб-морда.
Если VPN то тут уже несколько решений, самое простое это терминальный сервер, люди подключаются и работаю.
Либо можно вообще не заморачиваться пробросить порт удаленного рабочего стола RDP (причем вешаем его на нестандартный порт, ради той же безопасности), придумываем сложнее пароль (это очень важно) и пользуемся, в России 70% так пользуются.
Если VPN то тут уже несколько решений, самое простое это терминальный сервер, люди подключаются и работаю.
Мне не надо что бы "подключались и работали". У меня для этого web сервис есть. По которому магазины периодически обмениваются информацией с центральной базой.
Тогда как бюджетный вариант можно быстро поднять OpenVPN, все опять же зависит от того какое оборудование у вас торчит наружу. Если стоит железка Cisco, Kerio или Microtik VPN вы быстро поднимите и очень достойного качества.
Мои клиенты это люди скачавшие обработку с моего сайта или инфостарта. Я не знаю что у них за система, я не знаю режим работы(фалйловый или серверный), я не знаю в домене они или нет. То есть у меня нет возможности физически ставить у них сертификаты. Нет возможности(вернее желания) консультировать бухгалтера как установить сертификат, а если есть возможность установить сертификат из обработки прописав ее у клиента, то я не понимаю сути безопасности.
Я хочу построить удобный, функциональный, правильный сервис. Ручное прописывание сертификата я считаю неправильным вариантом.
Сейчас 1с работает с сертификатами прописаными в их файле. Там я так понимаю присутствуют только глобальные центры сертификации. Если мой сертификат подписан одним из центров, которые в свою очередь подписаны тем кому 1с доверяет, то как заставить 1с доверять и этому сертификату.
Можно ли это прописать кодом обработки. Что мол есть соединение. Он защищено, есть сертификат(какой то). Ты его возьми, проверь его подлинность и продолжи с ним работать.
И я не знаток безопасности, и возможно пишу какой то бред. тога скажите как это вообще должно работать?
Я просто не догоняю логики сертификации. Вот давайте рассмотрим пример на уровне браузера.
//я не эксперт в области сертификации, извините за терминалогию
1) Есть глобальный сертификационный центр, которому изначально доверяют все браузеры.
2) Глобальный центр выпускает сертификат 1-го уровня, и он заверяется ГЦ
3) Центр подписанный сертификатом 1-го уровня выпускает сертификат 2-го уровня, и заверяется подписью первого.
4) Сертификат 2 уровня устанавливается на сайт.
Получается ГЦ->1уровень->2уровень
И так. Сайт на котором установлен сертификат 2го уровня открывается в браузере с заголовком https. Что происходит далее? Я так понимаю браузер смотрит на сертификат и
Браузер говорит: "я тебя не знаю, кто ты"?
Сайт отвечает: "я сертификат 2уровня, мой папа сертификат 1-го уровня"
Браузер смотрит на папу и говорит:"А ты кто такой?"
Сертификат 1 уровня отвечает: "Я сертификат 1 уровня, мой папа сертификат ГЦ".
Браузер такой: "Так с этого и надо было начинать, твоего деда то я знаю. Все заходи дорогой".
Либо, в случае если сертификат самопальный.
Браузер: "Вообщем сайт, я не знаю кто ты, не знаю твоих родителей и дальних родствеников. Я с тобой знакомится не хочу!!!"
Браузер задает вопрос пользователю: "Тут это, непонятный какой то товарищ. Я его пробил, он какой то мутный тип. Че мне с ним делать? Запретить или добавить в знакомые."
Пользователь жмет кнопку "Добавить сертификат в друзья".
Я надеюсь я правильно понимаю суть происходящего?
Теперь то же самое применимо к 1с, причем для любого типа сертификатов.
1с: "Удаленный узел не прошел проверку "
Пользователь: "Что это значит?"
1с: "Удаленный узел не прошел проверку "
Пользователь: "Ну как сделать чтоб ты прошел эту проверку? Куда нажать чтоб ты стал ему доверять?"
1с: "Оформите подписку на ИТС, зайдите на сайт, прочитайте документ, зайдите на сайт сервиса, сохраните сертификат в таком то формате, расчитайте хеш, зайдите к админам, попросите права доступа на изменения файла CACERT.PEM, объясните зачем вам это нужно, напишите служебку на имя ген директора...."
Пользователь "Да на@#й такой сервис, я без него переживу...".
Я пытаюсь сделать сервис для обычных людей, чтоб они не обладали какими то познаниями в сертификатах и их установках, не у всех есть админы. Пользователь в худшем случае должен нажать кнопку установить сертификат... Но учитывая что "дедушку" сертификата знает 1с, и дедушка прописан уже в файле CACERT.PEM то мне не особо понятны вот эти танцы с бубном.
(15) maguga, Это достаточно обобщенное описание решения задачи безопасности.
Зачем вам нужно именно SSL для вашей задачи не совсем понимаю.
В любом случае по мне так проще поднять джава веб-сервер, а из 1С послать нужные REST-запросы
(13) ToTMoM, У меня обработка стучится к сервису и передает данные. Ничего секретного в данных нет, они по сути общедоступны, но при конекте пользователь указывает логин и пароль. Https нужен для того, чтоб не перехватили как раз логин и пароль при авторизации. Очень не хочется чтоб от имени одной компании, некорректную информацию в систему кидал злоумышленник
Сертификат клиента у Вас работать не будет - его просто нет на клиенте, Вы же купили только сертификат сервера. Не указывайте его в конструкторе.
Выпиливание cacert.pem из платформы продолжается уже достаточно давно и "по частям", работайте с актуальными версиями платформы - там должно работать нормально.
Пользователь="------@mail.ru";
Пароль="********";
Прокси=Неопределено;
Попытка
SSL = Новый ЗащищенноеСоединениеOpenSSL();
Определения = Новый WSОпределения("https://www.ean13.org/ws/trade.wsdl",Пользователь,Пароль,,SSL);
Прокси = Новый WSПрокси(Определения, "http://www.ean13.org/trade/","ServiceEAN13_Trade", "Trade");
//Прокси = Новый WSПрокси(Определения, "https://www.ean13.org/trade/","ServiceEAN13_Trade", "Trade");
Прокси.Пользователь=Пользователь;
Прокси.Пароль=Пароль;
Исключение
Сообщить(ОписаниеОшибки());
//Сообщить("Не удалось подключится к сервису https://www.ean13.org/ws/trade.wsdl. Обратитесь к системному администратору");
Сообщить("Не удалось подключится к сервису http://www.ean13.org/ws/trade.wsdl. Обратитесь к системному администратору");
КонецПопытки;
Возврат Прокси;
(23) спасибо, хоть понял, как динамически создавать соединения:
СертификатКлиента = Новый СертификатКлиентаФайл("my.pem");
СертификатыУдостоверяющихЦентров = Новый СертификатыУдостоверяющихЦентровWindows();
//SSL = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента, СертификатыУдостоверяющихЦентров);
SSL = Новый ЗащищенноеСоединениеOpenSSL(СертификатКлиента);
Определения = Новый WSОпределения("https://mysite.ru/soap/scard.wsdl",,,,SSL);
//Создаем прокси для обращения к внешнему веб-сервису,
// передаем в функцию URI пространства имен, имя сервиса, имя порта.
Прокси = Новый WSПрокси(Определения, "urn:Scard", "ScardSchoolService", "ScardSchoolPort");
//Вызываем метод веб-сервиса, записываем результат в переменную КурсыВалют.
Школы = Прокси.getSchool(0);
Показать
Правда последняя строка не работает, не проходит проверку удаленный сайт, но уже шаг вперед