我有很多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>
答案 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文件进行回复。