I just learned yesterday again, what I knew a few years ago, but since had forgotten:
You cannot put multiple SSL-enabled virtual Apache hosts onto the same IP and port.
Apache cannot identify which VirtualHost to serve a request from because the payload is encrypted in its entirety. So a
Host: servertwo.tld
header cannot be parsed until the encryption has been removed. Which requires the key, which is listed in the VHost section that could not be identified in the first place...
So a name-based VirtualHost-configuration like this won't work:
Listen 443
NameVirtualHost *:443
<virtualhost>
SSLEngine On
ServerName serverone.tld:443
SSLCertificateFile /etc/apache2/ssl/serverone.crt
SSLCertificateKeyFile /etc/apache2/ssl/serverone.key
[...]
</virtualhost>
<virtualhost>
SSLEngine On
ServerName servertwo.tld:443
SSLCertificateFile /etc/apache2/ssl/servertwo.crt
SSLCertificateKeyFile /etc/apache2/ssl/servertwo.key
[...]
</virtualhost>
It will just serve any request out of the first VirtualHost (serverone.tld) regardless of the hostname in the request headers.
There is some light at the end of this tunnel though:
RFC4366 describes an optional field to the TLS (
Transport Layer Security) client request called "Server Name Indication" (SNI). With this the client just includes a list of ServerNames (usually one) that it's trying to contact. Apache can easily match the supplied name from the client against a ServerName (or ServerAlias) directive from it's configuration files.
SNI will be supported with
OpenSSL v0.9.9 in mod_ssl. Sometime in the future. There is a backport to v0.9.8 available from Steven Henson linked
here. Or you can use mod_gnutls as described by George Notaras in a recent
blog entry.
In either cases the above configuration snippet will "just work" once SNI is understood by Apache.
Currently Internet Explorer 7 (on Vista only, wanna upgrade

), Mozilla Firefox 2+, Opera 7.6+, KDE Konqueror 3.5+ support sending the SNI. You can test your browser at Kaspar Brand's
SNI testpage. He also has a patch available to make Apache 2.2 mod_ssl SNI capable when compiled against a CVS-version of OpenSSL.
I'm rather sure that spreading SNI capable hosts will also provide new hacking opportunities:
Let's assume a system serves both Intranet and Internet traffic. A client contacts the Internet IP with SSL but specifies the Intranet Hostname in it's TLS SNI entry. Guess what will happen? Yup.