Linux Apache 的 HTTPS 配置.docx

上传人:b****8 文档编号:29903332 上传时间:2023-08-03 格式:DOCX 页数:13 大小:155.22KB
下载 相关 举报
Linux Apache 的 HTTPS 配置.docx_第1页
第1页 / 共13页
Linux Apache 的 HTTPS 配置.docx_第2页
第2页 / 共13页
Linux Apache 的 HTTPS 配置.docx_第3页
第3页 / 共13页
Linux Apache 的 HTTPS 配置.docx_第4页
第4页 / 共13页
Linux Apache 的 HTTPS 配置.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

Linux Apache 的 HTTPS 配置.docx

《Linux Apache 的 HTTPS 配置.docx》由会员分享,可在线阅读,更多相关《Linux Apache 的 HTTPS 配置.docx(13页珍藏版)》请在冰豆网上搜索。

Linux Apache 的 HTTPS 配置.docx

LinuxApache的HTTPS配置

LinuxApache的HTTPS配置

我以前在Windows上配置过Apache的SSL/HTTPS双向认证,即对Web服务器与浏览器同时进行认证,而建立的HTTPS安全连接。

最近,我在Linux下也配置了下Apache的HTTPS,并将配置过程和遇到的问题记录了一下。

配置环境

∙Web服务器系统:

VMwareWorkstation6.0.2,DebianLinux5.0.2,kernel=2.6.26-2-686

∙Web服务器:

Apache2.2.9-10

∙Web浏览器系统:

WindowsXPProfessional

∙Web浏览器:

Firefox3.0.11

LinuxApache的基本配置

现在Linux下较新的Apache配置,要比Windows下的配置方便、灵活的多。

比如,我的Debian5下的Apache2包安装后,就将Apache的配置文件放在:

/etc/apache2目录下,并按照Linux下经典的:

xxx-available,xxx-enabled,xxx.d目录来组织配置文件,看到这里有没有想到Emacs的配置文件组织方式呢?

(*^_^*)。

玩Linux的人看到这里,大多都能猜地出LinuxApache是怎么组织的。

下面简单列举一下Apache配置文件的组织结构:

∙apache2.conf:

Apache的入口配置文件,包含其它配置文件的主控文件

∙conf.d/:

包含一些零碎的配置,一般不和具体的mod相关,是全局性质的,比如:

字符集charset、安全选项security。

∙ports.conf:

设置Apache的监听端口,默认时,HTTP为80,HTTPS为443。

∙envvars:

导出一些环境变量,比如:

∙exportAPACHE_RUN_USER=www-data

∙exportAPACHE_RUN_GROUP=www-data

∙exportAPACHE_PID_FILE=/var/run/apache2.pid

∙httpd.conf:

额外的用户设置的配置,默认里面内容为空。

Windows下的Apache喜欢用这个名字作为主控配置文件,但在Linux下,作用不大。

∙mods-available/:

包含Apache中所有可用mod的加载和设置配置,加载配置一般用xxx.load表示,设置配置一般用xxx.conf表示,比如:

mod_ssl的加载配置为:

ssl.load,设置配置为:

ssl.conf

∙mods-enabled/:

实际启动的mod的加载和设置配置,是到mods-available/中配置文件的符号链接。

∙sites-available/:

Web站点的配置,可以是全局的,或虚拟主机作用域的。

默认有两个附带的配置文件:

default、default-ssl,其中default为一般的HTTP服务的虚拟主机配置,而default-ssl就是HTTPS服务的虚拟主机配置。

这两个配置文件可以直接使用,配置内容只需做适当的调整即可。

∙sites-enabled/:

实际启动的Web站点配置,是到sites-available/中配置文件的符号链接。

默认时,只有一个000-default链接指向sites-available/default,说明默认的Apache配置,只启动HTTP服务,而不启动HTTPS服务。

另外,列举一下配置HTTPS时,Apache的相关文件路径:

∙Apache日志文件:

在:

/var/log/apache2目录中保存。

错误日志为:

error.log,HTTP访问日志为:

access.log,HTTPS访问日志为:

ssl_access.log。

∙Apache的启动:

可以使用Apache在:

/etc/init.d/中安装的RunLevel脚本:

apache2,来启动/停止Apache服务。

和大多数RunLevel脚本一样,使用参数start启动服务,使用参数stop停止服务,如下:

∙#/etc/init.d/apache2start

∙Startingwebserver:

apache2apache2:

Couldnotreliablydeterminetheserver'sfullyqualifieddomainname,using192.168.2.108forServerName

