Назад | Перейти на главную страницу

Keytool ServerAlternateName

Я пытаюсь получить сертификаты, которые подходят для наших внутренних развертываний Jira / Confluence. Люди обращаются к ним по-разному, либо по имени хоста, либо по полному доменному имени. Я использую keytool Java 7, поэтому у меня есть доступ к функции альтернативного имени сервера:

-ext san=dns:jira

... и я вручаю ...

jira.example.com

... как CN при создании сертификата. Затем я генерирую запрос на подпись, передаю CSR нашей PKI Win2k8r2 для certreq чтобы подписать ключ и импортировать его обратно в хранилище ключей.

Теперь, когда я настроил его, как я сказал выше, мои браузеры (Chrome, Firefox, Safari), похоже, думают, что jira - единственное допустимое имя, хотя, когда я проверяю сертификат, CN показывает полное доменное имя.

Если я брошу ext он будет использовать CN, который является полным доменным именем.

Когда у меня несколько ext операторов он просто использует последний, и я попытался связать несколько DNS:foo под одним ext записи вместе с различной пунктуацией.

Еще один аспект, с которым я столкнулся, - это настроить веб-сервер для выполнения 301-го адреса FQDN. Я тоже в порядке, но я застрял с Tomcat, поэтому «переключиться на Apache / nginx» у меня не сработает. это кажется, это единственная документация, с которой я столкнулся, чтобы сделать что-то подобное с Tomcat, но ему 3 года, и для меня это конец дня. Добавили ли они эту функциональность в Tomcat6?

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

  • используйте CN, чтобы ввести какое-нибудь понятное для человека имя, например "наш крутой сервер JIRA" ;-)
  • введите сан вот так: -ext san=dns:jira,dns:jira.example.com

Кстати, вы также можете добавить IP-адреса, если хотите. Я лично использую на своем компьютере для разработки:

keytool -certreq ... -file server.csr -keystore server.keystore ... -ext san=dns:localhost,dns:myComputerName,ip:127.0.0.1,ip:::1

ПРИМЕЧАНИЕ: я использую java8 keytool; Надеюсь, это работает и в java7 keytool, но я его не тестировал

Чтобы убедиться, что в CSR встроены альтернативные имена субъектов SAN, воспользуйтесь программой keytool для печати CSR:

keytool -printcertreq -file test.csr

Если это сработало, вы получите что-то вроде:

#1: ObjectId: 2.5.29.17 Criticality=false
SubjectAlternativeName [
  DNSName: test.example.com
  DNSName: test
]

Примечание. Чтобы получить две записи, как указано выше (test.example.com и test), вам нужно было создать CSR, как указано в ответе «завтра» как «-ext san = dns: test.example.com, dns: test. ".

Не следуйте вводящей в заблуждение документации по keytool [{-ext ext} *], которая указывает, что в командной строке можно передать ноль или более записей "-ext":

-ext san=dns:test.example.com -ext san=dns:test

Это не сработает, вы получите только последнюю запись DNS расширения (san = dns: test).

Создавайте свои мультидоменные сертификаты с OpenSSL а не с keytool затем преобразуйте ключ и сертификат в хранилище ключей Java для использования с Tomcat. В следующем примере создается самозаверяющий сертификат, его должно быть достаточно легко адаптировать для «настоящего» сертификата.

Создайте openssl.cnf, следуя руководству по ссылке выше, затем выполните следующие команды:

# Generates a self-signed certificate + key, omit if you already have one
openssl req -config openssl.cnf -x509 -days 3650 -newkey rsa:2048 \
   -out self-signed-certificate.pem -keyout pub-sec-key.pem
# Remove passphrase from key
openssl rsa -in pub-sec-key.pem -out new.key
# Generate PKCS12 keystore
openssl pkcs12 -export -keypbe PBE-SHA1-3DES -certpbe PBE-SHA1-3DES \
   -export -in self-signed-certificate.pem -inkey new.key -name alias \
   -out keystore.p12
# Convert PKCS12 to JKS
keytool -importkeystore -destkeystore keystore.jks -deststoretype JKS \
   -srcstoretype PKCS12 -srckeystore keystore.p12

Обратите внимание на псевдоним ценность для -name в приведенном выше примере. Это имя сертификата, которому вы должны передать tomcat.

Для завершения я расскажу, как выдача сертификата с помощью SAN может работать с центром сертификации:

SAN                     = email:copy

...

[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName=${ENV::SAN}
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer

Выполните эту команду, чтобы сгенерировать ключ + CSR, содержащий SAN (непроверенные):

SAN="DNS: domain1.example.com, DNS: domain2.example.com" openssl req \
   -config /path/to/openssl.conf \
   -subj "/C=XX/ST=XX/L=xxx/O=My Org/OU=My OU/CN=main.example.com" \
   -newkey rsa:2048 -out file.csr -keyout out.key \
   -infiles /path/to/csr/file.csr

Выполните эту команду, чтобы выдать сертификат:

SAN="DNS: domain1.example.com, DNS: domain2.example.com" openssl ca \
   -config /path/to/openssl.conf -policy policy_anything \
   -subj "/C=XX/ST=XX/L=xxx/O=My Org/OU=My OU/CN=main.example.com" \
   -infiles /path/to/csr/file.csr

Для нескольких записей SAN правильная командная строка для keytool будет:

-ext san=dns:test.example.com,dns:test