Windows下搭建HTTP/HTTPS服务器及测试过程

1 安装Apache

http://www.apachehaus.com/cgi-bin/download.plx

选择合适的版本下载

本次下载的是 Apache 2.4.x VC14

Apache版本号:httpd-2.4.25-x64

OpenSSL版本号:OpenSSL 1.0.2j

解压后按照readme_first.html文档中步骤进行测试和安装:

1)将解压后的Apache24文件夹复制到C:\

2)在命令行输入

cd C:\Apache24\bin

3)测试Apache安装条件是否满足

在命令行输入

httpd.exe

若无错误,在IE浏览器地址栏输入 http://localhost,若能正常打开网页说明Apache能正常安装;若报错,根据错误提示排除错误,直到可以正常运行httpd.exe并能访问http://localhost

4)开始安装

在命令行输入

httpd -k install

完成安装后没有图形操作界面,Apache所有操作都在命令行进入 C:\Apache24\bin目录后用命令完成的,详见后文。

2 Apache常用操作命令

安装Apache24后没有图形界面,需要在命令行操作,首先进入Apache bin目录

cd C:\Apache24\bin

常用命令:

httpd -k install /* 安装Apache /

httpd -k uninstall /
卸载Apache /

httpd -k start /
启动Apache /

httpd -k stop /
停止Apache /

httpd -k retart /
重启Apache */

3 制作CA证书、Server证书和Client证书

3.1 准备工作

在C:\Apache24\bin目录下创建demoCA目录,并在该目录下创建如下几个文件和文件夹

index.txt

newcerts\

serial

注:

serial文件没有文件后缀

用文本编辑器打开serial,并写入'01'(实际操作时不要加引号)

打开命令行,进入C:\Apache22\bin

cd C:\Apache22\bin

3.2 生成CA证书

1)生成CA私钥

openssl genrsa -out ca.key 2048

命令描述:

该命令会在当前目录下生成一个私钥文件ca.key

参数说明:

gensa:生成rsa密钥

-out:指定输出的文件名

2048:密钥长度

2)生成CA证书

openssl req -new -x509 -days 5000 -key ca.key -out ca.crt

命令描述:

该命令会在当前目录下生成一个自签名的CA证书文件ca.crt

参数说明:

req:请求操作

-new:生成新的文件

-x509:证书文件的格式

-days:证书有效期

-key:指定私钥文件

-out:指定输出文件

注:

由于CA文件是用来给其他证书签名文件签名以生成对应的证书文件的,不需要其他文件给CA证书签名,因此生成的CA证书是自签名的。

3.3 生成Server端证书

1)生成Server证书私钥

openssl genrsa -out server.key 2048

2)生成Server证书请求文件

openssl req -new -key server.key -out server.csr

命令描述:

该命令会在当前目录下生成一个证书请求文件server.csr,用CA证书给证书请求文件签名后即可生成证书文件。

参数说明:

req:请求操作

-new:生成新的文件

-key:指定私钥文件

-out:指定输出文件

运行该命令时,命令行会提示输入CountryName(填CN),ProvinceName和CommonName等。CommonName(公用名)是个很重要的参数,如果要在外网访问HTTP/HTTPS服务器,CommonName必须填服务器的域名或者公网IP;如果只在内网做测试,CommonName可以填服务器主机的内网IP。

注:

由于Server的证书请求文件需要被CA证书文件签名后才能生成证书文件,不能使用自签名,因此不使用-x509选项

3)生成Server证书

openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key

命令描述:

该命令使用CA证书对证书请求文件签名,以生成证书文件

参数说明:

ca:表示是对证书请求文件进行签名

-in:指定输入的证书请求文件

-out:指定输出文件

-cert:指定CA证书文件

-keyfile:指定CA私钥文件

4)验证Server证书

openssl verify -CAfile ca.crt server.crt

命令描述:

该命令用于验证生成的证书文件是否正确,若正确则输出OK,若错误则输出ERROR。

命令说明:

verify:表示是对证书文件进行认证

-CAfile:指定CA证书文件

3.4 生成Client端证书

1)生成Client私钥

openssl genrsa -out client.key 2048

2)生成Client证书请求文件

openssl req -new -key client.key -out client.csr

注意:

