Статьи

Учебник по безопасности Java — пошаговое руководство по созданию SSL-соединения и сертификатов

Шаг за шагом В нашей серии статей о применении безопасности JEE мы представляем вам еще одно подробное руководство по созданию соединения SSL и созданию сертификатов в приложении Java EE. Как упоминалось в нашей предыдущей статье, защищенный сокет (SSL) / транспортный уровень (TLS) обеспечат безопасное соединение между клиентом и веб-сервером. Клиент будет использовать HTTPS-соединение для использования веб-ресурсов. Java предоставляет различные API на основе безопасности, которые могут помочь создать защищенное соединение с клиентом и отправлять / получать сообщения в зашифрованном формате:

  • Архитектура криптографии Java (JCA)
  • Криптографическое расширение Java (JCE)
  • Расширение Java Socket Socket (JSSE)

Чтобы включить SSL-соединение, веб-сервер должен иметь цифровой сертификат, который позволит клиентам доверять подлинности веб-приложения. Приложение, которое хочет отправить зашифрованное сообщение, подает заявку на получение цифрового сертификата от центра сертификации (ЦС) . Центр сертификации проверяет данные владельца приложения и другие идентификационные данные и выдает цифровой сертификат.
В схеме инфраструктуры открытых ключей (PKI) ЦС выпускает цифровой сертификат, который содержит Отличительное имя (DN) / имя / субъект владельца, серийный номер, позволяющий однозначно идентифицировать сертификат, открытый ключ владельца, дату выпуска, дату истечения срока действия, Отличительный наименование ЦС, цифровая подпись органа, выдавшего лицензию (ЦС), алгоритм подписи, который используется для создания подписи . Цифровые сертификаты, выданные ЦС, могут храниться в реестрах, чтобы аутентифицирующие пользователи могли использовать открытый ключ владельца.

Как браузеры распознают подлинность приложения или веб-сайта с помощью сертификатов?

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

На рисунке ниже показаны данные сертификата для примера веб-сайта http://abcgen.uk. Приведенный ниже сертификат гарантирует клиенту, что подлинность владельца была проверена и цифровой сертификат был выдан компании ABCGen Idiotechie plc с общим именем www.abcgen.uk.

Примечание. В целях безопасности мы не использовали ссылки на действующий веб-сайт. Пример, используемый в этой статье, предназначен только для иллюстративных и учебных целей. В этом примере показано, что сертификат выдан Verisign как класс 3, что означает, что Verisign выполнил независимую проверку и проверку владельца. Это не определенный стандарт PKI. Следующее поле обозначает действительность этих сертификатов. Отпечатки пальцев обозначают открытый ключ, но в закодированном формате. Данные хэшируются с использованием криптографических хеш-функций SHA1 и MD5.

Пример сертификата

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

Иерархия сертификатов

Надеюсь, что у всех есть концепция. Теперь давайте попробуем немного кодирования.

Используемые продукты:

  • IDE: Netbeans 7.2
  • Java Development Kit (JDK): версия 6
  • Сервер Glassfish: 3.1
  • Механизм аутентификации: аутентификация на основе форм
  • Сервер аутентификации: LDAP OpenDS v2.2

Задача:

Создайте SSL-соединение между веб-сервером и клиентом.

Шаг 1:

Создайте сертификат сервера на сервере Glassfish
Откройте командную строку в windows -> Перейдите в каталог {domain_dir} / config, где {domain_dir} обозначает путь к домену Glassfish.
например, C: \ NetBeans \ 7.2 \ config \ GF3 \ domain1 \ config>

Шаг 2:

Мы будем использовать команду keytool для генерации сертификатов. Keytool — это утилита управления ключами и сертификатами, предоставляемая Java SE 6.
Запустите команду keytool следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
>keytool -genkey -alias server-alias -keyalg RSA -keypass changeit -storepass changeit -ke
ystore keystore.jks
The command will ask for the following details:
What is your first and last name?
[Unknown]:  localhost  <<For testing purposes we need to use localhost since it maps to the application server hostname. Ideally in production environments this field should include application server’s name.>>
What is the name of your organizational unit?
[Unknown]:  idiotechie
What is the name of your organization?
[Unknown]:  idiotechie
What is the name of your City or Locality?
[Unknown]:  edinburgh
What is the name of your State or Province?
[Unknown]:  EDN
What is the two-letter country code for this unit?
[Unknown]:  GB
Is CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB correct?
[no]:  YES

