很多地方都有免费的SSL证书,闲着没事,发挥折腾帝的功力搞了几个证书,现在用的Linux配置起来很简单,但万一以后放弃Linux的话,在Win上就会很郁闷。

在IIS 8(对应的系统是Windows Server 2012)以前的版本是不能一台服务器绑定多个证书的,网上流传的修改配置文件加入主机头的方法根本不行,不论windows 2003还是2008 R2都不行,除非用的是通配符证书,但那样依然没什么实际意义,能用的起通配证书的人也不至于非要挤死在一个节点上。

而且我证实了另一点,一台服务器上配置多个IP,每个SSL站点独立IP的方法依然不行!网上流传的都是人云亦云瞎扯淡!

在IIS 8以前的版本里面,IIS的核心文件http.sys本身就不支持一个端口多个证书,难道网上这些人比微软还了解IIS?反正我不信,只能借助外力了。

今天折腾了一天总算搞定了。想了一下,大概有至少2个方案,今天写方案一。

 

下面是方法:

大体思路是这样,首先我测试通过了不同端口可以使用不同证书,然后用一个能够在Windows上支持多SSL站点的反向代理服务器来构成一个前端,这样就ok了。这样的体系下来,能选择的很少了,squid目前比较稳定的for windows版本是很多年前的,而且据说对SSL支持比较鸡肋,我就没敢瞎忙活,然后nginx本身就不怎么样,for windows的版本很垃圾,目前我能想到的就是apache了。

但是这里我依然要吐槽!网上流传的windows+apache进行ssl反向代理的文章,几乎100%都是错的,按那些去搞永远无法运行,害得我白忙活了几个小时。

下面写一下我的配置吧。

我这用的是apache 2.4,官网那几个链接下载回来的,系统环境通过的是win 7和win 2008 R2,理论上win 2003也可以的(但是需要下载vc11以前的编译版本),懒的测试了,因为2003和2008需要搞不同的apache,因为用vc 2015编译的apache无法运行在2003上。

首先加载几个模块:

LoadModule ssl_module modules/mod_ssl.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so #我估计这一行没用,也懒的测试了,反正开着吧
LoadModule headers_module modules/mod_headers.so

Include conf/extra/httpd-ssl.conf

然后记得把Listen 80注释掉,因为只打算用apache来做个ssl代理,如果不关掉80的话,会跟iis冲突。

然后打开iis管理器,导入需要的证书,给每个站点绑一个不同的ssl端口,证书选择对应的。我这里old.tingtao.org绑的是102端口,www.tingtao.org绑的是103端口。

apache的虚拟主机配置:

#听涛 SSL
<VirtualHost *:443>
ServerName tingtao.org
ServerAlias old.tingtao.org

    SSLEngine on
    SSLCertificateFile c:\web\ca\old.tingtao.org\old.tingtao.org.crt
    SSLCertificateKeyFile c:\web\ca\old.tingtao.org\2_old.tingtao.org.key
    SSLCertificateChainFile c:\web\ca\old.tingtao.org\old.tingtao.org_ca.crt

RequestHeader set Front-End-Https "On"

<IfModule mod_ssl.c>
SSLProxyEngine On
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / https://127.0.0.1:102/
ProxyPassReverse / https://127.0.0.1:102/
</IfModule>

</VirtualHost>

#听涛 IT SSL
<VirtualHost *:443>
ServerName www.tingtao.org

    SSLEngine on
    SSLCertificateFile c:\web\ca\www.tingtao.org\www.tingtao.org.crt
    SSLCertificateKeyFile c:\web\ca\www.tingtao.org\2_www.tingtao.org.key
    SSLCertificateChainFile c:\web\ca\www.tingtao.org\www.tingtao.org_ca.crt

RequestHeader set Front-End-Https "On"

<IfModule mod_ssl.c>
SSLProxyEngine On
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / https://127.0.0.1:103/
ProxyPassReverse / https://127.0.0.1:103/
</IfModule>
</VirtualHost>

里面证书路径和端口什么的自己做对应修改就可以了。启动apache,一切就ok了。

 

补充:

很多朋友索要配置文件,干脆贴出来吧,其中有些模块什么的按道理说并不必须,但我有其他用途,所以没再测试了,下面的配置可以正常运行,但如果有些模块各位用不上的话,可以自行测试并屏蔽之:

虚拟主机的配置上文中已有,就不必再发了。

路径么,我这的apache目录是c:\service\apache,可能各位需要对应修改;我用的版本是2.4.x(小版本号忘记了),配置文件与32/64位无关,同时应该所有2.4这个大版本都可以用下面这个配置文件的。

源文件下载:httpd.conf httpd-vhosts.conf

去掉注释的httpd.conf :

ServerRoot "c:/Service/apache"
ServerTokens Prod
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule allowmethods_module modules/mod_allowmethods.so
LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule include_module modules/mod_include.so
LoadModule isapi_module modules/mod_isapi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule bw_module modules/mod_bw.so
<IfModule mod_watch.c>
<Location /watch-info>
        SetHandler watch-info
</Location>
<LocationMatch "^/~.+/watch-info$">
	SetHandler watch-info
</LocationMatch>

<Location /watch-list>
	SetHandler watch-list
</Location>
<Location /watch-table>
	SetHandler watch-table
</Location>

<Location /watch-flush>
        SetHandler watch-flush
</Location>
WatchStateDirectory C:/Service/apache/watch
</IfModule>
<IfModule unixd_module>
User daemon
Group daemon
</IfModule>
ServerAdmin admin@example.com
ServerName localhost
<Directory />
</Directory>
DocumentRoot "C:/Service/apache/htdocs"
<Directory "C:/Service/apache/htdocs">
    Options FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>
<IfModule dir_module>
    DirectoryIndex index.html index.htm index.php
</IfModule>
<Files ".ht*">
    Require all denied
</Files>
ErrorLog "logs/error.log"
LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access.log" common
</IfModule>

<IfModule alias_module>
    ScriptAlias /cgi-bin/ "C:/Service/apache/cgi-bin/"
</IfModule>

<IfModule cgid_module>
</IfModule>
<Directory "C:/Service/apache/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>
<IfModule mime_module>
    TypesConfig conf/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>
Include conf/extra/httpd-mpm.conf
Include conf/extra/httpd-vhosts.conf
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>
Include conf/extra/httpd-ssl.conf
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>

 

作者 听涛

《在Windows Server 2003/2008/2008 R2上配置多个站点SSL证书(一)》有14条评论
  1. 想问一下,为什么在windows server 2008 r2上安装了apache2.4,不引用Include conf/extra/httpd-ssl.conf就不会报错,一引用就无法启动apache,请问有什么需要修改的吗?

      1. 按你说的,很简单就实现,实际是不是还有很多基础配置?
        开启SSL之后就报下列错误,解决完下列错误又有其它错误,不知道是否有很多基础要配置?
        The Apache service named reported the following error:
        >>> SSLCertificateKeyFile: file 'C:/Apache24/conf/server.key' does not exist or is empty .

        1. 这个日志不完全,我估计后面说的是两种情况,要么这个证书文件不存在,要么证书文件错误。

          我好像有个印象,默认配置的那个ssl站点好像有几个选项要屏蔽掉。

          把我的给你,你照着修改吧。我记得是2.4.x的,理论上通用:
          http://dl.35bl.com/tmp/tmp_apache.rar
          临时文件,想起来就删了,从速下载.

          1. 包含默认站点和自己的虚拟主机站点

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注