Трабла с подписанием SSL сертификата

  1. 6 г. назад

    Подписываю персональный сертификат по реквесту
    openssl ca -config openssl.cnf -out certs/blablabla.crt -infiles request/blablabla.csr
    Все шло как обычно, ничто не предвещало бяду и тут:
    The stateOrProvinceName field needed to be the same in the CA certificate (Russian Federation) and the request (Russian Federation)

    Я до буковок проверил эти Russian Federation. Хули ему надо?

  2. openssl.cnf -> string_mask -> utf8only

    Ответы: (5)
  3. ну, и уж совсем сердито если - изменить политики
    [ policy_match ]
    stateOrProvinceName

    Ответы: (5)
  4. почему нужен именно самоподписанный?

    Ответы: (4) (8)
  5. (3) девелоперско-тестовый сервер. Сами подписываем себе. А настоящие админы выполняют такие заявки по запросу три дня с приложенным обоснованием зачем и почему

    Ответы: (8)
  6. (1) уже стоит
    (2) да, но разобраться бы

    Ответы: (6)
  7. Сид Вишес уже стоит

    а изначально что стояло?

    Ответы: (9)
  8. Признаюсь честно, это мой первый сертификат, что я сам делаю и подписываю

  9. Сид Вишес (3) девелоперско-тестовый сервер. Сами подписываем себе. А настоящие админы выполняют такие заявки по запросу три дня с приложенным обоснованием зачем и почему

    LetsEncrypt не хочешь заюзать? ставится за 5 минут, самообновляется по крону

  10. (6) оно и стояло
    string_mask = utf8only
    попробую default

    Ответы: (10)
  11. Сид Вишес оно и стояло

    попробуй nombstr тогда ещё

    Ответы: (11)
  12. (10) default и nombstr выдают ту же
    The stateOrProvinceName field needed to be the same in the CA certificate (Russian Federation) and the request (Russian Federation)

    Ответы: (14)
  13. А как подсмотреть какой стринг маск в запросе и какой в CA?

  14. ну, в запросе идёт та, что указана в конфиге

  15. Сид Вишес default и nombstr выдают ту же

    попробуй ещё PrintableString

  16. кстати, можно и в запросе указывать:
    [ req ]
    string_mask = utf8only

    Ответы: (16)
  17. 08.08.2017 12:35:24 отредактировано Сид Вишес

    (15) запрос сформирован мастером IIS по созданию запроса на сертификат, я хз где у него в IIS utf8only указать

    Ответы: (19)
  18. ещё, кстати, некоторые рекомендуют в запросе так прописывать:
    stateOrProvinceName :PRINTABLE:'Russian Federation'

    ну, и string_mask = PrintableString

    Ответы: (18)
  19. (17) сейчас попробую

  20. (16) я в IIS вообще плаваю, но запрос - это, по сути, обычный текстовый файл

    Ответы: (20)
  21. (19) понял, попробую поискать где у IIS подкрутить чтоб запросы делал в utf8

  22. Стало интересно, погрузился в дебри исходного лиуксового кода
    Вот сам модуль http://docs.huihoo.com/doxygen/openssl/1.0.1c/ca_8c_source.html
    в строке 1887 выполняется сравнение строк, после чего в строке 1892 выводится ошибка.
    Сравнение проходит по
    длине (одинаковая наверно)
    data (очевидно одинаковая)
    type - вот тут наверно несходимость вышла

  23. пиши патч, делай пулл реквест

  24. Сертификаты - самая гадкая для меня тема.

  25. слава хаосу, есть базис. Пущай с сертификатами [...] он

  26. Я вот что то в концептуальных непонятках, проясните. С одним одиноким серваком все круто получается.

    А вот есть у меня сервер кластерный. Состоит из балансера и двух IIS нод за ним. Балансер имеет dns имя google.ru. Соответственно любой запрос к google.ru он перенаправляет по своим алгоритмам либо к первой либо ко второй ноде.

    Теперь ноды. Они независимые серваки IIS со своими хранилищами сертификатов и своими ключами созданными нутрами IIS.

    Что я хочу?
    Я хочу положить подписанный сертификат в обе ноды, в их хранилища. И по моей задумке, любой кто пойдет на https://google.ru получит прекрасный подписанный сертификат и красота.

    Что вышло.
    Я на первой ноде создал запрос на сертификат на домен google.ru. Подписал его. Положил на первую ноду. Красота. Кладу на вторую ноду IIS мне выдает: ключ сертификата не совпадает с ключом в хранилище. Ну логично, хранилища ключей то разные.

    Ладно. Создаю на второй ноде свой запрос на сертификат на домен google.ru. Несу его подписывать. Openssl ругается, что ошибка базы данных, сертификат для google.ru уже есть.

    Как концептуально правильно выстроить это дело? Сделать нодам единое хранилище ключей?

  27. Надеюсь, я не сломал мозг одинэсникам?

  28. ступай на linux.org.ru, там тебе быстрей ответят

  29. Разобрался.
    Если кому интересно, то оказалось, что у IIS есть функция импорта сертификата из внешнего хранилища ключей.
    Соответственно для кластера поступил так
    1. на первой ноде создал запрос на сертификат на домен google.ru. Подписал его. Положил на первую ноду. Красота.
    2. Сделал на первой ноде экспорт хранилища ключей в файл, пароль сделал
    2. на второй ноде сделал импорт сертификата из внешнего хранилища - из файла - пароль указал и вуаля - на второй ноде появился тот же сертификат в хранилище

    захожу теперь по https и наслаждаюсь как круто все работает

  30. После того как я успешно настроил ssl на девелоперском проекте и написал документацию, меня почему то признали специалистом этого дела и поручили следующее задание.

    Есть самый главный центральный CA компании, назовем его НИНДЗЯ.
    Есть CA второго уровня выданный на проект. Этот CA удостоверен и подписан НИНДЗЕЙ (с целью центрально отозвать его и все им подписанное по окончании проекта). Назовем этот CA второго уровня - ЧЕБУРАШКА
    ЧЕБУРАШКА подписывает сертификаты используемые уже в ssl.

    Некоторый клиент и сервер решили общаться на уровне ssl. Оба имеют свои собственные сертификаты удостоверенные ЧЕБУРАШКОЙ. На клиенте и на сервере ЧЕБУРАШКА прописан как доверенный центр сертификации, поэтому проблем у них не возникает. Все другие сертификаты, не удостоверенные ЧЕБУРАШКОЙ обламываются и это хорошо.

    Тут появляется пиратский клиент с сертификатом подписанным НИНДЗЕЙ и пытается получить доступ к нашему серверу.

    Что будет делать сервер?
    1. Обломает пиратского клиента, потому что нужен сертификат подписанный исключительно ЧЕБУРАШКОЙ
    2. Пропустит пирата, потому что НИНДЗЯ стоит выше в иерархии подписантов, чем ЧЕБУРАШКА

    Мне нужен вариант 1

    Ответы: (30)
  31. (29) все ок. будет 1 вариант

  32. Все отлично, но получил очередное задание:

    Сервер Apache
    На нем работает веб приложение https://adminapp.ru . Настройки Apache выставлены так, что для того чтобы войти в adminapp.ru требуется, чтобы у клиента стоял админский SSL сертификат которому Apache доверяет. Иначе обламывает. Это я решил в прошлом задании, все админы счастливы

    Но нашлись падлы, которым нужна исключительно часть https://adminapp.ru/somefuckingimportantpart/padla*
    И сертификат админский всем этим падлам не раздать, уж очень их много.
    Можно ли не переделывая приложение, настроить apache так, чтобы он по https://adminapp.ru/* требовал от клиента админский сертификат, а для https://adminapp.ru/somefuckingimportantpart/padla* так и быть не требовал?

  33. переопределить авторизацию через htaccess не предлагать?

  34. упс, я нечаянно обвалил сайт РЖД http://rzd.ru

    Ответы: (37)
  35. поезда пошли под откос...
    Беги, дядь Мить ©

  36. Что за форум?! Один всё мечтает кого-нибудь прирезать, другой национальные порталы валит левой ногой....

    Ответы: (36)
  37. (35) ну если он там админ/прог и почему бы и нет?

  38. Сид Вишес упс, я нечаянно обвалил сайт РЖД http://rzd.ru

    и как вас, ещё не повесили?

    Ответы: (38)
  39. (37) поднялся уже давно

  40. да сайт то понятно что подняли. А каков результат разбора полётов?

  41. 21.08.2017 17:29:18 отредактировано sda553

    Приговорить косячника к поездке в плацкартном вагоне от Калининграда до Владивостока и обратно, без права выходить из вагона. И чтобы с одной стороны полвагона дембелей ехало, а с другой стороны полвагона старых бабусек

  42. ма вахтовики?

  43. Всем привет. Теперь у меня на работе почему то решили, что я еще и специалист по парсерам и лексическим анализаторам

    Ответы: (43)
  44. (42) ну парсеры это же прекрасно. Один из самых моиз весёлых проектов было писать парсер из Excel в MDX

    Ответы: (47)
  45. а что конкретно хотят?

    Ответы: (45)
  46. (44) плагин для идеи, чтобы идея работала с каким то экзотическим скриптовым языком

    Ответы: (46)
  47. (45) какие у вас однако затейники в ржд.

  48. ЗлобнийМальчик ну парсеры это же прекрасно.

    +++

  49. 07.09.2017 11:04:53 отредактировано Сид Вишес

    Вопрос для холивара:
    допустим надо распарсить код

    Class A{
    ...
      {
        .....
          {
           }
    
       }
    }

    Правильно ли использовать регулярные рекурсивные выражения для выделения тела класса (обнаружение } закрывающей весь класс)?
    Или лучше использовать другие инструменты с нерекурсивными регулярками

    Ответы: (51) (52)
  50. не.

  51. много писал конечных аппаратов, в данном случае будет самое оно.

  52. 07.09.2017 11:40:30 отредактировано Курильщик

    (48) приходилось писать парсеры на конечных автоматах?

  53. (48) kiss
    Рекурсия сложнее нерекурсии.

  54. 07.09.2017 11:42:02 отредактировано Сид Вишес

    Нет, я даже не понимаю, что такое конечный аппарат.
    Сейчас пишу парсер.
    Взял библиотеку http://jflex.de/ освоил ее и разбил все успешно на лексемы. Теперь все умные статьи говорят, что надо эти лексемы выстроить в дерево, вот сижу и думаю, чем дерево строить - регулярками рекусрсивынми или нет

    Ответы: (56)
  55. Автомат же...

  56. меня кстати федя fez научил, спасибо ему за это.

  57. (53) расскажу коротко

    Ответы: (59)
  58. автомат это такой алгоритм который действует по строгим правилам и постоянно находится в строго определенном состоянии.
    по конвееру к нему едут данные. конвеер назад не крутится, строго вперед.

  59. это первое.

  60. (56) прочитал в вики, это все уже есть в генераторе jflex. Я просто описал возможные состояния по ходу последовательных данных и соответствующие регулярки, но там рекурсии нельзя делать, поэтому я просто там заложил счетчик открывающиеся фигурные скобки, закрывающиеся и в итоге, когда выхожу на ноль счетчика то сбрасываю состояние на ожидание следующего класса

  61. представим что к нам едет
    Class A{
    ...
    {
    .....
    {
    }
    читаем символ это буква 'C' переводим аппарат в состояние "Начало ключевого слова", читаем пока не будет пробел. получили пробел, перевели аппарат в состояние "Конец ключевого слова" и т.д.

    Ответы: (62)
  62. 07.09.2017 11:51:23 отредактировано Курильщик

    но есть готовые лекс парсер-генераторы. тот же bison

  63. (60) да, так примерно и описал. Потом я описал, что приехала фигурная скобка открывающаяся и перевел анализатор в состояние "ТелоКласса"

  64. 07.09.2017 11:53:15 отредактировано Сид Вишес

    Потом приехала еще одна открывающаяся скобка - но я фиг знает что ему еще сделать, сделал состояние ТелоКласса+(Счетчик скобок+1)

  65. Для закрывающей скобки сделал состояние ТелоКласса+(Счетчик скобок-1) если счетчик скобок==0 то "ожидание начала ключевого слова"

  66. 07.09.2017 11:55:42 отредактировано Сид Вишес

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

  67. а если там будет битая последовательность?

    Ответы: (67)
  68. 07.09.2017 12:07:00 отредактировано Сид Вишес

    (66) пока не углубляюсь, пробую хоть как то освоиться в теме. Но можно переводить в состояние "Начало ключевого слова" если встретилось слово class или вообще забить.
    Оказывается эти автоматы я и использовал, не зная того

    JFlex lexers are based on deterministic finite automata (DFAs). They are fast, without expensive backtracking.

    http://jflex.de

  69. а надо распарсить тело класса или найти начало и конец?

    Ответы: (69)
  70. (68) я сам не знаю, собираю лучшие практики.
    Как бы в лучших практиках рекомендуется три уровня обработки.
    Пример: выражение '2 + 3'
    1. Разбиение на лексемы, должно выйти что то типа
    [Цифра] [Пробел] [ЗнакПлюса] [Пробел] [Цифра]

    2. Постройка на основании лексем абстрактного синтаксического дерева, должно выйти что то типа
    [Модуль]
    {
    [Бинарная операция]
    {
    [Литера]
    {
    [ ЦифраКонстанта]
    }
    [ЗнакПлюс]
    [Литера]
    {
    [ ЦифраКонстанта]
    }
    }
    }

    3. Постройка программного синтаксического дерева
    [Модуль]
    {
    [Бинарная операция сложения]
    {
    [Аргумент1]
    [Аргумент2]
    }
    }

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

  71. а где комменты?

    Ответы: (72)
  72. Взрослые, блять, люди.. Нет чтобы 1ску внедрять.

  73. (70) не нужны

    Ответы: (73)
  74. (72) они могут быть, и должны быть обработаны

  75. Я набрался опыта в парсинге программного кода и думаю, написать об этом статью на хабре.

    Краткая теория:
    1. Как и в любой программе, необходимо спланировать объекты кода. Это могут быть, например, объект class. У объекта класс спланируем метод, getPrivateFields(), getPublicFields(), getPrivateMethods и т.д.
    У объекта method спланируем кроме параметров и возвращаемого значения, например, дерево getCodeAreaTree() которое будет получать участки кода метода с различной видимостью локальных переменных. Переменные родительского узла видны дочерним узлам, а переменные локальные для дочернего узла, не видны родительским.
    Ну а у codeArea спланируем какую нибудь коллекцию инструкций. И так далее. Удобно, если объекты инструкций, переменные и методы будут иметь метод getReference ссылающийся на объявление этих методов и переменных.

    После такого планирования мы уже будем видеть структуру дерева программного кода, которое, правда, еще нужно получить.

    Начнем с низов. Проведем лексический анализ методом конечных автоматов. Я использую для этого упомянутый выше jflex. Смысл этой утилиты в том, что в нее на вход подаешь описание лексики языка в форме .flex (примеров в инете куча), а на выходе она тебе выдает готовый код парсера текста на конечных автоматах, логика которого красиво разобьет все на пробельные участки, комментарии и лексемы кода.

    Далее в дело вступает конечный автомат работающий на этих лексемах. Запускаем цикл от первой до последней лексемы кода и оперируя состояниями получаем абстрактное дерево программной структуры. То есть выделяем где участки кода, где объявления, где директивы импорта.

    Ну и далее третий этап. Конвертация абстрактной структуры программного кода в наши объекты, что мы спланировали в п.1. Обходим дерево и расставляем необходимые референсы к объявлениям, заполняем приваты, чтобы заработали всякие getPublicFields(), getPrivateMethods для каждого объекта дерева.

    Когда мы получим спланированное дерево, то будем считать задачу выполненной. Далее это можно прицеплять в качестве плагина к какому нибудь текстовому редактору и вуаля, у вас готовый инструмент для работы с вашим кодом.

  76. 26.09.2017 10:35:06 отредактировано sda553

    Есть примеры парсеров к IntelliJ Idea, если тебе интересно
    https://github.com/JetBrains/intellij-community/blob/306d705e1829bd3c74afc2489bfb7ed59d686b84/java

    Ответы: (79)
  77. Сложность еще вижу я. Это все будет работать только для небольших программ, на одной странице. Если необходимо распарсить большую программу с кучей импортов, модулей, то нужно еще добавить такую вещь как индексирование.

  78. юзай LetsEncrypt, сертификат за пару минут.

  79. (76) там то же конечный автомат сгенерирован jflexом. Вот структура языка java расписанная в flex
    https://github.com/JetBrains/intellij-community/blob/306d705e1829bd3c74afc2489bfb7ed59d686b84/java/java-psi-impl/src/com/intellij/lang/java/lexer/_JavaLexer.flex

или зарегистрируйтесь чтобы ответить!