On 2015-11-25, Artem Chuprina wrote: > OG> without:: > > OG> $ lftp -e 'set ssl:verify-certificate no' ftp://u...@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=i...@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!