[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: