Программа для хранения кодов программ. Один комментарий к 'Как хранить проекты в хранилище кода?'. Опции команды genkeypair

Ниже вы можете увидеть, где хранят данные сервисы-репозитории, какими системами контроля версий поддерживаются, есть ли у них десктопное приложение и на какие операционные системы его можно установить.

# Компания Год Контроль версий Хранение данных Цена (в месяц), $
1
0
2008 Git, SVN 7–210
2
0
2008 Git, Mercurial облако / собственный сервер 10–200
2016
3
0
2011 Git облако / собственный сервер 4-99
4
0
2007 Git, SVN облако 15–200

Среди других сервисов-репозиториев для хранения кода при обработке данных респондентов рассматривались: Amazon Cloud Drive, Codebase, Gitolite, Heroku, Microsoft Azure, RhodeCode, Subversion, Team Foundation Server.

О рейтинге

Рейтинг сервисов-репозиториев для хранения кода проводится Тэглайном в третий раз и сформирован на основе проводившегося с апреля 2016 по май 2018 года опроса 540+ технических руководителей digital-компаний. Респондентам предлагалось выбрать один или несколько вариантов ответа на вопрос «Какие сервисы-репозитории вы используете для хранения кода?».

Динамика приводится по сравнению с данными, полученными Тэглайном за период с августа 2014 по апрель 2016 года.

В рейтинге с достаточно большим отрывом (77%) продолжает лидировать GitHub - самый известный веб-сервис для хостинга проектов, основанный на системе контроля версий Git. Для проектов с открытым исходным кодом сервис бесплатен, а для частных проектов с приватными репозиториями существует несколько тарифных планов:
- персональный (создание приватных репозиториев для командного пользования, от $7 в месяц);
- для небольших организаций (появляется возможность управлять настройками доступа, от $25 в месяц);
- для крупных компаний (можно установить на собственный сервер или свое облако, от $2520 в год).
GitHub часто называют соцсетью для разработчиков. В нем есть все соответствующие элементы: фолловинг, комментирование, избранное. Активность на сервисе может также выступить и в роли резюме.

На втором месте Bitbucket, за него проголосовали 48% респондентов. Он позволяет создавать неограниченное количество приватных репозиториев, но имеет ограничение в 5 пользователей. Для команд большего размера существует платная версия - от $10. Так как Bitbucket - один из продуктов Atlassian, его можно интегрировать с другими решениями этой компании: JIRA, Hipchat, Bamboo.

GitLab (14%) функционалом похож на GitHub, но его можно бесплатно установить на собственный сервер и настроить под свои нужды. При этом он существует еще и в качестве SaaS - после регистрации можно бесплатно создавать приватные репозитории для совместной работы. Платные возможности - в версии для крупных компаний (от $48 за пользователя в год).

Наконец, на четвертом месте Beanstalk - 1% от общего количества респондентов. В отличие от конкурентов он предлагает бесплатную версию только на 2 недели, а выбор платных тарифов зависит от количества пользователей, репозиториев и выделенного объема хранилищ. Тарифы для платных компаний ($50–200) включают в себя еще и ряд дополнительных функций, таких, как приоритетная поддержка или развертывание на нескольких серверах одновременно.

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

Основные требования:

  • Разработчик должен быстро приступить к работе не забивая голову установкой десятка библиотек.
  • Библиотеки должны быть доступны из разных проектов, при этом необходимо избежать дублирования кода в репозиториях.
  • Должна быть возможность сохранять определенные состояния проекта: новые версии, номерные сборки для тестеров и т.д.

Я рекомендую под каждый проект создавать свой репозиторий. Это позволит четко отделить один проект от другого, при необходимости дать права на редактирование конкретных репозиториев только определенным разработчикам, решить вопрос с архивированием. Библиотеки, даже сторонние, следует рассматривать как отдельные проекты и также хранить в отдельных репозиториях. Исключение может быть сделано только для особо крупных библиотек, например Qt или Boost.

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

Папки trunk, tags, branches