生成Client端证书请求文件时,ON(Organization Name)必须与生成服务器时使用的ON一样,并且OU(Organizational Unit Name)和CN(Common Name)不能与生成Server端证书请求文件时使用的OU和CN相同,否则会报错,原因是不能同时给同一个Server生成两个证书请求文件。

3)生成Client证书

openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key

4)验证Client证书

openssl verify -CAfile ca.crt client.crt

5)生成p12格式的Client证书

openssl pkcs12 -export -inkey client.key -in client.crt -out client.pfx

注:

由于在Windows下浏览器只能安装p12格式的客户端证书,因此要将.crt格式的Client证书转换成p12格式的证书。在SSL双向认证时需要客户端也安装自己的证书文件。

4 配置HTTP服务器

修改 Apache24\conf\httpd.conf 文件:

1)修改侦听端口号,将‘Listen 80’中的80改为想要设置的HTTP侦听端口号

若改成80端口以外的端口号,在用浏览器访问HTTP服务器时,URL中需指明端口号,格式是:http://hostip:port

其中,hostip指HTTP服务器主机的IP或域名,port是HTTP服务器侦听端口号

建议使用默认值80,若改为其他值,在服务器上用wireshark抓IP进行分析时,wireshark不能解析HTTP报文,不利于分析。

2)将DocumentRoot "\({SRVROOT}/htdocs"用#注释掉,改为 DocumentRoot "D:\httpdocs" #DocumentRoot "\){SRVROOT}/htdocs"

DocumentRoot "D:\httpdocs"

3)将<Directory "\({SRVROOT}/htdocs">用#注释掉,改为 <Directory "D:\httpdocs"> #<Directory "\){SRVROOT}/htdocs">

<Directory "D:\httpdocs">

注:

D:/httpdocs就是HTTP访问的文件根目录,也可以改成其他文件目录,但DocumentRoot和Directory中的目录必须一致

5 配置HTTPS服务器

5.1 修改 Apache24\conf\httpd-ssl.conf 文件

1)修改侦听端口号,将‘Listen 433'中的443改为想要侦听的端口。

同样建议使用默认值443,若改为其他值,在服务器上用wireshark抓IP进行分析时,wireshark不能解析HTTPS报文。

2)将 SSLCertificateFile 后面的服务器证书文件路径修改为 "\({SRVROOT}/conf/ssl/server.crt" SSLCertificateFile "\){SRVROOT}/conf/ssl/server.crt"

SRVROOT变量的值就是“/Apache24”

3)将SSLCertificateKeyFile后面的服务器私钥文件路径修改为 "\({SRVROOT}/conf/ssl/server.key" SSLCertificateKeyFile "\){SRVROOT}/conf/ssl/server.key"

4)将SSLCACertificateFile后面的CA证书文件路径修改为 "\({SRVROOT}/conf/ssl/ca.crt" SSLCACertificateFile "\){SRVROOT}/conf/ssl/ca.crt"

此项设置只用于双向认证,如果不需要做双向认证,CA证书路径不设置

5)将DocumentRoot后面的文件路径修改为 "D:\httpsdocs"

DocumentRoot "D:\httpsdocs"

6)将以下3行用#号注释掉

<Directory "${SRVROOT}/cgi-bin">

SSLOptions +StdEnvVars



增加以下行:

<Directory "D:\httpsdocs">

SSLOptions +StdEnvVars

Options +Indexes FollowSymLinks +ExecCGI

AllowOverride AuthConfig FileInfo

Order allow,deny

Allow from all



此处若不做修改,HTTPS服务器会无法访问,浏览器会显示403错误,错误信息是“服务器可能要求登录”。

注:

与设置HTTP服务器时类似,DocumentRoot和Directory表示HTTPS访问的文件根目录,可以设置成任何目录,但DocumentRoot和Directory设置值必须保持一致

7)如果需要设置SSL双向认证,需要将以下两行前的#注释符删掉(即取消注释):

SSLVerifyClient require

SSLVerifyDepth 10

5.2 修改Apache24\conf\extra\httpd-ahssl.conf文件

该文件中有三段以 行结尾的文本。后面两段配置文本配置的是两个虚拟主机,ServerName分别是serverone.tld:443和servertwo.tld:443。这两个虚拟主机我们都不用,因此将后面两段之间(包括这两行)的内容用#注释掉。

接下来修改第一段之间的配置文本,ServerName是localhost:443。

