Я пытаюсь получить сертификаты, которые подходят для наших внутренних развертываний 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?
Я понимаю, что этот вопрос довольно старый, но для тех, кто может найти его полезным, я упомяну, что для меня работает:
-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