Часто в Subversion используют структуру проекта из трех папок: trunk, tags и branches. Для чего они?

  • trunk - это папка для разработки. В ней всегда находится самая свежая версия кода, доступная для разработчиков. Здесь крайне важно всегда поддерживать код в собирабельном состоянии. Любая поломка сборки проекта должна исправляться как можно быстрее, чтобы не создавать сложностей остальным разработчикам.
  • В tags находятся состояния проекта на определенный момент. Например ближе к релизу, разработчики начинают создавать с определенной периодичностью сборки с уникальным номером которые передаются тестерам. Состояние проекта на этот момент можно зафиксировать в папке tag, присвоив ему говорящее название, например build_723. Это позволит в случае внесения дефекта отсутствующего в данной сборке и обнаруженного в следующей сборке, проанализировать причину проблемы и принять соответствующие меры к ее устранению.Также здесь можно отмечать выпущенные версии, например 1.0.5. Таким образом, получив от пользователей жалобу на ошибку в какой-либо версии, можно взять код актуальный для данной версии, для изучения проблемы.
  • branches - временные ветки разработчиков. Что это значит? Разработчик Вася получает задание на добавление некоторой функциональности. Для того чтобы не блокировать работу других членов команды, он создает копию проекта в branches/vasia_task_1234, работает в этой ветке периодически сохраняя код с репозиторий. Выполнив задачу, он проводит слияние с основной веткой разработки (trunk) и удаляет временную ветку. Задача выполнена, при этом он мог фиксировать состояние своей работы во временной ветке, не нарушая работы остальных разработчиков.

Работа с ветками и фиксация состояния проекта в tags будет описана в другой заметке.

Как именовать версии?

Я предлагаю способ нумерации версий состоящий из трех цифр - major .minor .micro , где:

major - цифра обозначающая версию продукта (разные номера версий обозначают существенные отличия между продуктами),
minor - подверсия продукта (разные номера говорят о том, что подверсии обладают разным функционалом),
micro - в рамках подверсии указывает на то, что были исправлены какие либо ошибки.

  1. При выпуске новой версии содержащей только исправления ошибок увеличивается цифра в позиции micro.
  2. При выпуске версии с изменившимся функционалом инкрементируется minor и обнуляется micro.
  3. При выпуске новой версии продукта существенно отличающегося от предыдущего, увеличивается major, а minor и micro обнуляются.

Пример проекта

Рассмотрим простой проект состоящий собственно из кода проекта (project) и двух библиотек (lib1, lib2). Структура из трех репозиториев:

