13、脚本路径别名(CGI接口)

   CGI(Common Gateway Interface)是一个用于定Web服务器与外部程序之间通信方式的标准,使得外部程序能生成HTML、图像或者其他内容,而服务器处理的方式与那些非外部程序生成的HTML、图像或其他内容的处理方式是相同的。使用CGI的原因在于它是一个定义良好并被广泛支持的标准,没有CGI就不可能实现动态的Web页面,除非使用一些服务器中提供的特殊方法(如今,也有除CGI之外的其他技术逐渐在成为标准)。这里使用shell进行测试使用CGI生成动态内容,然而实际上由于shell在动态执行命令时为普通用户apache,若想执行root命令必须需要赋予相对应的权限,故及其不安全。在生产环境中还是使用专门的开发Web服务的编程语言php、jsp、python等。

   在配置文件中ScriptAlias也是用于URL路径的映射,但与Alias的不同在于,ScriptAlias是用于映射CGI程序的路径,这个路径下的文件都被定义为CGI程序,通过执行它们来获得结果,而非由服务器直接返回其内容。缺省情况下CGI程序使用cgi-bin目录作为虚拟路径。

[root@example.com ~]# vim /etc/httpd/conf/httpd.conf  //在配置文件中更改CGI路径
ScriptAlias /cgi-bin/ "/www/cgi-bin/"
[root@example.com ~]# cat /www/cgi-bin/test 
#!/bin/bash
cat << EOF
Content-Type: text/html

<pre>
The hostname is:`hostname`.
The time is:`date`.
</pre>

EOF
[root@example.com ~]# chmod +x /www/cgi-bin/test
[root@example.com ~]# service httpd reload

wKioL1XasDzj3W8XAACPFNg9F1U940.jpg

14.基于用户的访问控制

  httpd在使用验证时是基于虚拟用户来进行验证,不是系统用户,只是为了获取某种资源类型的一种虚拟的用户,验证的用户默认放在/etc/httpd/conf/.htpasswd文件中,下图为关于认证的过程。


wKiom1XarijyLBBiAAImcMtZni0147.jpg

应用举例,基于文件,做基本认证根据用户进行授权:

  • 编辑配置文件,为需要认证的目录配置认证机制

