пятница, 2 марта 2012 г.

Генерация запроса на сертификат и загрузка сертификата в JKS

Волею судеб на новой работе приходится возиться с большим количеством криптографии, так что пришлось в ней разобраться. При этом я ни разу не претендую на титул эксперта, но некоторые вещи опишу здесь, чтобы было.
Опуская цели и принципы криптографии, остановлюсь на некоторых, полезных с точки зрения пользователя, деталях.
  • Генерация запроса на сертификат

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

 
$openssl req -out request.csr -new -newkey rsa:2048 -utf8 -keyout private.key

Доментация на команду openssl req
подробнее относительно опций:
  • -utf8 означает, что аттрибуты будут храниться как utf8 строки, что необходимо, если используются русские буквы, иначе в запросе получите кракозябры.
  • -new генерирует новый запрос на сертификат, с запросом всех полей.
  • -newkey rsa:2048 генерируется новый RSA ключ длиной 2048 бит.
  • запрос записывается в файл request.csr, приватный ключ сохраняется в файл private.key

Полученный запрос (request.csr) отравляется в центр сертификации (Certificate Authority, CA), который через некоторое время присылает сертификат. Обычно сертификат присылается на email, указанным при генерации запроса на сертификат. Ни в коем случае не нужно отправлять приватный ключ в центр сертификации, если вы это сделаете, ключ будет считаться скомпрометированным и придется повторять процесс заново.
  • Импорт сертификата в JKS хранилище.

Для успешного импорта нужно следующее: приватный ключ, личный (клиентский) сертификат, и сертификат центра сертификации. Обычно приватный ключ имеет расширение pem, key или der и слово private в названии файла. Если ключ в формате PEM, то проверить, что это приватный ключ, можно в любом текстовом редакторе. Приватный ключ должен начинаться со строк -----BEGIN ENCRYPTED PRIVATE KEY----- или -----BEGIN PRIVATE KEY-----
Клиентский сертификат обычно имеет расширение pem, der или crt. Сертификат центра сертификации имеет расширение pem, der или crt и обычно содержит в имени файла слово CA.
Просмотреть содержимое сертификата можно командой
$keytool -printcert -v -file cert.pem
Существуют определенные сложности с импортом только приватного ключа в jks хранилище хранилище посредством keytool, поэтому импорт производится в два этапа, на первом создается хранилище в формате PKCS#12, в которое помещаются приватный ключ и цепочка сертификатов, и потом это хранилище конвертируется в формат jks. При задании пароля на хранилище рекомендуется указать тот же пароль, что и и на приватный ключ.

$openssl pkcs12 -export -out store.pfx -inkey private.key -in clientcert.pem -certfile CAcert.pem
$keytool -importkeystore -destkeystore store.jks -srckeystore store.pfx -srcstoretype PKCS12

Доментация на команду openssl pkcs12
После конвертации можно поменять пользовательское имя (alias) у клиентского сертификата, по умолчанию он будет иметь имя "1".
Посмотреть, что же получилось, можно приведенной ниже командой.
 
$keytool -v -list -keystore store.jks
Альтернативным способом проверки будет загрузка полученного на предыдущем шаге файла store.pfx в IE и открытие в нем сайта, с которым необходимо осуществлять защищенное соединение.
Обычно требуется также добавить сертификат центра сертификации в cacerts, если сертификат сервера, на который производится соединение, выдан тем же CA (а обычно это так), сделать это можно командой

 
$keytool -import -trustcacerts -alias write_alias_here -file CAcert.pem -keystore cacerts

Полученное хранилище можно использовать для организации защищенного соединения с удаленным хостом.

Комментариев нет:

Отправить комментарий