2.2.5 利用 openssl 生成 HTTPS 连接所需的认证信息
由于运行 Reverse Proxy 的 Apache 服务器在客户端看来是一台实际的 Web 服务器,因此在进行 HTTPS 连接时,客户端需要验证其 SSL 签名的有效性。这样,我们需要在上述配置好的 Apache 服务器中加入 SSL 认证信息,才能保证客户端的 HTTPS 应用程序能够正常运行。
自签名(self-signed)的 SSL 认证文件的生成
首先是生成根证书文件 ca.crt
# openssl genrsa -des3 -out ca.key 4096
# openssl req -new -x509 -days 365 -key ca.key -out ca.crt
第一步是生成一个根证书的 key 文件,系统会要求输入 pass phase, 记下输入的密码,这一密码会在后面多次用到。而第二步则将使用这个 key 文件来生成根证书,这一步执行时系统会要求输入许多根证书的信息,值得注意的是 Common Name(CN),这一步中输入的 CN 值应与下一步生成服务器证书时输入的不同。
接着需要生成服务器证书签名请求(Certificate Signing Request)文件 server.csr,步骤与生成根证书文件类似。
# openssl genrsa -des3 -out server.key 4096
# openssl req -new -key server.key -out server.csr
同样,在第二步中会要求输入一系列的服务器信息,这里的 Common Name(CN) 应与客户端访问该服务器时使用的地址相同,例如:
客户端使用 访问该服务器时,这里的 CN 应为 proxyhost.com
客户端使用 [2002:9ba:b4e:6::3]/ 访问该服务器时,这里的 CN 应为 [2002:9ba:b4e:6::3]
为何需要相同,是因为客户端的 HTTPS 连接程序会验证该服务器提供的证书有效性,若证书中的 CN 与实际客户端访问的主机名不同,客户端会抛出 INVALID_CN 错误。
最后,利用前面生成的根证书文件 ca.crt 来签署(Sign)服务器证书签名请求 server.csr。
# openssl x509 -req -days 365 -in server.csr -CA ca.crt \
-CAkey ca.key -set_serial 01 -out server.crt
将上述生成的四个证书相关文件(ca.crt,ca.key,server.crt,server.key)拷入 Apache 的配置文件夹中,接下来将会把这些文件的路径和一些配置信息加入到 Apache 配置文件中。
Listen 443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
SSLPassPhraseDialog builtin
SSLSessionCache "shmcb:/usr/local/apache2/logs/ssl_scache(512000)"
SSLSessionCacheTimeout 300
SSLMutex "file:logs/ssl_mutex"
NameVirtualHost *:443
<VirtualHost *:443>
DocumentRoot "apache2/htdocs"
ServerName ipv6-server-proxy
ServerAdmin you@example.com
ErrorLog "ssl-error_log"
TransferLog "ssl-access_log"
SSLEngine on
SSLProtocol -all +TLSv1 +SSLv3
SSLCipherSuite HIGH:MEDIUM:!aNULL:+SHA1:+MD5:+HIGH:+MEDIUM
SSLCertificateFile "server.crt"
SSLCertificateKeyFile "server.key"
<Directory "/usr/local/apache2/cgi-bin">
SSLOptions +StdEnvVars
</Directory>
BrowserMatch ".*MSIE.*" \
nokeepalive ssl-unclean-shutdown \
downgrade-1.0 force-response-1.0
CustomLog "logs/ssl_request_log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
SSLProxyEngine on
ProxyRequests off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
</VirtualHost>
这里再次使用了 ProxyPass 来建立代理服务。
正如上一节2.2.4中所述,这里建议将这些配置信息写入 httpd-ssl.conf 中,然后在 httpd.conf 中加入如下一行将其包含。
Include httpd-ssl.conf
配置完成后,即可启动/重启 Apache 服务器来使得刚才的配置生效。
# /etc/init.d/httpd restart
客户端 HTTPS 连接的考虑
由于这里采用的是自签名(Self-signed)的方式来生成服务器的认证文件,客户端使用 HTTPS 连接到该代理服务器时,会出现认证错误的提示。这就需要将这里生成的证书加入到客户端的可信站点列表中。具体的添加方式因采用的系统不同而各异。就 Windows 平台的 IE 而言,可以将上述生成的 ca.crt 及 server.crt 文件加入到 IE 的可信站点中,这会影响到所有利用 IE 提供的 wininet 库进行 HTTP 应用开发的程序。