[root@example.com ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/www/htdoc/test">
        options None
        AllowOverride AuthConfig    使用认证配置
        AuthType Basic              使用基本认证
        AuthName "Please enter the account password"    质询时标题
        AuthUserFile "/etc/httpd/conf/.htpasswd"        密码的存放位置
        Require valid-user          可访问的用户
</Directory>
  • 使用htpasswd命令生成认证库

htpasswd常用选项:

      -c 创建密码,创建第一个用户时使用

      -m MD5格式存放

      -b 批量模式

      -D 删除用户

[root@example.com ~]# htpasswd -c -m /etc/httpd/conf/.htpasswd bols
New password: 
Re-type new password: 
Adding password for user bols
[root@example.com ~]# htpasswd  -m /etc/httpd/conf/.htpasswd long
New password: 
Re-type new password: 
Adding password for user long
  • 测试配置文件是否生效

[root@example.com ~]# cat /www/htdoc/test/user.html
<h1>/www/htdoc/test/:user file</h1>
[root@example.com ~]# service httpd reload

wKioL1XasD3COFmuAACvNxj_kMc049.jpg

wKiom1XarinCPVrvAAC7ckDMVSU667.jpg


15、虚拟主机的配置

   前面在浏览器测试httpd的配置文件是否生效时,我们是基于IP:端口进行通信的,但是只能当成一个中心主机使用,然而日常中一个物理服务器可以提供多个站点,为避免不必要的浪费在一个httpd配置文件中定义使用多个虚拟主机,同时在使用虚拟主机前先取消中心主机 ,不然虚拟主机无法使用。使用虚拟主机可分为以下三类:

  • 基于不同的IP实现不同的虚拟主机 (需要有等多个IP,公网IP有限不建议使用)  

  • 基于不同的port实现不同的虚拟主机(只需一个IP地址就行,但客户端需要手动输入端口,用户体验差不建议使用)

  • 基于不同主机名实现不同的虚拟主机(变化ServerName的值,使用方便符合需求)

        

举例通过请求报文中的HOST来实现不同的虚拟主机访问:

[root@example.com ~]# vim /etc/httpd/conf/httpd.conf
#DocumentRoot "/www/htdoc"     //注释此行
NameVirtualHost *:80    //取消此行的注释
<VirtualHost *:80>
    ServerName www.a.com
    DocumentRoot "/www/a.com/htdoc"
</VirtualHost>
<VirtualHost *:80>
    ServerName www.b.org
    DocumentRoot "/www/b.org/htdoc"
</VirtualHost>
<VirtualHost *:80>
    ServerName www.c.net
    DocumentRoot "/www/c.net/htdoc"
</VirtualHost>
[root@example.com ~]# mkdir /www/{a.com,b.org,c.net}/htdoc -p
[root@example.com ~]# cat /www/a.com/htdoc/index.html
<h1>www.a.com</h1>
[root@example.com ~]# cat /www/b.org/htdoc/index.html 
<h1>www.b.org<h1>
[root@example.com ~]# cat /www/c.net/htdoc/index.html
<h1>www.c.net<h1>


在windows系统的C:\Windows\System32\drivers\etc\hosts中添加如下内容:

192.168.1.8 a.com

192.168.1.8 b.org

192.168.1.8 c.net

在浏览器上通过输入主机名得到的结果可以说明虚拟主机配置成功。

wKioL1XasD3QHM9RAABwfx2Yu4k988.jpg

wKiom1XarinTVs7hAABvfJUKaIM285.jpg

wKiom1Xarv3yCn8BAABvUL-ehN4807.jpg

   通过上面的练习我们能配置好虚拟主机后,可以发现其功能相对单一,若想增加其功能我能可以使用配置中心主机的选项来定义虚拟主机,常用的有: 用户认证 、访问日志 、错误日志 、别名 、脚本别名等。这里就不做举例了。


16、https协议的安装及使用

  • HTTPS协议简介

   HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司(Netscape)进行,并内置于其浏览器Netscape Navigator中,提供了身份验证与加密通讯方法。现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

  • HTTPS的作用

   主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性,凡是使用了 https 的网站,都可以通过点击浏览器地址栏的锁头标志来查看网站认证之后的真实信息,也可以通过 CA 机构颁发的安全签章来查询  。

  • HTTPS与HTTP协议的区别

(1)https协议需要到ca申请证书,一般免费证书很少,需要交费。

(2)http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。

(3)http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

(4)http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。




wKiom1XariqQXIE0AAHhUfBmTaw188.jpg


  •  SSL握手要完成的工作 

         交换协议版本号 ;

         选择一个双方都支持的加密方式 ;

         对两端实现身份验证 ;

         密钥交换;

  • 客户端验证服务器端证书

          日期检查:证书是否在有效期内 ;

          证书颁发者的可信度;

          证书的签名检测;

          持有者的身份检测 ;

注意:SSL会话基于IP地址进行:不支持在基于主机名的虚拟主机上实现;


应用举例,基于mod_ssl模块实现对ssl的支持:

  • 准备好服务器的私钥和证书

[root@example.com ~]# cd /etc/pki/CA
[root@example.com CA]# (umask 077; openssl genrsa 2048 > private/cakey.pem)Generating RSA private key, 2048 bit long modulus
............................................................+++
...........+++
e is 65537 (0x10001)
[root@example.com ~]# vim /etc/pki/tls/openssl.cnf
[ req_distinguished_name ]
countryName                     = Country Name (2 letter code)
countryName_default             = CN   
countryName_min                 = 2
stateOrProvinceName             = State or Province Name (full name)
#stateOrProvinceName_default    = Default Province
stateOrProvinceName_default     = Henan
localityName                    = Locality Name (eg, city)
localityName_default    = Xinyang
0.organizationName              = Organization Name (eg, company)
0.organizationName_default      = Companyname
# we can do this but it is not needed normally :-)
#1.organizationName             = Second Organization Name (eg, company)
#1.organizationName_default     = World Wide Web Pty Ltd
organizationalUnitName          = Organizational Unit Name (eg, section)
#organizationalUnitName_default =
organizationalUnitName_default  = Linuxer
[root@example.com CA]# openssl req -new -x509 -key private/cakey.pem -days 3655 -out cacert.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [Henan]:
Locality Name (eg, city) [Xinyang]:
Organization Name (eg, company) [Companyname]:
Organizational Unit Name (eg, section) [Linuxer]:
Common Name (eg, your name or your server's hostname) []:ca.example.com
Email Address []:caadmin@example.com
[root@example.com CA]# touch index.txt serial crlnumber 
[root@example.com CA]# echo 01 > serial 
[root@example.com ~]# cd /etc/httpd/conf
[root@example.com conf]# mkdir ssl
[root@example.com conf]# cd ssl/
[root@example.com ssl]# (umask 077 ;openssl genrsa 2048 > httpd.key)
Generating RSA private key, 2048 bit long modulus
.................................+++
..............+++
e is 65537 (0x10001)
[root@example.com ssl]# openssl req -new -key httpd.key -out httpd.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [CN]:
State or Province Name (full name) [Henan]:
Locality Name (eg, city) [Xinyang]:
Organization Name (eg, company) [Companyname]:
Organizational Unit Name (eg, section) [Linuxer]:
Common Name (eg, your name or your server's hostname) []:www.example.com
Email Address []:webadmin@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@example.com ssl]# openssl ca -in httpd.csr -out httpd.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Aug  3 07:41:04 2015 GMT
            Not After : Aug  2 07:41:04 2016 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = Henan
            organizationName          = Companyname
            organizationalUnitName    = Linuxer
            commonName                = www.example.com
            emailAddress              = webadmin@example.com
        X509v3 extensions:
            X509v3 Basic Constraints: 
                CA:FALSE
            Netscape Comment: 
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier: 
                D7:C1:F8:CB:97:DE:B0:A3:EB:C0:1B:82:B5:5B:10:A0:CB:A1:5B:6D
            X509v3 Authority Key Identifier: 
                keyid:C4:67:DE:CF:AD:0B:94:03:C0:ED:5D:86:90:DE:36:B4:AE:DF:B1:2F

Certificate is to be certified until Aug  2 07:41:04 2016 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@example.com ssl]# ll
总用量 16
-rw-r--r-- 1 root root 4659 8月   3 15:41 httpd.crt
-rw-r--r-- 1 root root 1070 8月   3 15:38 httpd.csr
-rw------- 1 root root 1675 8月   3 15:36 httpd.key


  • 安装mod_ssl模块及SSL配置文件

[root@example.com ~]# yum install -y mod_ssl
[root@example.com ~]# vim /etc/httpd/conf.d/ssl.conf 
DocumentRoot "/var/www/html"       //取消注释
ServerName www.example.com:443     //取消注释    
SSLCertificateFile /etc/httpd/conf/ssl/httpd.crt     //更改为服务器证书路径
SSLCertificateKeyFile /etc/httpd/conf/ssl/httpd.key   //更改为服务器证书路径
[root@example.com ~]# cat /var/www/html/index.html
<h1>/var/www/html/:www.example.com</h1>

  在windows系统的C:\Windows\System32\drivers\etc\hosts文件中写入SSL所定义的主机名和IP:

192.168.1.8 www.example.com

  • 重启httpd服务

[root@example.com ~]# service httpd restart
[root@example.com ~]# ss -tunl |grep -E "80|443"
tcp    LISTEN     0      128                   :::443                  :::*     
tcp    LISTEN     0      128                   :::80                   :::*


   将linux系统的/etc/pki/CA/cacert.pem文件导入到windows系统中,并将cacert.pem文件名改为cacert.crt,在windows系统中点击此文件按提示将其安装到windows系统的受信任的根证书颁发机构中。

  • 浏览器进行测试

基于IP地址进行测试

wKioL1XasD_gasTHAAC7motV2sc202.jpg

wKiom1Xarivhi_MBAADFRR7SaMI816.jpg


基于命令行进行测试:

[root@example.com ~]# vim /etc/hosts  //添加解析地址
192.168.1.8 
[root@example.com ~]# openssl s_client -connect www.example.com:443 -CAfile /etc/pki/CA/cacert.pem 
***************************************
---
GET /index.html http/1.1
Host: www.example.com

HTTP/1.1 200 OK
Date: Mon, 03 Aug 2015 08:31:50 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Mon, 03 Aug 2015 07:49:31 GMT
ETag: "22f94-28-51c6368f30e15"
Accept-Ranges: bytes
Content-Length: 40
Connection: close
Content-Type: text/html; charset=UTF-8

<h1>/var/www/html/:www.example.com</h1>
closed


17、服务器status页面

        由于httpd有内生的status信息,并且此信息可以通过web页面予以显示,由于显示的信息不能让外人看见这里使用了用户认证的方式,或者使用基于IP认证的方式。下面就是如何进行配置其使用。

[root@example.com ~]# vim /etc/httpd/conf/httpd.conf   //由于此段已经注释需要取消注释
<Location /server-status>
    SetHandler server-status
    AuthType Basic
    AuthName "Server-Status"
    AuthUserFile "/etc/httpd/conf/.htpasswd"
    Require valid-user
    Order deny,allow
    Allow from all
</Location>
[root@example.com ~]# service httpd reload

wKioL1XasD-h92bxAAOgkypdTPA132.jpg