OpenSSL + Apache 让我抓狂。我查阅了很多资源,咨询了同事,意识到此时最好的选择是咨询其他资源(也就是你们)。
我使用 Python 和 CherryPy 编写了软件,该软件在端口 1240 上监听 HTTP 请求。但是,由于我需要屏蔽网络检查,所以我想用 SSL 包装它。我们决定使用 ProxyPass 和 Apache 进行 SSL 而不是 Python,因为它更快、更可靠且更全球知名。
一切都已完成,安装了 Apache。为服务运行建立一个单独的用户等,这样当服务被 (cr/h)ack 时,它们将被关押在一个无用的用户帐户中。就这些。
现在我写了以下启用的站点:
ProxyRequests Off
<VirtualHost *:443>
ServerName SERVER_NAME
ProxyPass / http://127.0.0.1:1240/
ProxyPassReverse / http://127.0.0.1:1240/
<Directory proxy:*>
Order Deny,Allow
Allow from all
</Directory>
SSLEngine on
SSLCACertificateFile /etc/ssl/certs/MY_CERT.crt
SSLCertificateFile /etc/ssl/certs/MY_CERT.crt
SSLCertificateKeyFile /etc/ssl/certs/MY_CERT.pem
</VirtualHost>
看起来很棒,不是吗(请注意,由于数据泄漏,我已将服务器名称和证书的名称更改为大写字母等。无论如何,即使它看起来很棒,但当我连接 Firefox 时却出现以下错误。
(Error code: ssl_error_rx_record_too_long)
我心想:“等等,这可不好。”
于是我开始谷歌搜索,发现 mod-ssl 可能未加载。因此我进行了如下检查:
root@SYSTEM:/etc/apache2# apachectl -t -D DUMP_MODULES
[Thu Jan 24 09:36:44 2013] [warn] NameVirtualHost *:8080 has no VirtualHosts
Loaded Modules:
core_module (static)
log_config_module (static)
logio_module (static)
mpm_prefork_module (static)
http_module (static)
so_module (static)
alias_module (shared)
auth_basic_module (shared)
authn_file_module (shared)
authz_default_module (shared)
authz_groupfile_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
cgi_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
mime_module (shared)
negotiation_module (shared)
php5_module (shared)
proxy_module (shared)
proxy_ajp_module (shared)
proxy_balancer_module (shared)
proxy_connect_module (shared)
proxy_ftp_module (shared)
proxy_http_module (shared)
proxy_scgi_module (shared)
reqtimeout_module (shared)
setenvif_module (shared)
ssl_module (shared)
status_module (shared)
Syntax OK
看起来不错,继续。检查日志后,我发现了与此处完全相同的错误:http://ubuntuforums.org/showthread.php?t=806884
试过了,没用。我重新生成了密钥,但问题依然存在(http://www.devco.net/archives/2006/02/13/public_-_private_key_encryption_using_openssl.php)我使用 openssl 检查了密钥的有效性:
root@SYSTEM:/etc/ssl/certs# openssl x509 -in MY_CERT.crt -noout -text
Certificate:
Data:
Version: 1 (0x0)
Serial Number: <---8<---snip---8<--->(0x<---8<---snip---8<--->)
Signature Algorithm: sha1WithRSAEncryption
Issuer: <---8<---snip---8<--->
Validity
Not Before: Jan 24 08:05:44 2013 GMT
Not After : Mar 25 08:05:44 2013 GMT
Subject: <---8<---snip---8<--->
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (1024 bit)
Modulus:
<---8<---snip---8<--->
Exponent: <---8<---snip---8<---> (0x<---8<---snip---8<--->)
Signature Algorithm: sha1WithRSAEncryption
<---8<---snip---8<--->
看起来有效,现在我开始掉头发了。当我在 443 上进行 telnet 时也是如此。我GET /
得到的是 HTML。所以看起来 SSL 根本没有运行。有什么技巧/窍门可以尝试吗?要查看的文件或任何其他东西?
此外,我意识到自签名等并不是最安全的方法。但这不是现在的重点,因为目前它真的只是一个概念验证。所以任何建议都非常有用,我会奖励你一个 ServerFault +1 帖子 ;)
编辑:还有一个小注释,当我使用它时links https://localhost
它有效。
STOLAS@SYSTEM:~$ sudo apachectl -S
[sudo] password for STOLAS:
[Thu Jan 24 10:47:42 2013] [warn] NameVirtualHost *:8080 has no VirtualHosts
VirtualHost configuration:
wildcard NameVirtualHosts and default servers:
*:443 SERVER.COM (/etc/apache2/sites-enabled/000-default:2)
Syntax OK
答案1
当 @al4 发布最后一条回复时,我开始思考。由于我不是唯一一个研究这个问题的人,所以我决定执行 cat $HISTFILE ,有人添加了一条 iptables 规则。
所以,谢谢大家。很抱歉浪费了你们的时间。事实证明,我使用 Apache 做的所有事情都是正确的。但有人用 iptables 搞乱了我的一天(这花了我两天时间……)
但是当我这样做时iptables -L ; iptables -t nat -L
(将我的 iptables 规则转储到 stdout),我发现有一个从 143 到本地 1240 的 NATTING 规则。其他命令让我意识到 iptables 是用于netstat -lanp
检查 Apache 是否正在运行以及tcpdump not tcp 22
用于检查连接是否发送到该框。
谢谢您的帮助,我希望迷失的谷歌用户将来会发现这个答案很有用!