Могу ли я использовать один SSLCertificateFile для всех моих виртуальных хостов вместо создания одного из них для каждого виртуального хоста? - PullRequest
2 голосов
/ 04 января 2011

У меня есть много виртуальных хостов Apache, для каждого из которых я использую выделенный файл SSLCertificateFile.

Это пример конфигурации VirtualHost:

<VirtualHost *:443>

     ServerName subdomain.domain.localhost

     DocumentRoot "/Users/<my_user_name>/Sites/users/public"
     RackEnv development

   <Directory "/Users/<my_user_name>/Sites/users/publ`enter code here`ic">
     Order allow,deny
     Allow from all
   </Directory>

    # SSL Configuration
    SSLEngine on

    #Self Signed certificates
    SSLCertificateFile /private/etc/apache2/ssl/server.crt
    SSLCertificateKeyFile /private/etc/apache2/ssl/server.key
    SSLCertificateChainFile /private/etc/apache2/ssl/ca.crt

</VirtualHost>

Поскольку я поддерживаю больше приложений Ruby on Rails, используя Панель предпочтений пассажира , это частьapache2 httpd.conf file:

<IfModule passenger_module>
  NameVirtualHost *:80
  <VirtualHost *:80>
    ServerName _default_
  </VirtualHost>
  Include /private/etc/apache2/passenger_pane_vhosts/*.conf
</IfModule>

Могу ли я использовать один SSLCertificateFile для всех моих VirtualHosts (я слышал о подстановочных знаках) вместо создания одного из них для каждого VirtualHost? Если так, как я могу изменить файлы, перечисленные выше?

Ответы [ 2 ]

3 голосов
/ 04 января 2011

Итак, вам нужно решить две вещи; как получить сертификат (pub / priv), который работает для всех ваших хостов, а затем - как организовать vHosts и использование стратегических включений. (Я игнорирую опцию SNI здесь - прочитайте об этом, хотя).

Для первого - у вас примерно три варианта - сертификат с подстановочными знаками (т.е. * .foo.bar.com), сертификат с несколькими CN в DN (например, CN = foo.com, CN = bar.com, L = London .. ") или сертификат с 1 или более альтернативными именами субъекта, содержащими DNS-имена (http://playnice.ly/blog/2011/01/03/multi-domain-ucc-ssl-certificates-on-nginx-with-1-ip-address/). Последние два хороши, когда у вас есть всего несколько vhosts (но они могут иметь любое имя; поэтому без подстановочных знаков) Хотя подстановочный знак является единственным вариантом, когда у вас есть от 10 до 100 доменов, но недостатком является то, что у них должно быть похожее конечное имя (хотя вы будете удивлены, насколько «легко» получить * .com, выданный авария).

Если у вас есть один из этих зверей - просто включите его на уровне сервера.

Итак, в следующий раз, как соединить что-то оттуда - вам нужна та же настройка, что и для хоста SNI (см. Документы или http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI).

Чтобы упростить вашу жизнь - вы можете рассмотреть возможность использования фрагментов 'include' - или, в худшем случае, сгенерировать конфигурацию с помощью небольшого сценария оболочки (или сделать все возможное - вы можете включить perl и вывод, который он генерирует 'фактически', на муха!).

Dw.

2 голосов
/ 22 марта 2012
#!/bin/bash

clear

path="$HOME/Desktop"
days=""

echo -ne "Hello. You must be hoping to create a SSL/TLS security certificate (and key).\n\nBy default, this key will be self-signed. However, you can decide instead to\ncreate an un-signed certificate request (.pem) file to be signed by a\nrecognized certificate authority.\n\nPlease choose from the following options.\n\n s: create a self-signed certificate .crt file (default)\n u: create an un-signed certificate request .pem file\n q: quit\n> "
read go

if [ "$go" = "u" ]; then

  echo -ne "What is your country code?\n> "
  read c
  echo -ne "What is your state/province?\n> "
  read st
  echo -ne "What is your city?\n> "
  read l
  echo -ne "What is your organization name?\n> "
  read o

elif [ "$go" = "q" ]; then

  echo -e "\nHave a nice day."
  exit 0

fi

echo -ne "What is your domain name?\n> "
read domain

if [ -z "$domain" ]; then
  echo "No domain was given."
  exit 0
fi

echo -ne "What is the path where your certificate files should be saved?\n> "
read path
echo -ne "For how many days will your certificate be valid?\n> "
read days

if [ -z "$path" ]; then path="."; fi
if [ -z "$c" ]; then c="US"; fi
if [ -z "$st" ]; then st="Arizona"; fi
if [ -z "$l" ]; then l="Phoenix"; fi
if [ -z "$o" ]; then o="PLUG"; fi
if [ -z "$days" ]; then days="365"; fi

if [ -d "$path" ]; then
  echo -ne "\nCreating your certificate ..."
  if [ "$go" = "u" ]; then
    (echo -e "oid_section = new_oids\n[ new_oids ]\n[ req ]\ndefault_days = $days\ndefault_keyfile = $path/$domain.key\ndistinguished_name = req_distinguished_name\nencrypt_key = no\nstring_mask = nombstr\nreq_extensions = v3_req\n[ req_distinguished_name ]\ncommonName = Common Name (eg, YOUR name)\ncommonName_default = $domain\ncommonName_max = 64\n[ v3_req ]\nsubjectAltName=DNS:$domain,DNS:*.$domain" > deleteme.cfg) &> /dev/null;
    (openssl req -batch -config deleteme.cfg -newkey rsa:2048 -out $path/$domain.pem) &> /dev/null;
    (rm deleteme.cfg) &> /dev/null;
  else
    (echo -e "subjectAltName=DNS:$domain,DNS:*.$domain" > deleteme.cfg) &> /dev/null;
    (openssl genrsa -out $path/$domain.key 2048) &> /dev/null;
    (openssl req -new -key $path/$domain.key -subj "/C=$c/ST=$st/L=$l/O=$o/CN=$domain" -out deleteme.csr) &> /dev/null;
    (openssl x509 -req -in deleteme.csr -signkey $path/$domain.key -days $days -text -extfile deleteme.cfg -out $path/$domain.crt) &> /dev/null;
    (rm deleteme.cfg deleteme.csr) &> /dev/null;
  fi
  (chmod 400 $path/$domain.key) &> /dev/null;
  echo " done."
else
  echo "No such directory exists."
fi

echo -e "\nHave a nice day."

Это скрипт bash - так что вы можете сохранить его в файл (назовите его как угодно) на вашем BSD / Linux / Mac / UNIX / и т. Д. компьютер, где вы хотите. Затем вы открываете терминал и делаете что-то вроде этого:

$ cd wherever
$ chmod +x whatever
$ ./whatever

И тогда вы будете следовать инструкциям. Он скажет: «Вы хотите самозаверяющий сертификат или запрос сертификата, который может подписать кто-то другой?», А затем он скажет «Каково ваше доменное имя?» и «когда это истечет?» и т. д.

Когда это будет сделано, у вас будет два файла. У вас будет файл .key, защищенный от записи и содержащий ваш закрытый ключ. И у вас будет файл .crt, который содержит самозаверяющий сертификат, или файл .pem, который содержит не подписанный запрос сертификата. Сценарий позволит вам указать, где вы хотите сохранить файлы.

Если вы планируете использовать самозаверяющий сертификат, все готово. Идите вперед и настройте свой виртуальный хост на своем сервере (как вы, кажется, уже сделали). Если вы планируете использовать сторонние права подписи (например, Verisign и т. Д.), Вам нужно будет отправить им ваш файл .pem, и они ответят, отправив вам подписанный файл .crt.

...