∙#/etc/init.d/apache2stop

∙Stoppingwebserver:

apache2apache2:

Couldnotreliablydeterminetheserver'sfullyqualifieddomainname,using192.168.2.108forServerName

∙...waiting.

∙Web文件目录:

使用sites-available中,配置文件default和default-ssl的DocumentRoot选项,默认指定的Web文件目录:

/var/www/。

/var/www目录下默认只有一个Web文件:

index.html,我就用它作为HTTPS配置的测试页面,并更改了下它的内容:

HelloWorld!

--zy

证书、密钥和测试场景

有2台主机系统:

∙一个Linux安装Apache服务器,主机名:

zy-13

∙另一个为Windows,使用Firefox作为浏览器,主机名:

zy-1。

使用Firefox作为浏览器,是因为HTTPS基于的SSL最早是由Netscape提出的,并且Netscape一直在发展SSL技术(参考:

MozillaSSL/TLS),而Mozilla是Netscape的开源社区,所以我想Mozilla的Firefox应该比其它浏览器对SSL支持地更完善(其实这是借口,我只是喜欢用Firefox而已)。

有3套证书,用openssl工具生成,作用如下:

∙zy-root.cer:

用作CA证书,PEM格式,对其它两个证书进行签发,它自己是自签的。

∙zy-13.cer:

用作Web服务器证书,PEM格式。

它的密钥文件为:

zy-13.key,用DES3加密保护。

注意:

服务器证书zy-13.cer中的通用名属性,即CN:

CommonName字段,应该和服务器的主机名一致,我都设定为:

zy-13,否则,浏览器会报错:

ssl_error_bad_cert_domain,如下:

这个要求的作用是显然的,目的是防止其它人冒用服务器证书,比如:

当服务器证书zy-13.cer,和服务器密钥zy-13.key,同时落入攻击者手中,并且zy-13.key不使用密码保护时,这种冒充攻击就可能奏效。

在实际工作中,CN名应该设定为服务器主机的全域名(FQDN:

FullyQualifiedDomainName)。

我在测试中,用IP地址访问HTTPS服务时,浏览器也会出现该错误,这可能是因为主机名和IP地址的映射不是由DNS系统完成的,而是由WindowsLAN完成的。

另外,对于这种“无效的安全证书”错误,Firefox有一种“迁就的”用户放过的方法:

通过服务器证书的散列码(指纹)和其它属性信息,人工验证证书的有效性,如果最后你确定信任这个证书,可以在Firefox中加入一条“安全例外”。

“安全例外”型证书是Firefox对待证书认证的一种灵活方式,但使用这种方式后安全性交由Firefox用户自己负责,而依靠授权证书链的认证策略也荡然无存了,这也不是HTTPS认证的正常使用方式。

安全例外可以在Firefox的报错页面上点击“或者,您可以添加一个例外”来增加,例外的证书被放置在“证书管理器”中的“服务器”类别中,在那里也可以点击“添加例外”增加例外证书。

∙zy-1.cer:

用作浏览器中使用的Web客户端证书,PEM格式。

它的密钥文件为:

zy-1.key,用DES3加密保护。

将zy-1.cer与zy-1.key合成为PKCS#12格式的文件:

zy-1.p12,并设定导出密码(ExportPassword)保护zy-1.p12文件。

注意:

这个导出密码就是在浏览器中导入PKCS#12文件时,提示输入的密码,而原来的密钥文件zy-1.key的DES3保护密码是没有用的。

HTTPS服务器端认证配置

Apache中对服务器端的HTTPS认证配置、使用过程如下:

1.启用Apache默认附带的HTTPS服务配置文件:

sites-available/default-ssl,只需在目录:

sites-enabled中建立一个指向它的符号链接即可:

2.#cdsites-enabled

3.#ln-s-T../sites-available/default-ssl001-default-ssl

4.在:

sites-available/default-ssl中设置HTTPS服务器端认证的选项。

首先,启动SSL传输层引擎SSLEngine,如下:

5.#SSLEngineSwitch:

6.#Enable/DisableSSLforthisvirtualhost.

7.SSLEngineon

8.使用SSLCertificateFile和SSLCertificateKeyFile选项,设置服务器证书zy-13.cer和服务器密钥zy-13.key。

9.#Aself-signed(snakeoil)certificatecanbecreatedbyinstalling

10.#thessl-certpackage.See

11.#/usr/share/doc/apache2.2-common/README.Debian.gzformoreinfo.

12.#Ifbothkeyandcertificatearestoredinthesamefile,onlythe

