来自 Apache 的 SSL 连接错误

Yan*_*ang 8 ssl httpd ssl-certificate tls apache-2.2

我在 Ubuntu 10.04 上的 Apache/2.2.14 上运行(自签名)SSL 证书站点,但是各种浏览器在一半的连接尝试中都出现错误。刚刚从 Chrome 中看到这个暂时性错误:

"Error 126 (net::ERR_SSL_BAD_RECORD_MAC_ALERT): Unknown error."
Run Code Online (Sandbox Code Playgroud)

点击刷新,问题会消失一段时间。

wget也是:

$ wget --no-check-certificate https://dev.foo.com/deps/
--2010-09-08 19:30:26--  https://dev.foo.com/deps/
Resolving dev.foo.com... 184.72.53.220
Connecting to dev.foo.com|184.72.53.220|:443... connected.
OpenSSL: error:0407006A:rsa
routines:RSA_padding_check_PKCS1_type_1:block type is not 01
OpenSSL: error:04067072:rsa routines:RSA_EAY_PUBLIC_DECRYPT:padding check failed
OpenSSL: error:1408D07B:SSL routines:SSL3_GET_KEY_EXCHANGE:bad signature
Unable to establish SSL connection.
Run Code Online (Sandbox Code Playgroud)

立即再次运行它,它可以工作:

$ wget --no-check-certificate https://dev.foo.com/deps/
--2010-09-08 19:30:29--  https://dev.foo.com/deps/
    Resolving dev.foo.com... 184.72.53.220
Connecting to dev.foo.com|184.72.53.220|:443... connected.
WARNING: cannot verify dev.foo.com's certificate, issued by
`/CN=dev.foo.com':
 Self-signed certificate encountered.
HTTP request sent, awaiting response... 200 OK
Length: 3157 (3.1K) [text/html]
Saving to: `index.html'

100%[======================================>] 3,157       --.-K/s   in 0s

2010-09-08 19:30:29 (48.6 MB/s) - `index.html' saved [3157/3157]
Run Code Online (Sandbox Code Playgroud)

在我的启用站点/默认 ssl 中:

SSLCertificateFile    /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
Run Code Online (Sandbox Code Playgroud)

证书:

-----BEGIN CERTIFICATE-----
MIIBszCCARwCCQCa0TzNwqLgsTANBgkqhkiG9w0BAQUFADAeMRwwGgYDVQQDExNk
ZXYucGFydHlvbmRhdGEuY29tMB4XDTEwMDgyNzA2MzA1N1oXDTIwMDgyNDA2MzA1
N1owHjEcMBoGA1UEAxMTZGV2LnBhcnR5b25kYXRhLmNvbTCBnzANBgkqhkiG9w0B
AQEFAAOBjQAwgYkCgYEAzXDEULpCUqIc9hV/ESFapkckR2uoYINA81DvG2aQZ9Ot
Q30OwX2ae2CC4bSzJEIVlahU8vjVrWpmpa28NEhQbqh4ywwbl1XDrEVYI6Gkfimf
snJhOKyaVrEhlwutYtBjmsz3ZIqwymMPm/6smVcSS5dJIynlSmtltxX6ivPcO8UC
AwEAATANBgkqhkiG9w0BAQUFAAOBgQBGxHVkpSSOnZjzuySRepjhAlV/yhe9Fx23
fh12WrjQMEi98B7JEuNSLXDWckUN7O6XRc3RzKmazcGHJqzhn0Ov6gAmAE2XjZ/x
VW21xmaLwk+KgYKFJbJJaP3jMSpU7I3aa11wqAkR2Zd4Nkm9N0YXYIzcBdfztTVI
Et8mEHBFdg==
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

证书依次通过以下方式生成:

$ make-ssl-cert generate-default-snakeoil --force-overwrite
Run Code Online (Sandbox Code Playgroud)

阿帕奇版本。

$ apache2 -V
Server version: Apache/2.2.14 (Ubuntu)
Server built:   Apr 13 2010 20:22:19
Server's Module Magic Number: 20051115:23
Server loaded:  APR 1.3.8, APR-Util 1.3.9
Compiled using: APR 1.3.8, APR-Util 1.3.9
Architecture:   64-bit
Server MPM:     Worker
 threaded:     yes (fixed thread count)
   forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/worker"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT=""
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types"
 -D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"
Run Code Online (Sandbox Code Playgroud)

我不管理网络、硬件等——这一切都在 Amazon EC2 上运行。我没有在服务器前运行负载平衡器或其他任何东西。我正在与该主机(AFAIK)建立直接 TCP 连接。

有任何想法吗?在此先感谢您的帮助。

Fal*_*mot 2

您遇到的问题是,浏览器收到的消息上的签名间歇性地错误。

发生这种情况的原因有很多。例如,您可能遇到了 openssl bug、硬件故障(RAM 或 CPU 损坏)、您的密钥出现了某种奇怪的巧合(天文数字上不太可能)。或者,您可能正在经历 MAC 旨在检测的情况:有人可能在途中篡改您的流量。

由于您的证书是自签名的,因此请继续替换它,重新启动 apache,然后继续,就像故障排除步骤一样。如果这不起作用,请检查您是否正在运行最新版本的 openssl(或者只是为了好玩而更改 openssl 版本)。如果仍然出现 MAC 错误,请调查是否存在硬件故障或网络篡改。

这部分错误特别能说明问题:

OpenSSL: error:04067072:rsa routines:RSA_EAY_PUBLIC_DECRYPT:padding check failed
Run Code Online (Sandbox Code Playgroud)

这表明该消息很可能已从签名版本中被修改,并且可能被截断。