Шаг 3:

Экспортируйте сгенерированный сертификат в файл server.cer.

1
2
3
>keytool -export -alias server-alias -storepass changeit -file server.cer -keystore keysto
re.jks
Certificate stored in file <server.cer>

Шаг 4:

Добавьте сертификат в файл хранилища доверенных сертификатов.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
>keytool -import -v -trustcacerts -alias server-alias -file server.cer -keystore cacerts.j
ks -keypass changeit -storepass changeit
Owner: CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB
Issuer: CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB
Serial number: 519e7165
Valid from: Thu May 23 20:43:33 BST 2013 until: Wed Aug 21 20:43:33 BST 2013
Certificate fingerprints:
MD5:  34:B7:71:CD:C9:56:9A:EA:0C:F2:91:50:EA:7F:4B:64
SHA1: AA:DE:EC:1B:27:8E:BC:3A:7A:82:8C:B7:FA:C3:AA:11:2F:97:1F:2C
Signature algorithm name: SHA1withRSA
Version: 3
Trust this certificate? [no]:  YES
Certificate was added to keystore
[Storing cacerts.jks]

Шаг 5:

Убедитесь, что сертификат был успешно добавлен в хранилище ключей.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
>keytool -list -v -keystore keystore.jks
Enter keystore password:
Alias name: server-alias
Creation date: 23-May-2013
Entry type: PrivateKeyEntry
Certificate chain length: 1
Certificate[1]:
Owner: CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB
Issuer: CN=localhost, OU=idiotechie, O=idiotechie, L=edinburgh, ST=EDN, C=GB
Serial number: 519e7165
Valid from: Thu May 23 20:43:33 BST 2013 until: Wed Aug 21 20:43:33 BST 2013
Certificate fingerprints:
MD5:  34:B7:71:CD:C9:56:9A:EA:0C:F2:91:50:EA:7F:4B:64
SHA1: AA:DE:EC:1B:27:8E:BC:3A:7A:82:8C:B7:FA:C3:AA:11:2F:97:1F:2C
Signature algorithm name: SHA1withRSA
Version: 3

Шаг 6:

Проверьте, был ли сертификат успешно добавлен в хранилище доверенных сертификатов.

1
2
3
4
5
>keytool -list -keystore cacerts.jks
Enter keystore password:
 
server-alias, 23-May-2013, trustedCertEntry,
Certificate fingerprint (MD5): 34:B7:71:CD:C9:56:9A:EA:0C:F2:91:50:EA:7F:4B:64

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

Шаг 7:

С точки зрения конфигурации сервера перейдем к консоли администратора сервера.
Затем нажмите Конфигурации -> Настройка сервера -> Служба HTTP -> http-listeners-2.
Http-Listeners-2 обозначает защищенный порт HTTPS 8181.
Перейдите на вкладку SSL и измените псевдоним сертификата на «псевдоним сервера» в соответствии с сертификатом, который мы создали выше.

Настройки SSL сервера приложений

Шаг 8:

Перезагрузите сервер.

Итак, все настройки, связанные с сервером, теперь выполнены.

Давайте перейдем к коду приложения.
Мы будем использовать тот же код приложения, что и для http://idiotechie.com/secure-web-application-in-java-ee6-using-ldap/.

Единственное требуемое изменение — это файл web.xml, в котором гарантия транспорта будет изменена с нулевой на конфиденциальную.

1
2
3
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

КОНФИДЕНЦИАЛЬНЫЙ режим защиты используется, когда приложение хочет запретить другим объектам просматривать содержимое передачи.

Создайте, разверните и запустите приложение.

Теперь, даже если вы попытаетесь ввести URL-адрес http: // localhost: 9999 / SampleWebApp / index.jsp, сервер перенаправит пользователей на защищенное HTTPS-соединение через https: // localhost: 8181 / SampleWebApp / index.jsp . Поскольку сертификат, созданный сервером, является самозаверяющим, а не сертификатом от CA, браузеры выдают предупреждающее сообщение, уведомляющее о том, что сертификат безопасности веб-сайта нельзя доверять. Это связано с тем, что хранилище доверенных сертификатов браузера не содержит этих сертификатов.

Защищенное приложение

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

Детали сертификата Localhost

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

Скачать образец кода ниже: