Re: proftpd + inetd + ssl/tls и другие вопросы.
On 2015-11-25, Artem Chuprina wrote:
> OG> without::
>
> OG> $ lftp -e 'set ssl:verify-certificate no' ftp://user@myvps.com
>
> OG> Note that ftp:// URL domain name SHOULD match certificate CN name or you get error::
>
> OG> Fatal error: Certificate verification: certificate common name doesn't match
> OG> requested host name ‘myvps.com’
>
> Тут есть еще такая штука, как X509v3 Subject Alternative Name. У меня, например,
>
> X509v3 Subject Alternative Name:
> DNS:nest.lasgalen.net, DNS:jabber.lasgalen.net, DNS:mail.lasgalen.net
>
> В конфиге это задается
>
> subjectAltName=DNS:nest.lasgalen.net,DNS:jabber.lasgalen.net,DNS:mail.lasgalen.net
>
Я помучился что бы получить widlcard в имени домена:
$ openssl req -sha256 -days 1000 -nodes -newkey rsa:4096 -extensions v3_req -subj "/C=UA/ST=User/L=City/O=Corp/OU=SubCorp/CN=myvps.com/emailAddress=info@myvps.com" \
-reqexts SAN -config <( cat /etc/ssl/openssl.cnf; echo "[SAN]"; echo "subjectAltName = email:copy,DNS:*.myvps.com,DNS:myvps.com" ) \
-keyout http-server-key.pem -out http-server-cert.csr
Для переноса subjectAltName при подписывании нужно добавить немножко в файл
настроек::
[ ca ]
default_ca = CA_default
[ CA_default ]
new_certs_dir = .
database = index.txt
serial = serial.txt
default_md = default
policy = policy_anything
certificatePolicies = policy_anything
x509_extensions = usr_cert
copy_extensions = copy # <== trick to move subjectAltName unchanged or "openssl ca" strip any x509 v3 extensions
[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
# subjectAltName = supplied
[ usr_cert ]
basicConstraints=CA:FALSE
nsCertType = server
Подпись выполняется той же последовательностью:
$ openssl ca -days 1000 -config openssl.cnf -cert ca-root-cert.pem -keyfile ca-root-key.pem -out http-server-cert.pem -in http-server-cert.csr
Пробовал задавать патерны DNS: через переменную окружения, добавив настройку в
блок "[usr_cert]":
subjectAltName=${ENV::sanvar}
Но по:
$ env sanvar='DNS=myvps.com' openssl ca -days 1000 -config openssl.cnf -cert ca-root-cert.pem -keyfile ca-root-key.pem -out http-server-cert.pem -in http-server-cert.csr
получал ошибку:
Error Loading extension section usr_cert
139621097580176:error:0E06D06C:configuration file routines:NCONF_get_string:no value:conf_lib.c:324:group=CA_default name=email_in_dn
139621097580176:error:2207507C:X509 V3 routines:v2i_GENERAL_NAME_ex:missing value:v3_alt.c:531:
139621097580176:error:22098080:X509 V3 routines:X509V3_EXT_nconf:error in extension:v3_conf.c:95:name=subjectAltName, value=DNS=myvps.com
Эксперименты показали что такая запись работает:
subjectAltName = email:copy,DNS:${ENV::sanvar}
Я полагаю что подстановка выполняется после парсинга файла и вводить
синтаксическую структуру через подстановку переменной - нельзя. Хотя в блогах
есть примеры, в которых приводится указанная конструкция - т.е. это зависит от
версии openssl.
Но т.к. заранее не знаешь число DNS: параметров - лучше работать через трюк с
"<(...)" в Bash.
Я хотел добится того что openssl.cnf был неизменямым и домены/адреса
поставлялись через аргументы.
Сформированый подписаный сертификат позволил открывать страницы myvps.com и
blog.myvps.com без ругани о недоверенном сертификате (при условии что
ca-root-cert.pem проимпортирован как доверенный).
> Сколь я помню, при наличии subjectAltName CN игнорируется (в смысле,
> если имя хоста совпадает с CN, но отсутствует в subjectAltName,
> сертификат считается непригодным для этого хоста).
>
Вроде так и есть:
http://wiki.cacert.org/FAQ/subjectAltName
subjectAltName must always be used (RFC 2818 4.2.1.7, 1. paragraph). CN is
only evaluated if subjectAltName is not present and only for compatibility
with old, non-compliant software. So if you set subjectAltName, you have to
use it for all host names, email addresses, etc., not just the "additional"
ones.
http://stackoverflow.com/a/5937270/173149
RFC 5280, section 4.1.2.6 says "The subject name MAY be carried in the
subject field and/or the subjectAltName extension". This means that the
domain name must be checked against both SubjectAltName extension and
Subject property (namely it's common name parameter) of the certificate.
These two places complement each other, and not duplicate it. And
SubjectAltName is a proper place to put additional names, such as
www.domain.com or www2.domain.com
Update: as per RFC 6125, published in '2011 the validator must check SAN
first, and if SAN exists, then CN should not be checked. Note, that the RFC
6125 is relatively recent and there still exist certificates and CAs that
issue certificates, which include the "main" domain name in CN and
alternative domain names in SAN. I.e. by excluding CN from validation if SAN
is present, you can deny some otherwise valid certificate.
--
Best regards!
Reply to: