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, который является FQDN.
Когда у меня есть несколько ext
Заявления он просто использует последний, и я пытался натянуть несколько DNS:foo
под одним ext
записи вместе с различными пунктуацией.
Еще один аспект, с которым я столкнулся, - настроить веб-сервер для выполнения 301 с полным доменным именем. Я тоже в порядке с этим, но я застрял с Tomcat, поэтому "переключиться на Apache/nginx" не будет работать для меня. Кажется, это единственная документация, с которой я столкнулся, чтобы сделать что-то подобное с Tomcat, но ему уже 3 года, и для меня это конец дня. Они добавили эту функциональность в Tomcat6?
3 ответа
Я понимаю, что этот вопрос довольно старый, но для тех, кто может найти его полезным, я упомяну, что работает для меня:
- используйте 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