【问题标题】:Can I use a single SSLCertificateFile for all my VirtualHosts instead of creating one of it for each VirtualHost?我可以为我的所有 VirtualHosts 使用一个 SSLCertificateFile,而不是为每个 VirtualHosts 创建一个 SSLCertificateFile 吗?
【发布时间】:2011-01-04 15:29:12
【问题描述】:

我有许多 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>

由于我正在使用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>

我可以为我的所有虚拟主机(我听说过通配符)使用一个 SSLCertificateFile,而不是为每个虚拟主机创建一个吗?如果可以,我该如何更改上面列出的文件?

【问题讨论】:

标签: apache ssl passenger wildcard virtualhost


【解决方案1】:

所以你有两件事要解决;如何获得适用于所有主机的证书(pub/priv) - 然后是下一步 - 如何安排 vHost 和战略包含的使用。 (我在这里忽略了 SNI 选项 - 不过请仔细阅读)。

对于第一个 - 您大致有三个选项 - 通配符证书(即 *.foo.bar.com),在 DN 中具有多个 CN 的证书(例如“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/)。当您只有少数虚拟主机时,后两者很好(但它们可以有任何名称;因此没有通配符限制)。虽然当您拥有 10 到 100 个域时,通配符是您唯一的选择 - 但缺点是它们必须具有相似的叶子名称(尽管您会惊讶地发现意外发布 *.com 是多么“容易” )。

一旦你拥有了其中之一 - 只需将其包含在服务器级别即可。

接下来是如何从那里拼接东西 - 你需要的是与 SNI 主机相同的设置(请参阅文档或http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI)。

为了让你的生活更轻松——你可以考虑使用“include”sn-ps——或者,最坏的情况是,用一个小的 shell 脚本生成配置(或者全力以赴——你可以包含 perl 及其“虚拟”生成的输出' 在飞行中!)。

Dw.

【讨论】:

  • +1,我只是添加一些关于 SNI 的内容,请注意,在浏览器支持上没有 IE6 和 ni IE7-XP。因此,如果您想使用 SNI,请谨慎使用它。
  • 是的 - 但上面不依赖 SNI - 它只是相同的配置结构。
  • 最后我可以获得所有子域的单一证书:我可以访问 https://subdomain.domain.localhost。现在,无论如何,我不能再访问 http://subdomain.domain.localhost 了!!!为什么? P.S.:在我的 Mac Os 上,访问“http: 版本”,我得到一个默认页面“您的网站”。 (与子域相关的文件位于 /Users//Sites 文件夹中)
  • 您需要检查您的错误日志(日志级别调试) - 并使用 -S 标志从命令行运行 httpd 以查看您的虚拟主机实际上是如何匹配的。我怀疑您有一些意外重叠或回退到 * 或默认顺序错误。
  • 最后一件事是如何工作的? Include /home/bla/my_vhost_config.cgi?当内容发生变化时,需要重新加载apache吗?
【解决方案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/etc 上的一个文件(随便命名)。电脑,随心所欲。然后你会打开一个终端并执行以下操作:

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

然后您将按照说明进行操作。它会说“你想要一个自签名证书还是其他人可以签名的证书请求?”,然后它会说“你的域名是什么?”和“这应该什么时候到期?”等等。

完成后,您将拥有两个文件。您将拥有一个写保护的 .key 文件,其中包含您的私钥。您将拥有一个包含自签名证书的 .crt 文件,或一个包含未签名证书请求的 .pem 文件。该脚本将让您指定文件的保存位置。

如果您打算使用自签名证书,那么您就完成了。继续并在您的服务器上设置您的虚拟主机(您似乎已经这样做了)。如果您计划使用第三方签名机构(即 Verisign 等),那么您必须将您的 .pem 文件发送给他们,他们会通过向您发送一个签名的 .crt 文件来响应。

【讨论】:

  • 不错的脚本。我没有意识到req 有一个-batch 选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 2020-01-10
相关资源
最近更新 更多