1)修改侦听端口号,将‘Listen 433'中的443改为想要侦听的端口。

建议使用443默认值,若改为其他值,在服务器上用wireshark抓IP进行分析时,wireshark不能解析HTTPS报文。

2)将SSLCertificateFile后面的服务器证书路径修改为 "\({SRVROOT}/conf/ssl/server.crt" SSLCertificateFile "\){SRVROOT}/conf/ssl/server.crt"

3)将SSLCertificateKeyFile后面的服务器私钥文件路径修改为 "\({SRVROOT}/conf/ssl/server.key" SSLCertificateKeyFile "\){SRVROOT}/conf/ssl/server.key"

4)将DocumentRoot "\({SRVROOT}/htdocs" 注释掉,修改为DocumentRoot "D:/httpsdocs" # DocumentRoot "\){SRVROOT}/htdocs"

DocumentRoot "D:\httpsdocs"

5)将<Directory "\({SRVROOT}/htdocs">注释掉,修改为<Directory "D:\httpsdocs"> # <Directory "\){SRVROOT}/htdocs">

<Directory "D:\httpsdocs">

注:

若此处是

<Directory "\({SRVROOT}/cgi-bin"> SSLOptions +StdEnvVars </Directory> 那么需要将这3行注释掉,增加以下行 <Directory "D:\httpsdocs"> SSLOptions +StdEnvVars Options +Indexes FollowSymLinks +ExecCGI AllowOverride AuthConfig FileInfo Order allow,deny Allow from all </Directory> 安装httpd-2.4.25-x64时此处此处已经改好了,不需要另外做修改;但在安装httpd-2.2.32-x86时发现需要修改的。 6)如果要配置SSL双向认证,需在SSLCertificateKeyFile "\){SRVROOT}/conf/ssl/server.key"行之后增加以下3行内容:

SSLCACertificateFile "${SRVROOT}/conf/ssl/ca.crt"

SSLVerifyClient require

SSLVerifyDepth 10

5.3 配置SSL单向认证/双向认证

如果需要将HTTPS服务器配置成SSL双向认证,打开5.2节7)的设置和5.3节7)的设置,重启Apache;

如果需要将HTTPS服务器配置成SSL单向认证,将5.2节7)的设置和5.3节7)的设置注释掉,重启Apache;

6 浏览器测试

测试之前,在D:/httpdocs目录下新建一个index.html文件,用文本编辑器打开后写入“HTTP works”;在D:/httpsdocs目录下同样新建一个index.html文件,写入“HTTPS works”。

6.1 测试HTTP服务器

在局域网内另一台电脑的IE浏览器地址栏输入http://hostip,其中hostip是服务器主机的IP或域名。

如果浏览器中显示“HTTP如果浏览器中显示“HTTP works”,表示HTTP服务器工作正常。

6.2 测试HTTPS单向认证

按照第5章的描述将HTTPS服务器设置成SSL单向认证

1)在IE浏览器地址栏输入https://hostip(hostip是服务器的IP或域名),此时无法正常访问服务器,原因是没有导入服务器的证书和CA证书。

2)导入服务器证书和CA证书

打开IE浏览器"Internet选项"——>“内容”——>“证书”,在弹出的“证书”窗口中,点击“受信任的根证书颁发机构”,导入ca.crt文件;然后点击“受信任的发布者”,导入server.crt文件。

3)重启IE浏览器,在地址栏输入https://hostip,如果显示“HTTPS works”,则表示HTTPS服务器工作正常。

6.3 测试HTTPS双向认证

按照第4章的描述将HTTPS服务器设置成SSL双向认证

1)在IE浏览器地址栏输入https://hostip

此时会发现,虽然已经导入服务器的证书和CA证书,但仍然无法正常访问HTTPS服务器,原因是设置了SSL双向认证后,服务器也会对客服端进行认证,只有受信任的客户端才能访问服务器。

2)双击client.pfx文件,安装客户端证书

完成客户端证书的安装后,在IE浏览器“Internet选项”——>“内容”——>“证书”——>"个人“中看到安装的client证书

3)重启IE浏览器,在地址栏输入https://iphost

这时会发现就已经可以正常访问HTTPS服务器了。

上一篇:【最短路】【STL】CSU 1808 地铁 (2016湖南省第十二届大学生计算机程序设计竞赛)


下一篇:20145227《Java程序设计》第10周学习总结