13.#SSLCertificateFiledirectiveisneeded.

14.SSLCertificateFile/root/common/key/zy-13.cer

15.SSLCertificateKeyFile/root/common/key/zy-13.key

设置完后,服务器端认证大致就配置完成了,不要忘记重启Apache服务器。

如果服务器密钥文件zy-13.key使用密码加密保护,则在启动Apache时会提示用户输入密码,以解密zy-13.key获得明文的密钥信息,如下:

#/etc/init.d/apache2start

Startingwebserver:

apache2apache2:

Couldnotreliablydeterminetheserver'sfullyqualifieddomainname,using192.168.2.108forServerName

Apache/2.2.9mod_ssl/2.2.9(PassPhraseDialog)

Someofyourprivatekeyfilesareencryptedforsecurityreasons.

Inordertoreadthemyouhavetoprovidethepassphrases.

Serverzy-13:

443(RSA)

Enterpassphrase:

(这里输入密码,无击键反馈回显)

OK:

PassPhraseDialogsuccessful.

.

16.现在可以使用Firefox测试一下效果。

用Firefox连接服务器端,地址中的服务器端主机名应该写为服务器证书zy-13中CN字段记录的值,不要使用IP地址来连接服务器,否则Firefox会报ssl_error_bad_cert_domain错误。

因此,连接地址为:

https:

//zy-13/index.html。

一开始连接这个地址时,Firefox会报错:

sec_error_unknown_issuer,如下:

说明服务器证书的签发者不被Firefox信任,这是当然的,因为服务器证书zy-13.cer是我自己用另外一个证书zy-root.cer签的,zy-root.cer是我认为的CA证书,但Firefox并不认为它是,Firefox会预置一些CA证书,但通常它们都是由大的安全公司、机构生成的证书,比如:

VeriSign、Thawte,所以需要手工导入自己的CA证书zy-root.cer到Firefox的证书管理器中。

导入在这里操作:

选项→高级→加密→查看证书→证书机构→导入。

17.再次测试Firefox连接服务器端,这次就可以连接成功,Firefox取回并显示index.html页面。

在通过HTTPS验证的连接中,Firefox会在状态栏显示此图标:

,双击此图标会弹出“页面信息”对话框,选择它的“安全”一栏就可以查看HTTPS连接的细节和相关的证书信息:

点击“安全”中的“查看证书”可以查看当前服务器证书zy-13.cer的信息:

注意上面显示的证书的组织名:

zy-home,这是证书中的:

O(OrganizationName)字段设置的,在Firefox中这个名字也被认为是验证者的名字。

如果想查看服务器证书zy-13.cer的更多内容,可以换到证书查看器的“细节”选项卡,这里显示证书结构(即证书链),和证书字段,如下:

HTTPS客户端认证配置

Apache中对客户端(浏览器)的HTTPS认证配置,是建立在已完成的服务器端认证配置基础之上,也在HTTPS服务配置文件:

sites-available/default-ssl中设置。

客户端的认证配置、使用过程如下:

1.设置SSLVerifyClient和SSLVerifyDepth,如下:

2.#ClientAuthentication(Type):

3.#Clientcertificateverificationtypeanddepth.Typesare

4.#none,optional,requireandoptional_no_ca.Depthisa

5.#numberwhichspecifieshowdeeplytoverifythecertificate

6.#issuerchainbeforedecidingthecertificateisnotvalid.

7.SSLVerifyClientrequire

8.SSLVerifyDepth10

设置完后,使用Firefox测试一下,Firefox会报:

ssl_error_handshake_failure_alert错误,如下:

再看看Apache的错误日志error.log,其中记录到:

[SunOct1100:

13:

342009][warn]Init:

Oops,youwanttorequestclientauthentication,butnoCAsareknownforverification!

?

[Hint:

SSLCACertificate*]

说明Apache中需要设置CA证书信息,此证书的作用就是:

在服务器端,对客户端证书进行验签。

上述的:

SSLCACertificate*,指代两个选项:

SSLCACertificatePath、SSLCACertificateFile,这两个选项都可以用来设置CA证书。

9.使用SSLCACertificatePath、SSLCACertificateFile选项设置CA证书。

将用于签名客户端证书zy-1.cer的CA证书zy-root.cer,拷贝到Apache2所装系统的某个目录下,比如拷贝到:

/root/common/key/zy-root.cer,然后用SSLCACertificateFile设置该CA证书路径,如下:

#CertificateAuthority(CA):

#SettheCAcertificateverificationpathwheretofindCA

