Apache,Http与Https 的配置
Apache开启SSL的方法:修改httpd.conf文件
Apache一般有2个版本下载,一个是带SSL模块的,一个是不带SSL的,请首先检查自己的SSL是包含了SSL模块的,否则就没法做了。 Apache的参数配置都在httpd.conf文件中,SSL配置也是如此,此外还可以通过include httpd-ssl.conf来包含一个专门配置SSL的配置文件,如果激活了httpd-include ssl.conf,则可以打开httpd-ssl.conf来配置相应参数。
一般,我们直接在httpd.conf文件中直接配置SSL参数:
#加载模块mod_ssl.so,此模块是启用SSL功能必须的。
LoadModule ssl_module modules/mod_ssl.so //静态编进apache内核的则不需要此段
#监听443端口
#建立一个SSL的虚拟站点,避免SSL配置影响原来HTTP的站点配置
<VirtualHost _default_:443>
DocumentRoot "C:/Program Files/Apache2/htdocs"
ServerName www.myssl.cn:443
SSLEngine on
#SSLCertificateFile /opt/apache2/conf/ssl.crt/server.crt#108行
SSLCertificateFile /opt/apache2/conf/ssl.key/server.crt
#SSLCertificateFile /opt/apache2/conf/ssl.crt/server-dsa.crt
SSLCertificateKeyFile /opt/apache2/conf/ssl.key/server.key #116行
#SSLCertificateKeyFile /opt/apache2/conf/ssl.key/server-dsa.key
#SSLCertificateChainFile "C:/SSL/chain.cer"
ErrorLog "C:/Program Files/Apache2/logs/error.log"
TransferLog "C:/Program Files/Apache2/logs/access.log"
</VirtualHost>
#说明主站是使用HTTP通信的,只有上面虚拟站点有SSL
SSLEngine off
配置参数说明如下(完整的SSL配置参数见这里):
* Listen 443:
SSL协议监听的端口,同下面 Virtualhost 中的端口需要匹配,SSL协议缺省使用443端口,也有使用8443的情况。
* SSLEngine on:
SSL功能打开,如果在Virtualhost 出现这句,则仅作用于虚拟机站点配置范围,这个虚拟机站点全部使用SSL通信,如果出现在Virtualhost外,则作用于全局,整个服务器都使用 SSL(HTTPS)通信,不能采用HTTP通信,所以通常都在Virtualhost中加这句。
* SSLCertificateFile:证书文件,server.crt
* SSLCertificateKeyFile:私钥文件,server.key
* SSLCertificateChainFile:证书链文件,GeoTrust证书除了EV以外,都是单根证书,都不需要配置这个参数,如果是EV
证书,则需要加入EV的证书链。
* Errorlog,TranksferLog:日志文件
* SSLEngine off:整个站点,除了虚拟站点外,关闭SSL,仍然支持HTTP通信
重新启动Apache
如果是在Linux下,输入:
apachectl stop
apachectl startsslServer a.test.com:443 (RSA)
Enter pass phrase://输入创建证书和密钥时的密码,正确输入后ssl就连同apache一起启动
在浏览器中输入:https://127.0.0.1
要求下载证书,OK~https建立就完成了
注意:可以去掉每次启动时要输入证书私钥的 pass phrase
#cp server1.keyserver1.key.secure
#/usr/bin/openssl rsa -in aserver1.key.secure-out server1.key
客户端证书认证
(1)基本客户证书认证强制客户对整个站点都必须采用客户证书认证的方式,可以在原来的配置下增加如下参数:
<VirtualHost _default_:443>
......
# 需要客户有一个客户端证书,并由ca.cer这个CA证书签署
SSLVerifyClient require
SSLVerifyDepth 1
SSLCACertificateFile conf/ssl.crt/ca.cer
</VirtualHost>
(2)如果只要求对特定目录采用客户证书认证方式,其他目录都不需要客户端证书,则可以采用如下配置:
<VirtualHost _default_:443>
......
# 需要客户有一个客户端证书,并由ca.cer这个CA证书签署
SSLVerifyClient none
SSLCACertificateFile conf/ssl.crt/ca.crt
<Location /secure/area>
SSLVerifyClient require
SSLVerifyDepth 1
</Location>
</VirtualHost>
强制HTTPS访问
强制HTTPS访问,主要通过将用户访问的HTTP请求自动转换为HTTPS请求,有两种方式:一种是通过编程的方式,详见:"强制用户通过SSL访问网站" ; 另一种方式则是通过Apache强大的Rewrite功能。如果要针对整个网站全部执行HTTP自动转为HTTPS的功能,可以在httpd.conf文件中,增加:
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)https://%{SERVER_NAME}$1
如果,仅要求对\secure目录下的内容强制采用HTTPS访问,可以在httpd.conf文件中加入如下语句:
<Directory "C:\Program Files\htdocs\secure">
RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)https://%{SERVER_NAME}/secure/$1
</Directory> 如何对来自Internet并要访问Intranet的客户强制采用强加密的HTTPS通信,并采用基本或者客户证书的认证方式?同时还要确保来自 Intranet的客户可以进行HTTP访问?
假设IntranetIP地址段是192.160.1.0/24,Intranet站点子区域的URL是/subarea ,则可以在HTTPS虚拟主机站点以外增加如下配置(这样可以同时作用于HTTPS和HTTP):
SSLCACertificateFile conf/ssl.crt/company-ca.crt
<Directory /usr/local/apache2/htdocs>
# subarea以外的区域只允许来自Intranet的访问
Order deny,allow
Deny from all
Allow from 192.168.1.0/24
</Directory>
<Directory /usr/local/apache2/htdocs/subarea>
# 在subarea以内,允许所有来自Intranet的访问,
# 但对来自Internet的访问,仅允许HTTPS+Strong-Cipher+Password
# 或者HTTPS+Strong-Cipher+Client-Certificate
# 如果使用了HTTPS,则确保使用高强度加密
# 同时允许客户以基本认证的形式认证
SSLVerifyClient optional
SSLVerifyDepth 1
SSLOptions +FakeBasicAuth +StrictRequire
SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128
# 强制来自Internet的客户使用HTTPS
RewriteEngine on
RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.+$
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)https://%{SERVER_NAME}$1
# 允许网络访问和基本认证
Satisfy any
# 控制网络访问
Order deny,allow
Deny from all
Allow 192.168.1.0/24
# HTTP基本认证
AuthType basic
AuthName "Protected Intranet Area"
AuthBasicProvider file
AuthUserFile conf/protected.passwd
Require valid-user
</Directory>
页:
[1]