Сертификаты
Сертификаты позиционируются как “Удостоверения сервера”, то есть такие данные, которые позволяют однозначно аутентифицировать сервер и быть уверенным, что нас не перенаправили на фейковый сервер. Например, с целью получить какие-то приватные данные, типа номера кредитки.
Однако, сертификаты нам нужны для еще одной, более прозаической цели - шифрования трафика. То есть для того, чтобы наши данные проходили по сети в зашифрованном виде и никто не мог их снять, например, с промежуточного свитча, и, прогнав, например, через wireshark, получить наши коды, пароли и явки (и номера кредиток, в том числе).
Сгенерировать первый сертификат для сервера просто:
Сперва создаем запрос на подписание сертификата центром сертификации, таким например, как
www.sslforfree.com или
www.cacert.org :
cd /etc/ssl/; openssl req -out CSR.csr -new -newkey rsa:2048 -nodes -keyout privateKey.key
В результате мы получаем два файла:
privateKey.key
- собственно закрытый ключ сервера, его мы никому не показываем и храним в безопасном месте (типа
/etc/ssl/
); второй -
CSR.csr
- это certificate Signing request, его мы скармливаем сайту
www.sslforfree.com (или cacert.org, кому что больше нравится)
На том же сайте получаем готовый серификат: на cacert.org и sslforfree.com - почти сразу, а на startssl.com - через некоторое время.
Продлить сертификат
Сертификаты не продлеваются, но можно получть новый сертификат на тот же ключ и с теми же данными:
cd /etc/ssl/; rm CSR.csr; openssl req -out CSR.csr -key privateKey.key -new
На том же cacert.org или startssl.com в окно CSR втыкаем новый запрос и получаем сертификат
Сертификат или CSR для нескольких доменов сразу
Эти “дополнительные” домены лучше всего задавать сразу в конфиге OpenSSL (можно в дополнительном файле, его все равно надо особо указывать openssl-ю).
Делаем файлик:
- multidomain.cnf
[ v3_req ]
subjectAltName = @alt_names
[alt_names]
DNS.1 = chroot.ru
DNS.2 = mail.chroot.ru
DNS.3 = www.chroot.ru
DNS.4 = dr.chroot.ru
После этого генерим CSR, в который включен данный конфиг:
openssl req -out OurCertRequest.csr -key OurKey.key -new -config /etc/openssl/multidomain.cnf
Самоподписной сертификат
Если кроме одного - двух человек, которым пофиг, что сертификат никем не гарантирован, на ваш сайт никто заходить не будет, то можно слепить самоподписной сертификат:
openssl x509 -x509toreq -in certificate.crt -out CSR.csr -signkey privateKey.key
Я предпочитаю сделать это тремя более простыми командами, т.к. их легче запомнить:
openssl genrsa -out cert.key 2048
openssl req -new -key cert.key -out cert.csr
openssl x509 -req -days 1100 -in cert.csr -signkey cert.key -out cert.crt
Openssl create self-signed cert
Java-Cert
Java-программы используют контейнер типв keystore для хранения ключа и сертификата.
Контейнер с самоподписным сертификатом лепится так:
keytool -genkey -v -alias ourdomain -keyalg RSA -validity 3650 -keysize 2048 \
-keystore ourdomaincert.jks -storepass [My strong password] -keypass [SAME strong password]
Но позже нам начинает хотеться использовать честный серт.
И возможно, мы, вместо того, чтобы создать этот контейнер из честного сертификата с нуля, запросили серт через csr
keytool -certreq -alias mydomain -keystore keystore.jks -file mydomain.csr
Теперь придется мудрить.
Конвертируем jks в PKCS12:
keytool -importkeystore -srckeystore ourdomaincert.jks -destkeystore ourdomaincert.p12 -deststoretype PKCS12
Вытаскиваем приватный ключ из PKCS12:
openssl pkcs12 -in ourdomaincert.p12 -out ourdomain.key -nodes -nocerts
Складываем из приватного ключа и полученного честного серта новый “честный” PKCS12:
openssl pkcs12 -export -name ourdomain -in ourdomain_signed.crt -inkey ourdomain.key -certfile CACert_bundle.crt -out ourdomaincert_signed.p12
Конвертируем PKCS12 в jks:
keytool -importkeystore -destkeystore ourdomaincert_signed.jks -srckeystore ourdomaincert_signed.p12 -srcstoretype pkcs12 -alias ourdomain
В новый JKS можно (и нужно) до кучи воткнуть честные рутовые серты от издателя нашего “честного” серта (я втыкал их CACert_bundle.crt на этапе создания p12):
keytool -import -trustcacerts -alias root -file Thawte.crt -keystore keystore.jks
Другие команды openssl