#certificatesforclientauthenticationoralternativelyone

#hugefilecontainingallofthem(filemustbePEMencoded)

#Note:

InsideSSLCACertificatePathyouneedhashsymlinks

#topointtothecertificatefiles.Usetheprovided

#Makefiletoupdatethehashsymlinksafterchanges.

#SSLCACertificatePath/etc/ssl/certs/

SSLCACertificateFile/root/common/key/zy-root.cer

当使用SSLCACertificatePath选项,指定一个存储多个CA证书的目录时,要求这个目录中的CA证书必需是一个指向实际证书文件的符号链接,并且符号链接的名字应该是通过openssl工具对证书文件进行散列后的散列码,据说在mod_ssl中提供了一个Makefile来做这件事情,不过我始终没找到在Apache2安装包中还有什么SSL的Makefile,倒是在ssl-cert包中找到了一个叫:

make-ssl-cert的bash脚本,其中有几句:

cd/etc/ssl/certs/

ln-sfssl-cert-snakeoil.pem$(opensslx509-hash-noout-inssl-cert-snakeoil.pem)

我感觉这就是用openssl产生证书散列码,并建立符号链接的过程,于是我仿照这个命令建立了自己的CA证书zy-root.cer的符号链接,但是测试后发现不行:

Firefox一直处在连接中状态,似乎是Apache无法找到合适的CA证书来验证客户端证书的有效性(/etc/ssl/certs下的证书符号链接很多),所以我干脆就用SSLCACertificateFile来设置CA证书了,注意:

用SSLCACertificateFile设置的CA证书必需是BASE64编码的PEM格式的证书。

关于SSLCACertificatePath,有兴趣的人可以参考:

Apache2mod_ssl文档中“SSLCACertificatePath指令”一节,虽然它说地的内容很少,(-_-^)。

CA证书设置完成后,再用Firefox测试,仍然是错误:

ssl_error_handshake_failure_alert。

不要紧张,这是因为在浏览器中没有候选的客户端证书导致的,可以在Firefox的:

选项→高级→加密→查看证书→您的证书,中导入PKCS#12格式的证书文件,因为PKCS#12证书中含有私钥部分,所以在导入时会提示输入保护密码。

另外,在Firefox的:

选项→高级→加密,中有两种Firefox提供客户端证书给服务器的策略方式,可以在“当某个服务器请求我的个人证书:

”选项下进行设置,分别是:

“自动选择一个”和“每次均询问”,默认为:

每次均询问。

10.看似一切均设置妥当,再用Firefox测试。

如果设置“每次均询问”的方式提供客户端证书,则此时会弹出“使用确认请求”对话框,让用户选择一个已导入的客户端证书,证书以证书序号标识,并显示了证书的一些属性信息,如下图:

确认客户端证书后,Firefox继续连接建立过程,但却报出错误:

ssl_error_bad_cert_alert,如下:

而Apache的错误日志error.log中记录:

[FriJan0100:

05:

282010][error]CertificateVerification:

Error(9):

certificateisnotyetvalid

我在网上查了半天也没找到问题的原因,又改了其它几个Apache配置选项还是不行,仍然出同样的错误。

提示说错误证书,究竟是什么造成的呢?

最后我直接搜Apache日志中的错误描述:

certificateisnotyetvalid,在OpenSSL官方网站的:

openssl工具的verify命令文档中找到了点线索,摘录如下:

9X509_V_ERR_CERT_NOT_YET_VALID:

certificateisnotyetvalid

thecertificateisnotyetvalid:

thenotBeforedateisafterthecurrenttime.

证书中的NotBefore时间和系统时间?

难道是造成“错误证书”的原因是这个,我用:

date'+%Y-%m-%d%T'查了下Apache的系统时间,果然不对劲:

我的Linux的系统时间,竟然比CA证书和客户端证书的NotBefore时间还早,于是我终于想起来了:

我用的VMware中GuestOS的DebianLinux系统,是我以前做的,拷贝到新的宿主机上后就没改过Linux的系统时间,(-_-^)。

知道这一点后,赶紧用:

date-syyyy-mm-dd,把Linux系统时间改成正确的时间,至少要在证书的NotBefore与NotAfter两个时间之间。

证书的有效时间信息可以用此命令显示:

opensslx509-noout-text-infile.cer。

设置完系统时间后,重启Apache服务,再用Firefox测试,确认客户端证书后,Firefox终于完成与服务器的HTTPS连接,显示网页内容。

至此,Apache的HTTPS客户端认证配置完成。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 辩护词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1