project (Для примера пусть путь к репозиторию будет https://server/project)

branches
tags
trunk

lib1 (https://server/lib1)

branches
tags

lib2 (https://server/lib2)

branches
tags
trunk

Собственно project - это наш проект, который зависит от сторонней библиотеки lib1 версии 1.0 и от библиотеки собственной разработки lib2, которая разрабатывается совместно с самим проектом, поэтому зависимость будет от ее основной ветки разработки (trunk).

Устанавливаем зависимости в Subversion

Для того, чтобы установить зависимости проекта в Subversion используется свойство svn:externals. Для просмотра установленных свойств нужно перейти в папку с проектом (например trunk) и воспользоваться командой

Для установки свойства svn:externals (естественно для всей папки) находясь в папке с основной веткой разработки (путь_на_локальной_машине/project/trunk ) выполните

Возможно, что Subversion не вызовет текстовой редактор, а выдаст ошибку в которой сообщит, что не определена переменная окружения SVN_EDITOR . Это значит, что надо добавить в системное окружение данную переменную, указав путь к текстовому редактору, который будет вызван. Например C:/WINDOWS/system32/notepad.exe для Windows (обратите внимание - слеши надо разворачивать) или /usr/bin/vi для Linux.

Удалить свойство можно командой

svn propdel svn:externals

И все?

Похоже на то. Теперь каждый раз забирая код project из репозитория будет одновременно подгружаться код библиотек. Если в библиотеках были сделаны изменения, то они автоматически обновятся. Таким образом прописав зависимости проекта можно не думать о библиотеках, они будут обновлены и скачаны автоматически, основная ветка разработки будет содержать папки lib1 и lib2 с библиотеками.

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

Вероятно, вы уже когда-нибудь встречали сетевой термин «pastebins». Это такие веб-сервисы, которые позволяют вам размещать отрывки написанного полезного кода, а затем делиться им с другими людьми. Такие сервисы очень часто используются пользователями IRC, социальных сетей, блогов и так далее. Пользователи могут размещать исходный код в сервисах типа pastebins, а затем отсылать ссылки на код другим людям.

В сети вы сможете найти кучу таких веб-сервисов. Большая часть оснащена стандартным набором функций. Но разработчики некоторые явно отличились смекалкой. Мы собрали для вас подборку и лучших сервисов, и вы обязательно найдете тот, который будет полностью отвечать всем вашим требованиям.

02.
Ideone не просто сервис из разряда Pastebin, но и также он-лайн компилятор и дебаггер. Он позволяет вам компилировать и запускать код в сети. Имеется поддержка более 40 языков программирования. Вдобавок, вы можете архивировать уже созданные отрывки или выделять порядок. Тем не менее, стоит сказать, что сервис не предоставляет возможности шифровки кода.


03.
Pastebin.com позволяет вам размещать ваши тексты и код на выделенных серверах для дальнейшего разделения с другими людьми. Вдобавок, вы можете указывать дату истечения службы кода, архивировать отрывки, выделять отдельные части кода, а также автоматически назначать суб-домены. Здесь также нет возможности шифровки кода.


04.
Mystic Paste представляет собой сервис из разряда pastebin, который бесплатно предоставляет исходный код. С помощью этого сервиса вы без труда сможете размещать свои отрывки кода и делиться им с людьми. Сервис также предлагает различные дополнительные плагины.


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


06.
Paste HTML позволяет вам размещать HTML-код, простой текст, а также и разметку. Сервис может быть использован в качестве анонимного веб-хостинга для размещения HTML-страниц. Этот сервис разработан специально для кода HTML.


07.
Codepad представляет собой он-лайн компилятор, который позволяет вам запускать ваш код, и делиться им с друзьями. Инструмент позволяет вам выделять отдельные отрывки кода, а также создавать отдельные приватные элементы. Тем не менее, отсутствует поддержка защиты паролем. На данный момент приложение поддерживает 13 популярных языков программирования.


08.
MathBin позволяет вам с легкостью размещать математические уравнения. В сервисе используется форматирование LaTeX для генерации уравнений в виде изображений. Этот инструмент отлично подойдет для размещения фрагментов математических и физических задач, которые подлежат решению и обсуждению.


09.
Snipplr – это публичное хранилище отрывков кода, которое позволяет вам размещать и делиться собственными отрывками кода. Сервис позволяет вам выделять отдельные фрагменты кода и архивировать код. Для использования сервиса, вам придется зарегистрироваться.


10.
Code Upload – это бесплатный pastebin-сервис, который предоставляет собственный исходный код. С помощью данного сервиса вы сможете размещать отрывки кода и делиться ими с другими. Сервис также позволяет вам архивировать отрывки, закрывать их паролями и выделять отдельные фрагменты кода.

11.
PASTE позволяет вам размещать ваши коды и также текст дебаггинга. Он позволяет вам устанавливать истечение срока действия и закрывать файлы паролем.


12.
Gist – это легкий способ размещения отрывков кода. Сервис предоставляет различные функции типа выделения отдельных отрывков кода, установки пароля и так далее. Всем отрывкам автоматически устанавливается версия.


13.
Codetrunk представляет собой инструмент для размещения отрывков кода, который, к тому же, предоставляет еще и свой собственный исходный код. Сервис позволяет вам выделять отдельные отрывки кода, архивировать их и так далее. Сервис автоматически присваивает суб-домены для каждого отрывка кода.


14.
PasteSite позволяет вам размещать отрывки кода, которые могут быть просмотрены посредством сайта, предварительно указав выделение отдельных отрывков кода. PasteSite позволяет вам закрывать ваши отрывки кода паролем. Вы также без труда сможете удалить любой из документов.


15.
pzt.me представляет собой сервис pastebin, который работает в нескольких направлениях. Вы можете делиться текстом, изображениями, видео и ссылками на различные интересности в сети. Вы сможете встраивать видео со всех популярных видео-сайтов, включая YouTube, DailyMotion, Vimeo и т.д. Вы также можете использовать сервис для того, чтобы укорачивать ссылки.

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


17.
Clippy – это бесплатный сервис, который предоставит вам различные функции типа защиты паролем, подсветки отдельный фрагментов, антиспама и присвоение суб-доменов. На данный момент сервис поддерживает более 50 языков программирования.

18.
Максимально простейшая реализация сервиса типа pastebin. Сервис очень прост в использовании. Интерфейс состоит из поля для ввода текста и кнопки вставки.


19.
Dpaste представляет собой инструмент для размещения отрывков кода. Изначально он был разработан программистами Django для использования в IRC канале #django. Вы сможете выделять отдельные фрагменты текста, а также архивировать отрывки. Тем не менее, он поддерживает всего несколько языков программирования.


20.
Slexy – это мощный и гибкий сервис типа pastebin. Он позволяет вам добавлять вкладки в пределах вставленного текста, сохранять настройки и вставлять посредством CLI/terminal. Он также предоставляет вам возможность установки истечения срока действия, выделения отдельный фрагментов кода, а также защищать код паролем.


21.
Paste-It представляет собой простой в использовании сервис pastebin. Сервис представляет возможность создания приватных отрывков, срок истечения, а также подсветку отдельных фрагментов. Сервис также предоставляет специальные плагины для Firefox и Chrome для более быстрого и удобного копирования.
pastebin.ca
pastebin.ca представляет собой инструмент из разряда pastebin. Он позволяет вам размещать код и делиться им с другими людьми. Сервис предоставляет функции подсветки отдельных фрагментов кода, архивирования, защиты паролем, а также присвоения суб-доменов. Он также позволяет вам устанавливать срок истечения действия, а также оставлять комментарии к отрывкам.

25.
Pastie представляет собой еще один сервис из разряда pastebin с поддержкой всех основных функций, свойственных для сервисов данного типа. Сервис поддерживает все популярные языки программирования.

Защита данных в приложениях имеет важное значение, защита конфиденциальной информации - первостепенное. Одним из самых распространённых способов защиты информации во все времена является шифрование данных. Криптография, симметричное и асимметричное шифрование, ключи и сертификаты непосредственно связаны с данной задачей. Используемые для защиты информации ключи и сертификаты также нужно надежно защитить. Для этих целей используется keystore - хранилище сертификатов и ключей.

keystore - это специализированное хранилище секретных данных, которое используется Java-приложениями для шифрования, аутентификации и установки HTTPS соединений. Так, для аутентификации клиента и сервера, устанавливающих SSL (Secure Sockets Layer - уровень защищённых cокетов) соединение, требуются приватные ключи и сертификаты. Если используется односторонняя аутентификация, то keystore используется только на серверной стороне. При двусторонней аутентификации клиент и сервер обмениваются сертификатами; соответственно и у сервера, и у клиента должны быть keystore с парой ключей private/public + сертификат. Иными словами keystore используется для хранения ключей и сертификатов, применяемых для идентификации владельца ключа (клиента или сервера).

Java поддерживает несколько форматов хранилищ keystore :

Каждая запись в keystore имеет уникальный псевдоним (alias). Рекомендуется в keystore не использовать alias"ы, отличающиеся только регистром. В стандартной реализации каждый ключ в хранилище защищается паролем; кроме того, всё хранилище целиком может быть защищено отдельным паролем.

Стандартное хранилище доверенных CA-сертификатов (Certificate Authority) для Java приложений располагается в директории jre/lib/security/cacerts (пароль - changeit).

Информацию в хранилище можно разделить на две категории: ключевые записи (пары ключей private/public) и доверенные сертификаты. Ключевая запись, используемая для криптографических целей, включает идентификационные данные объекта и его закрытый ключ. Доверенный сертификат содержит идентификационные данные объекта и открытый ключ. Запись с доверенным сертификатом не может использоваться в тех случаях, где требуется закрытый ключ.

Чтобы отделить ключевые записи от сертификатов целесообразно использовать различные хранилища: один для собственных ключей, а другой - для доверенных сертификатов, включая сертификаты Центров сертификации (CA). Такой подход позволит реализовать разделение между собственными сертификатами и соответствующими закрытыми ключами, и доверенными сертификатами. Дополнительно можно обеспечить более высокую защиту для закрытых ключей в отдельном keystore с ограниченным доступом, а доверенные сертификаты оставить в более свободном доступе.

Утилита keytool

Для управления парами ключей (private/public), сертификатами и хранилищем keystore Java включает утилиту keytool , располагаемую в директории bin. Для запуска keytool можно использовать командную строку. Опции утилиты позволяют выполнять различные операции и получать определенные сведения. Так, чтобы получить информацию об утилите, можно просто выполнить команду keytool без опций:

C:\Program Files\Java\jre1.8.0_121\bin>keytool Key and Certificate Management Tool Commands: -certreq Generates a certificate request -changealias Changes an entry"s alias -delete Deletes an entry -exportcert Exports certificate -genkeypair Generates a key pair -genseckey Generates a secret key -gencert Generates certificate from a certificate request -importcert Imports a certificate or a certificate chain -importpass Imports a password -importkeystore Imports one or all entries from another keystore -keypasswd Changes the key password of an entry -list Lists entries in a keystore -printcert Prints the content of a certificate -printcertreq Prints the content of a certificate request -printcrl Prints the content of a CRL file -storepasswd Changes the store password of a keystore Use "keytool -command_name -help" for usage of command_name

Чтобы получить дополнительную справку о команде необходимо указать ее наименование и волшебное слово help. Не забывайте о дефисе "-" перед опциями:

C:\Program Files\Java\jre1.8.0_121\bin>keytool -certreq -help keytool -certreq ... Generates a certificate request Options: -alias alias name of the entry to process -sigalg signature algorithm name -file output file name -keypass key password -keystore keystore name -dname distinguished name -storepass keystore password -storetype keystore type . . . -providerarg provider argument -providerpath Provider classpath -v verbose output -protected password through protected mechanism Use "keytool -help" for all available commands

Создание самоподписанного сертификата

Для создания самоподписанного сертификата также необходимо использовать команду -genkey с указанием срока действия сертификата в опции -validity. Следующая команда создаст пару 2048-битных RSA-ключей, действительных на протяжении 365 дней, с указанным псевдонимом (parent) в заданном файле/хранилище ключей (keystore.jks). Закрытый ключ в хранилище «закрывается» паролем, открытый ключ «оборачивается» в самоподписанный сертификат .

Keytool -genkey -alias parent -keyalg RSA -validity 365 \ -keystore keystore.jks

Если заданного хранилища ключей (keystore.jks) не существует, то keytool создаст его. При выполнении команды keytool будет запрашивать некоторые необходимые данные: пароль хранилища, Distinguished Name и пароль закрытого ключа. Многие параметры используются со значениями по умолчанию. Так, например, алиас - mykey, хранилище - .keystore в домашней директории пользователя (HOMEPATH), алгоритм шифрвания - SHA1withDSA и пр.

Distinquished Name

Сертификат создается в формате X.509. В этом формате в качестве идентификатора владельца используется Distinquished Name или просто DN в формате X.500. Этот же формат идентификации объектов используется в LDAP-протоколе или в SNMP. Distinquished Name задается в виде разделенных через запятую атрибутов:

  • CN - common name (имя владельца);
  • OU - organizational unit or department/division (департамент/отдел);
  • O - organization name (наименование организации);
  • L - locality or city (город/местоположение);
  • ST - state or province;
  • C - country, two chars (страна).

Часть из атрибутов могут быть пропущены; в этом случае им будет присвоено значение Unknown.

Одним из важных атрибутов сертификата являются альтернативные имена SAN (SubjectAlternativeName). Подробности и пример внесения SAN в самоподписанный сертификат представлены на странице настройки конфигурации сервера Tomcat.

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

C:\Program Files\Java\jdk1.8.., L=Moscow, C=RF" \ -alias parent -storetype jks -keystore keystore.jks \ -validity 365 -keyalg RSA -keysize 2048 \ -storepass mystorepass -keypass mykeypass Generating 2 048 bit RSA key pair and self-signed certificate (SHA256withRSA) with a validity of 365 days for: CN=сайт, OU=Developers, O=IT Systems Inc., L=Moscow, C=RF

Новое хранилище было размещено в той же директории, где и располагается keytool.

Создание пары ключей

Для создания пары ключей необходимо использовать команду "-genkeypair". Следующая команда создаст пару ключей "keypair" в хранилище keystore.jks, где размещен созданный ранее сертификат.

C:\Program Files\Java\jdk1.8.0_121\bin> \ keytool -alias keypair -genkeypair -keystore keystore.jks \ -dname "CN=сайт" Enter keystore password: Enter key password for (RETURN if same as keystore password):

Сертификат и закрытый ключ сохранены в виде новой keystore записи, идентифицированной псевдонимом "keypair". Открытый ключ обертывается в формат X.509 - это самоподписанный сертификат, который сохранен как одноэлементная цепочка сертификата.

Опции команды genkeypair

  • [-storepass storepass]
  • {-alias alias}
  • {-storetype storetype}
  • {-keystore keystore}
  • [-keypass keypass] - является паролем, используемым для защиты закрытого ключа
  • [-dname dname] - определяет отличительное имя в формате X.500, связанное с псевдонимом и используемое в качестве issuer и subject поля в самоподписанном сертификате
  • {-startdate value}
  • {-keyalg keyalg} - определяет алгоритм, который будет использоваться, чтобы генерировать пару ключей
  • {-keysize keysize} - определяет размер каждого ключа, который будет сгенерирован
  • {-sigalg sigalg} - определяет алгоритм, который должен использоваться, чтобы подписать самоподписанный сертификат; алгоритм должен быть совместимым с keyalg
  • {-ext ext}*
  • {-validity valDays}
  • {-protected}
  • {-Jjavaoption}

Создадим еще две пары ключей с псевдонимами "keypair1" и "keypair2", чтобы при просмотре содержимого хранилища (ниже) был небольшой список пар ключей:

Keytool -alias keypair1 -genkeypair -keystore keystore..jks \ -dname "CN=сайт"

Экспорт сертификата

Сертификат можно экспортировать из хранилища и предоставить его пользователям Вашей «подписанной» программы. Тогда пользователи могут занести Ваш сертификат в свое хранилище доверенных сертификатов. Для экспорта сертификата используется команда "exportcert". Следующий пример извлекает из хранилища сертификат в файл "parent.cer" :

C:\Program Files\Java\jdk1.8.0_121\bin> \ keytool -exportcert -keystore keystore.jks \ -alias parent -file parent.cer Enter keystore password: Certificate stored in file

Импорт сертификата

Чтобы импортировать сертификат в хранилище, нужно его сначала получить каким-либо образом. Не будем мудрить и извлечем сертификат с псевдонимом veriSignclass1g3ca из хранилища доверенных сертификатов jre\lib\security\cacerts (пароль хранилища changeit). То есть выполним команду экспорта сертификата с указанием соответствующего хранилища:

Экспорт сертификата из хранилища cacerts

C:\Program Files\Java\jdk1.8.0_121\bin> keytool -exportcert -alias veriSignclass1g3ca -keystore \ "C:\Program Files\Java\jdk1.7.0_67\jre\lib\security\cacerts" \ -file veriSignclass1g3ca.cer Enter keystore password: Certificate stored in file

Импорт сертификата в хранилище

Чтобы импортировать сертификат в хранилище keystore.jks необходимо использовать команду "importcert". Если в качестве опции указать "-trustcacerts", то сертификат импортируется в хранилище доверенных сертификатов, т.е. в jre\lib\security\cacerts. При выполнении команды импорта утилита keytool попросит ввести пароль хранилища:

C:\Program Files\Java\jdk1.8.0_121\bin> \ keytool -importcert -keystore keystore.jks \ -file veriSignclass1g3ca.cer Enter keystore password: \ Owner: \ CN=VeriSign Class 1 Public Primary Certification Authority - G3, \ OU="(c) 1999 VeriSign, Inc. - For authorized use only", \ OU=VeriSign Trust Network, \ O="VeriSign, Inc.", \ C=USIssuer: \ CN=VeriSign Class 1 Public Primary Certification Authority - G3, \ OU="(c) 1999 VeriSign, Inc. - For authorized use only", \ OU=VeriSign Trust Network, \ O="VeriSign, Inc.", \ C=US \ Serial number: \ Valid from: \ Fri Oct 01 04:00:00 MSD 1999 until: Thu Jul 17 02:59:59 MSK 2036 \ Certificate fingerprints: \ MD5: B1:47:BC:18:57:D1:18:A0:78:2D:EC:71:E8:2A:95:73 \ SHA1: 20:42:85:DC:F7:EB:76:41:95:57:8E:13:6B:D4:B7:D1:E9:8E:46:A5 \ SHA256: CB:B5:AF:18:5E:94:2A:24:02:F9:EA:CB:C0:ED:5B:B8:76:EE:A3: \ C1:22:36:23:D0:04:47:E4:F3:BA:55:4B:65 Signature algorithm name: SHA1withRSA Version: 1 \ Trust this certificate? : y Certificate was added to keystore

Просмотр хранилища

Для чтения содержимого хранилища необходимо использовать команду "-list". В качестве опции "-keystore" можно указать путь к хранилищу. По умолчанию команда "-list" отображает цифровой отпечаток SHA1 сертификата. Следующий код позволяет просмотреть содержимое созданного хранилища, включающего сертификат и три пары ключей:

C:\Program Files\Java\jdk1.8.0_121\bin> \ keytool -list -keystore keystore.jks Enter keystore password: Keystore type: JKS Keystore provider: SUN Your keystore contains 5 entries keypair2, 14.02.2018, PrivateKeyEntry, Certificate fingerprint (SHA1): \ C4:02:BA:D7:24:6B:84:2F:CD:F9:81:16:5F:74:E0:31:7B:C0:19:B1 keypair1, 14.02.2018, PrivateKeyEntry, Certificate fingerprint (SHA1): \ AB:BA:92:77:44:BD:B0:65:EB:29:0C:F9:86:64:0F:81:B7:4A:27:9A keypair, 14.02.2018, PrivateKeyEntry, Certificate fingerprint (SHA1): \ 8A:8B:21:83:1E:75:4F:C7:62:85:6A:31:84:45:AA:16:2B:20:06:1E parent, 13.02.2018, PrivateKeyEntry, Certificate fingerprint (SHA1): \ DB:8B:9D:9D:DF:5B:B3:82:0E:19:C6:A4:A4:3E:08:C0:AB:20:F9:85 mykey, 18.02.2018, trustedCertEntry, Certificate fingerprint (SHA1): \ 20:42:85:DC:F7:EB:76:41:95:57:8E:13:6B:D4:B7:D1:E9:8E:46:A5

Опции команды list

  • {-v | -rfc}
  • [-storepass storepass]
  • {-alias alias}
  • {-storetype storetype}
  • {-keystore keystore}
  • {-providerName provider_name}
  • {-providerClass provider_class_name {-providerArg provider_arg}}
  • {-protected} {-Jjavaoption}

Если при просмотре хранилища использовать опцию "-v", то информация о сертификате выводится с дополнительной информацией, включающей владельца, порядковый номер и т.д. При использовании опции "-rfc" содержание сертификата печатается согласно интернет-стандарта RFC-1421.

Пример просмотра хранилища и сертификата

На скриншоте представлен пример CertificateReader, позволяющий просматривать хранилище ключей и сертификаты, а также извлекать информацию о сертификате.

Внутри сертификата хранится пара значений Distinqueshed Names . Один DN принадлежит владельцу сертификата, а второй DN указывает идентификатор цента сертификации (CA), подписавшего сертификат. В случае с самоподписанным (self-signed) сертификатом, оба эти DN указывают на владельца сертификата.

Листинг примера

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

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

Import java.security.KeyStore; import java.security.KeyStoreException; import java.security.cert.Certificate; import java.security.cert.X509Certificate; public class CertificateReader extends JFrame { final String TERMIN = "Срок действия сертификата%s"; final String VALID = "действителен" ; final String INVALID = "не действителен" ; final String CREATER = "Издатель%s" ; final String NUMBER = "Серийный номер%s" ; final String START = "Начало срока действия%s" ; final String END = "Конец срока действия%s" ; final String OWNER = "Владелец%s" ; final String ALGORITM = "Алгоритм подписи%s" ; final String SIGN = "Подпись сертификата%s" ; final String LF = "\n" ; final String LF_SPACE = " :\n " ; KeyStore keyStore = null; // хранилище JList lstAliases = null; JTextField txtFileName = null; JTextArea taCertificate = null; final int LIST_size = 140 ; public CertificateReader() { setTitle("Просмотр хранилища сертификатов"); setSize(600, 480); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); getContentPane().setLayout(new BorderLayout()); getContentPane().add(createCtrl(), BorderLayout.SOUTH); getContentPane().add(createGUI (), BorderLayout.CENTER); setVisible(true); } private JPanel createCtrl() { . . . } private JSplitPane createGUI() { . . . } void loadKeyStore() { FileInputStream fis; // Выбор хранилища сертификатов JFileChooser chooser = new JFileChooser(); if(chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { txtFileName.setText(chooser.getSelectedFile().getAbsolutePath()); try { // Чтение хранилище сертификатов keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); fis = new FileInputStream(txtFileName.getText()); keyStore.load(fis, null); Enumeration E = keyStore.aliases(); // Формирование набор сертификатов Vector certs = new Vector(); while (E.hasMoreElements()) certs.add((String)E.nextElement()); // Размещение сертификатов в компоненте lstAliases.setListData(certs); invalidate(); } catch (Exception e) { JOptionPane.showMessageDialog(this , "Ошибка чтения хранилища сертификатов:\n" + e); } } } void showCertificate(final String name) { Certificate cert = null; try { // Чтение сертификата cert = keyStore.getCertificate(name); X509Certificate xcert = (X509Certificate) cert; String valid = ""; try { xcert.checkValidity(); valid = VALID; } catch (Exception ex){ valid = INVALID; } SimpleDateFormat sdf; sdf = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); String end = sdf.format(xcert.getNotAfter ()); String start = sdf.format(xcert.getNotBefore()); String sign = new sun.misc.BASE64Encoder() .encode(cert.getSignature()); String creater = xcert.getIssuerDN().getName(); String owner = xcert.getSubjectDN().getName(); String number = String.valueOf(xcert.getSerialNumber()); String algo = xcert.getSigAlgName(); String info; info = createLine(TERMIN , valid); info += createLine(CREATER , creater); info += createLine(NUMBER , number); info += createLine(START , start); info += createLine(END , end); info += createLine(OWNER , owner); info += createLine(ALGORITM, algo); info += createLine(SIGN , sign); taCertificate.setText(info); } catch (KeyStoreException ex1) { JOptionPane.showMessageDialog(this , "Ошибка получения из хранилища сертификата с " + псевдонимом <>"); } } protected String createLine (String templ, String text) { return String.format(templ, LF_SPACE + text + LF); } public static void main(String args) { new CertificateReader(); } }

Примечание: класс CertificateReader используется в качестве примера на странице цифровой подписи jar файлов

Скачать пример

Рассмотренный на странице пример просмотра хранилища ключей и сертификатов можно скачать (2.5 Кб).

Каждому программисту рано или поздно приходится стыкаться с проблемой, когда нужно где-то сохранить свой код, а на своем компьютере это по какой-то причине сделать невозможно. Или же нужно показать код другому программисту, который находится за тысячи километров, или заказчику. Для фрилансеров это очень актуальная проблема, и сайт решил подсказать вам, куда можно «закинуть» свой код на хранение.

В сети таких сервисов – хоть пруд пруди. Мы подскажем вам несколько бесплатных и с оптимальным набором функций.

Это больше, чем просто сервис для хранения кода. Он позволяет компилировать код, а также находить и исправлять ошибки. Скомпилированный код можно запустить в сети. Ideone поддерживает около 40 языков программирования. Но при всех своих плюсах сервис имеет один недостаток – зашифровать паролем код тут нельзя.

Дает возможность не только размещать текст или коды, но и указывать «срок годности» каждого отрывка, архивировать отдельные отрывки, подсвечивать строки, назначать суб-домены. Но скрыть код с помощью пароля тут тоже нельзя.

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

Разработан специально для хранения HTML страниц и разметки. Также тут можно хранить простой текст. Его можно также использовать в качестве анонимного веб-хостинга для HTML-страниц.

Это онлайн-компилятор, который поддерживает 13 самых популярных языков программирования. Тут можно не только хранить свой код, но и запускать его в сети. Один минус – защитить свой код паролем тут нельзя.

Довольно легкий и простой сервис для хранения кода. Среди полезных функций пастебина – подсвечивание кода, использование пароля. Сервис автоматически задает каждому новому отрывку версию.

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

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



Pastebin.ca

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

Это далеко не все сервисы для хранения кода, но мы постарались собрать для вас самые удобные, простые и функциональные, для которых не требуется регистрация или оплата. Пользуйтесь на здоровье!



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: