written on Friday, January 23, 2015
В Украинском окологосударственном айти, есть такая шикарная штука, как цифровая повинность. Заключается она в том, что государство в какой-то момент решило, что для сдачи электронной отчетности и вообще для идентификации человека в интернете, нужна цифровая подпись и требует ее от собственно сдающих отчетность (подписывать) и от поставщиков всяких сайтов-шмайтов для себя, чтобы ЭЦП там поддерживалось. Казалось бы - торжество криптомафии, удобства и вот этого всего. Ну это если вы конченый технарь-прогромист и не следите за руками.
Наебка первая заключается в том, что считается ЭЦП. ЭЦП - это понятие не техническое, а юридическое, более того, с этими нашими Європами, нужно еще и квалифицированную ЭЦП. То есть например GPG - это не ЭЦП, персональный сертификат ключа, где личность проверена каким-нибудь Verisign - тоже нет ниразу. Сертификат сайта - это вообще никак не ЭЦП, потомучто удостоверяет объект (сайт), а не субъекта, которому он принадлежит (юрика или физика). Сертификат сайта, где Verisign все же проверил субъекта и браузер пишет зелененьким "Twitter Inc" - все равно не ЭЦП. Ну то есть ЭЦП - это не та вся хуйня, которую нормальные люди юзают для полезного дела, а справка, которая нужна чиновнику.
Чтобы получился ЭЦП, надо сначала получить сертификат у специального украинского CA которых конечно есть несколько, включая государственный, который выдает сертификаты бесплатно.
Сертификат - обычный X509v3, такой же самый, что используется в HTTPS и TLS вообще. Ну то есть нет. Там конечно же X509v3, но в Subject Name записано ваше имя украинской кирилицей, как в паспорте, а где-то очень далеко в недрах экстеншенов еще и ИНН (он же ДРФО). Ну и конечно такой сертификат нельзя импортировать в кейчейн броузера или скормить openssl, потомучто там используется не богомерзкий и дырявый RSA или там ECDSA с кривущими SHA-1 и MD-5, а национальное достояние - алгоритм ДСТУ 4145, самый лучший алгоритм, быстрый и безопасный ЭЦП в мире (по версии Державной Службы СпецЗв`язку).
Окей, все мастера PHP убежали, остались привычные ко всякой хуйне прогромисты, которые и не такое видели. Ну еще один несовместимый кусок говна, щас мы алгоритм реализуем, сертификат распарсим, нахуярим патчик на OpenSSL, чтобы все это проинтегрировать и будет счастье. Вы не первый такой умный - все уже собрано и лежит в PPA.
И так, у нас был патч на SSL, сборка под убунту, репоз на гитхабе, два пакета с гостом и f2m под ноду, демон на OpenSSL+re, реализация подписатора и проверятора на пайтоне, разбиралка сертификатов и форматов для клиентского жаваскрипта, конвертер ключей, десять багов в ASN.1 парсере и шлюз аутентификации, экспортирующий проверку юзеров через OAuth2. Не то чтобы это все как-то помогло хоть кому-то, но если ты программист и видишь ненаписанный кусок инфраструктуры, то бывает трудно остановиться.
Наебка номер два заключается в формате ключей. Сертификат у нас обычный (ну окей, плюс свой алгоритм), а где же приватный ключ? Ну вот это вот, которое "----BEGIN PRIVATE KEY----" и много буковок в bas64?
Ключи лежат в зашифрованном контейнер, на контейнер нету спеки. Чисто теоретически, с 2015го года все должно быть PBES2/PBKDB, но я в этом году в Украине еще не был и не знаю ситуации на местах. Окей, вы берете иду проу, jda или кому чего удобней, сами пишете спеку на контейнер, делаете конвертер ключей в стандартный формат, который понимает OpenSSL.
Казалось бы - берем и подписываем. Но не так быстро.
Тривиальщину с форматом подписи, двумя ключами в одном контейнере и всей этой порнографией с LE/BE я оставлю для отдельного технического поста. Если коротко - PKCS#7 (aka CMS) с указанием своих алгоритмов (как и в сертификате X509), плюс враппер вокруг него с указанием, что АААА ВНУТРИ ПОДПИСАННЫЙ PKCS#7!!!!!! и вот это все OpenSSL конечно не прожует. Специальная библиотека jk, прожевать и сгенерировать это может (но не проверяет сам сертификат), специальная библиотека zozol на пайтоне, может распарсить и вытащить все интересное, но это по большому счету никого не ебет.
Следующая наебка почти идентична первой - ЭЦП это не то, чем вы пользуетесь или можете сами сгенерировать. ЭЦП - это специальная юридическая штука, которая возникает в тот момент, когда софт одобренный спецсвязью генерирует пережеванный PKCS#7 с врапперами. Если его генерирует не специально-одобренный софт, то это не ЭЦП, а набор байтиков. Документация, сертификация, статус поставщика доверенных услуг, заключение о том, что средство защиты информации признано надежным. Ну или покупать за килобакс + месячные отчисления библиотеку, которая уже это все прошла.
Окей, скажете вы - я прогромист, меня эти крючкотворства не ебут, давайте подпишем, а доказывать будем есичо в суде. По байтикам же не видно, кто их сегенерировал.
Следующая наебка заключается в том, что такой штуки, как электронный подписанный документ на самом деле нет, кроме как в налоговой, регистрационной службе и специальной фигне для ритейлеров. Например можно взять XML-ку, подписать через dstucrypt/agent, послать на почту налоговой и ее там прожует робот. Ну или можно взять RTF документ, который присылает регистрационная служба, закинуть в eusign.org/doc и посмотреть, что да подписано. При этом форматы у первого и второго будут отличаться.
Каким образом заключить контракт, подписать акт выполнения работ и как потом доказывать, что они дейсвительно подписаны - непонятно. Одно из шикарных объяснений процесса - перед тем, как тащить кого-то за жопу в суд с электронным контрактом, нужно этот электронный контракт отнести в CA, чтобы он дал бумажное заключение, что да подписано, реальне настойщий ЭЦП.