我可以为所有VirtualHost使用单个SSLCertificateFile,而不是为每个VirtualHost创建其中一个吗?

时间:2011-01-04 15:29:12

标签: apache ssl passenger wildcard virtualhost

我有很多Apache VirtualHosts,每个都使用专用的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>

由于我使用Passenger Preference Pane维护更多Ruby on Rails应用程序,因此这是apache2 httpd.conf 文件的一部分:

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

我可以为我的所有VirtualHosts使用单个SSLCertificateFile(我听说过通配符)而不是为每个VirtualHost创建一个吗?如果是这样,我该如何更改上面列出的文件?< / p>

2 个答案:

答案 0 :(得分:3)

所以你要解决两件事;如何获得适用于所有主机的证书(pub / priv) - 接下来 - 如何安排vHosts以及战略包含的使用。 (我在这里忽略了SNI选项 - 尽管如此,请阅读。)

对于第一个 - 你大致有三个选项 - 通配符证书(即* .foo.bar.com),DN中有多个CN的证书(例如“CN = foo.com,CN = bar.com, L =伦敦..“)或包含1个或多个包含DNS名称的主题备用名称的证书(http://playnice.ly/blog/2011/01/03/multi-domain-ucc-ssl-certificates-on-nginx -with -1- IP地址/)。当你只有少数vhosts时,后两者很好(但它们可以有任何名称;所以没有通配符限制)。虽然通配符是你拥有10到100个域名的唯一选择 - 但缺点是他们必须有一个类似的叶子名称(尽管你会惊讶地发现因事故而发出的* .com很容易)。

一旦你拥有其中一个beass - 只需将它包含在服务器级别。

接下来就是如何从上面拼接东西 - 这里你需要的是与SNI主机相同的设置(参见docs或http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI)。

为了让您的生活更轻松 - 您可以考虑使用'include'代码段 - 或者,最糟糕的情况下,使用小型shell脚本生成配置(或全力以赴 - 您可以包含perl及其实际生成的输出'苍蝇!)。

DW传递。

答案 1 :(得分:2)

#!/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文件进行回复。