SSL/TLS 强加密:常见问题

Note

智者没有给出正确的答案,他提出了正确的问题。

-克劳德·列维·斯特劳斯

Installation

启动 Apache 时,为什么会收到与 SSLMutex 相关的权限错误?

诸如```+554++555++556+``+557+`)的 x 位设置为至少运行 Apache 子级的 UID(请参见User指令)。

启动 Apache 时,为什么 mod_ssl 停止并显示错误“无法生成临时 512 位 RSA 专用密钥”?

加密软件需要不可预测的数据源才能正常工作。许多开源 os 都提供了用于此目的的“随机设备”(通常称为/dev/random)。在其他系统上,应用程序必须先使用适当的数据为 OpenSSL 伪随机数生成器(PRNG)手动植入种子,然后再生成密钥或执行公共密钥加密。从 0.9.5 版开始,如果 PRNG 尚未以至少 128 位随机数作为种子,则需要随机性的 OpenSSL 函数将报告错误。

为防止此错误,mod_ssl必须向 PRNG 提供足够的熵以使其正常工作。这可以通过SSLRandomSeed指令完成。

Configuration

是否可以从同一服务器提供 HTTP 和 HTTPS?

是。 HTTP 和 HTTPS 使用不同的服务器端口(HTTP 绑定到端口 80,HTTPS 绑定到端口 443),因此它们之间没有直接冲突。您可以运行绑定到这些端口的两个单独的服务器实例,也可以使用 Apache 优雅的虚拟托管工具创建两个虚拟服务器,这两个虚拟服务器均由同一 Apache 实例提供服务-一个通过 HTTP 响应端口 80 上的请求,另一个通过对端口 443 上的请求的 HTTPS。

HTTPS 使用哪个端口?

您可以在任何端口上运行 HTTPS,但是标准指定端口 443,默认情况下,该端口是所有 HTTPS 兼容浏览器的外观。您可以通过在 URL 中指定浏览器来强制浏览器使用其他端口。例如,如果您的服务器设置为通过端口 8080 上的 HTTPS 提供页面,则可以通过https://example.com:8080/访问它们

如何出于测试目的手动说 HTTPS?

虽然您通常只使用

$ telnet localhost 80 GET / HTTP/1.0

对于通过 HTTP 进行 Apache 的简单测试,由于 TCP 和 HTTP 之间的 SSL 协议,对于 HTTPS 而言并不是那么容易。但是,借助 OpenSSL 的s_client命令,您可以通过 HTTPS 执行类似的检查:

$ openssl s_client -connect localhost:443 -state -debug GET / HTTP/1.0

在实际的 HTTP 响应之前,您将收到有关 SSL 握手的详细信息。对于更直接了解 HTTP 和 HTTPS,可以执行 GET 和 POST 操作,可以使用代理,支持字节范围等的更通用的命令行 Client 端,您应该看看漂亮的cURL工具。使用此方法,可以检查 Apache 是否通过 HTTP 和 HTTPS 正确响应了请求,如下所示:

$ curl http://localhost/ $ curl https://localhost/

当我连接到支持 SSL 的 Apache 服务器时,为什么连接会挂起?

当您尝试通过 HTTP(例如,使用http://example.com/而不是https://example.com)连接到 HTTPS 服务器(或虚拟服务器)时,可能会发生这种情况。当尝试通过 HTTPS 连接到 HTTP 服务器时(例如,在不支持 HTTPS 或在非标准端口上支持 HTTPS 的服务器上使用https://example.com/),也会发生这种情况。确保您正在连接到支持 SSL 的(虚拟)服务器。

尝试通过 HTTPS 访问新安装的 Apache mod_ssl 服务器时为什么会出现``拒绝连接''消息?

该错误可能是由于配置错误引起的。请确保您的Listen指令与您的<VirtualHost>指令匹配。如果所有其他方法均失败,请使用mod_ssl提供的默认配置重新开始。

为什么 SSL_XXX 变量对我的 CGI 和 SSI 脚本不可用?

请确保已为 CGI/SSI 请求的上下文启用了```+595+`''。

如何在相对超链接的 HTTP 和 HTTPS 之间切换?

通常,要在 HTTP 和 HTTPS 之间切换,必须使用完全限定的超链接(因为必须更改 URL 方案)。但是,使用mod_rewrite可以操纵相对超链接,以达到相同的效果。

RewriteEngine on
RewriteRule   "^/(.*)_SSL$"   "https://%{SERVER_NAME}/$1" [R,L]
RewriteRule   "^/(.*)_NOSSL$" "http://%{SERVER_NAME}/$1"  [R,L]

通过此重写规则集,您可以使用<a href="document.html_SSL">形式的超链接在相对链接中切换到 HTTPS。 (用 NOSSL 替换 SSL 以切换到 HTTP.)

Certificates

什么是 RSA 私钥,CSR 和证书?

RSA 私钥文件是一个数字文件,可用于解密发送给您的消息。它具有一个公共组件,您可以通过您的证书文件分发该组件,使人们可以加密发送给您的邮件。

证书签名请求(CSR)是一个数字文件,其中包含您的公共密钥和名称。您将 CSR 发送给认证机构(CA),该机构将通过签名将其转换为真实的证书。

证书包含您的 RSA 公钥,您的姓名,CA 的名称,并由 CA 进行数字签名。知道 CA 的浏览器可以验证该证书上的签名,从而获得您的 RSA 公钥。这样一来,他们就可以发送只有您才能解密的消息。

有关 SSL 协议的一般说明,请参见Introduction章。

不支持 SSL 的 Apache 和支持 SSL 的 Apache 之间在启动方面有区别吗?

是。通常,使用内置的mod_ssl启动 Apache 就像没有它的启动 Apache。但是,如果您的 SSL 私钥文件上有密码短语,则会弹出一个启动对话框,要求您 Importing 密码短语。

启动服务器时必须手动 Importing 密码短语可能会出现问题-例如,从系统启动脚本启动服务器时。在这种情况下,您可以按照步骤below从私钥中删除密码短语。请记住,这样做会带来额外的安全风险-请谨慎操作!

如何创建用于测试目的的自签名 SSL 证书?

  • 确保已在您的PATH中安装了 OpenSSL。

  • 运行以下命令,创建server.keyserver.crt文件:
    $ openssl req -new -x509 -nodes -out server.crt -keyout server.key
    可以在您的httpd.conf文件中按如下方式使用它们:

SSLCertificateFile    "/path/to/this/server.crt"
SSLCertificateKeyFile "/path/to/this/server.key"
  • 请务必注意,此server.key 没有密码短语,这一点很重要。要将密码短语添加到密钥,您应该运行以下命令,并根据要求 Importing 并验证密码短语。

$ openssl rsa -des3 -in server.key -out server.key.new
$ mv server.key.new server.key

请将server.key文件以及您 Importing 的密码备份到安全的位置。

如何创建真实的 SSL 证书?

以下是分步说明:

  • 确保已在您的PATH中安装了 OpenSSL。

  • 为您的 Apache 服务器创建 RSA 私钥(将经过 Triple-DES 加密和 PEM 格式):

$ openssl genrsa -des3 -out server.key 2048

请备份此server.key文件和您在安全位置 Importing 的密码。您可以使用以下命令查看此 RSA 私钥的详细信息:

$ openssl rsa -noout -text -in server.key

如有必要,您还可以使用以下方法创建此 RSA 私钥的解密的 PEM 版本(不推荐):

$ openssl rsa -in server.key -out server.key.unsecure

  • 使用服务器 RSA 私钥创建证书签名请求(CSR)(输出将采用 PEM 格式):

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

当 OpenSSL 提示您 Importing“ CommonName”时,请确保 Importing 服务器的 FQDN(“完全合格的域名”),即,当您为将通过https://www.foo.dom/访问的网站生成 CSR 时,Importing“ www.foo”。 dom”。您可以使用来查看此 CSR 的详细信息

$ openssl req -noout -text -in server.csr

  • 现在,您必须将此证书签名请求(CSR)发送给证书颁发机构(CA)进行签名。一旦签署了 CSR,您将拥有一个真实的证书,可供 Apache 使用。您可以使 CSR 由商业 CA 签名,也可以创建自己的 CA 对其进行签名。
    商业 CA 通常会要求您将 CSR 发布到 Web 表单中,为签名付费,然后发送签名的证书,您可以将其存储在 server.crt 文件中。
    有关如何创建自己的 CA 并将其用于签署 CSR 的详细信息,请参阅below
    签署 CSR 后,您可以看到证书的详细信息,如下所示:

$ openssl x509 -noout -text -in server.crt

  • 您现在应该有两个文件:server.keyserver.crt。这些可以在httpd.conf文件中按如下方式使用:
SSLCertificateFile    "/path/to/this/server.crt"
SSLCertificateKeyFile "/path/to/this/server.key"

不再需要server.csr文件。

如何创建和使用自己的证书颁发机构(CA)?

简短的答案是使用 OpenSSL 提供的CA.shCA.pl脚本。除非您有充分的理由不这样做,否则应将其优先使用。如果不能,则可以如下创建自签名证书:

  • 为您的服务器创建 RSA 私钥(将采用 Triple-DES 加密和 PEM 格式):

    $ openssl genrsa -des3 -out server.key 2048

请备份此server.key文件和您在安全位置 Importing 的密码。您可以使用以下命令查看此 RSA 私钥的详细信息:

$ openssl rsa -noout -text -in server.key

如有必要,您还可以使用以下方法创建此 RSA 私钥的解密的 PEM 版本(不推荐):

$ openssl rsa -in server.key -out server.key.unsecure

  • 使用刚刚创建的 RSA 密钥创建一个自签名证书(X509 结构)(输出将采用 PEM 格式):

$ openssl req -new -x509 -nodes -sha1 -days 365 -key server.key -out server.crt -extensions usr_cert

这将签署服务器 CSR,并生成server.crt文件。
您可以使用以下命令查看此证书的详细信息:

$ openssl x509 -noout -text -in server.crt

如何更改私钥文件上的密码?

您只需要使用旧密码来读取它,然后指定新的密码就可以再次写它。您可以使用以下命令完成此操作:

$ openssl rsa -des3 -in server.key -out server.key.new
$ mv server.key.new server.key

第一次要求 Importing PEM 密码时,应 Importing 旧密码。之后,系统会再次要求您 Importing 密码-这次,请使用新的密码。如果要求您验证密码短语,则需要再次 Importing 新的密码短语。

如何在 Apache 启动时摆脱密码对话框?

在启动和每次重新启动时都会弹出此对话框的原因是,出于安全原因,server.key 文件中的 RSA 私钥以加密格式存储。需要密码来解密此文件,以便可以读取和解析该文件。删除密码短语会消除服务器的安全性-请谨慎操作!

  • 从 RSA 私钥中删除加密(同时保留原始文件的备份副本):

    $ cp server.key server.key.org
    $ openssl rsa -in server.key.org -out server.key

  • 确保 server.key 文件仅可由 root 用户读取:

$ chmod 400 server.key

现在server.key包含密钥的未加密副本。如果将服务器指向此文件,它将不会提示您 Importing 密码。但是,如果有人获得了此密钥,他们将可以在网络上模拟您。请确保对该文件的权限使得只有 root 或 Web 服务器用户才能读取它(最好让您的 Web 服务器以 root 身份启动但以另一个用户身份运行,并且密钥只能由 root 读取)。

作为一种替代方法,您可以使用```+670+`''工具。请记住,这当然既不安全也不安全。

如何验证私钥是否与其证书匹配?

私钥包含一系列数字。这些数字中的两个构成“公钥”,其他则属于“私钥”。生成 CSR 时会包括“公钥”位,这些位随后成为关联证书的一部分。

要检查证书中的公钥是否与私钥的公有部分匹配,您只需要比较这些数字即可。要查看证书和密钥,请运行以下命令:

$ openssl x509 -noout -text -in server.crt
$ openssl rsa -noout -text -in server.key

密钥和证书中的“模数”和“公共指数”部分必须匹配。由于公共指数通常为 65537,并且很难直观地检查长模数是否相同,因此可以使用以下方法:

$ openssl x509 -noout -modulus -in server.crt | openssl md5
$ openssl rsa -noout -modulus -in server.key | openssl md5

这样就剩下两个比较短的数字来比较。从理论上讲,这些数字可能是相同的,而模数却不相同,但是这种可能性绝大部分。

如果您希望检查特定 CSR 属于哪个密钥或证书,可以对 CSR 执行相同的计算,如下所示:

$ openssl req -noout -modulus -in server.csr | openssl md5

如何将证书从 PEM 转换为 DER 格式?

OpenSSL 的默认证书格式是 PEM,它是 Base64 编码的 DER,带有页眉和页脚行。对于某些应用程序(例如 Microsoft Internet Explorer),您需要使用纯 DER 格式的证书。您可以使用以下命令将 PEM 文件cert.pem转换为相应的 DER 文件cert.der$ openssl x509 -in cert.pem -out cert.der -outform DER

为什么浏览器抱怨无法验证我的服务器证书?

发生这种情况的原因之一是因为您的服务器证书是由中间 CA 签名的。各种 CA,例如 Verisign 或 Thawte,已经开始不使用根证书而是使用中间证书来签署证书。

中间 CA 证书位于根 CA 证书(已安装在浏览器中)和服务器证书(已安装在服务器上)之间。为了使浏览器能够遍历并验证从服务器证书到根证书的信任链,需要为其提供中间证书。 CA 应该能够为您提供可以安装在服务器上的中间证书包。

您需要在SSLCertificateChainFile指令中包括这些中间证书。

SSL 协议

在服务器负载沉重的情况下,为什么会出现很多随机 SSL 协议错误?

可能有多种原因,但是主要的原因是SSLSessionCache指令指定的 SSL 会话缓存存在问题。 DBM 会话高速缓存是最有可能导致此问题的原因,因此使用 SHM 会话高速缓存(或完全不使用高速缓存)可能会有所帮助。

我的 Web Service 器现在可以提供 SSL 加密的流量,为什么它的负载更高?

SSL 使用强大的加密加密,这需要进行大量的数字运算。当您通过 HTTPS 请求网页时,所有内容(甚至图像)在传输之前都已加密。因此,HTTPS 流量增加导致负载增加。

为什么到服务器的 HTTPS 连接有时最多需要 30 秒才能构建连接?

这通常是由SSLRandomSeed/dev/random设备引起的,该设备阻止 read(2)调用,直到有足够的熵可用于处理请求。有关更多信息,请参见参考手册中的SSLRandomSeed指令。

mod_ssl 支持哪些 SSL 密码?

通常,mod_ssl支持使用的 OpenSSL 版本支持的任何 SSL 密码。可用的密码取决于您构建 OpenSSL 的方式。通常,至少支持以下密码:

  • 带有 SHA1 的 RC4

  • AES 与 SHA1

  • 具有 SHA1 的三重 DES

要确定可用密码的实际列表,应运行以下命令:

$ openssl ciphers -v

尝试使用匿名 Diffie-Hellman(ADH)密码时,为什么会出现“无共享密码”错误?

默认情况下,出于安全原因,OpenSSL 不允许允许 ADH 密码。如果选择启用这些密码,请确保您已意识到潜在的副作用。

为了使用匿名 Diffie-Hellman(ADH)密码,必须使用``````+718+`''添加到SSLCipherSuite中。

连接到新安装的服务器时,为什么会出现“无共享密码”错误?

要么您在SSLCipherSuite指令中犯了一个错误(将其与extra/httpd-ssl.conf中的预配置示例进行比较),要么在生成私钥并忽略或忽略了警告时选择使用 DSA/DH 算法而不是 RSA。如果选择了 DSA/DH,则服务器无法使用基于 RSA 的 SSL 密码进行通信(至少在配置其他基于 RSA 的证书/密钥对之前)。像 NS 或 IE 这样的现代浏览器只能使用 RSA 密码通过 SSL 进行通信。结果是“没有共享密码”错误。要解决此问题,请使用 RSA 算法重新生成服务器证书/密钥对。

为什么不能对基于名称/基于非 IP 的虚拟主机使用 SSL?

原因是非常技术性的,还有一个“鸡和蛋”的问题。 SSL 协议层位于 HTTP 协议层之下,并封装 HTTP。构建 SSL 连接(HTTPS)后,Apache/mod_ssl 必须与 Client 端协商 SSL 协议参数。为此,mod_ssl 必须咨询虚拟服务器的配置(例如,它必须寻找密码套件,服务器证书等)。但是,为了转到正确的虚拟服务器,Apache 必须知道Host HTTP Headers 字段。为此,必须读取 HTTP 请求 Headers。无法在 SSL 握手完成之前完成此操作,但是需要信息才能完成 SSL 握手阶段。请参阅下一个问题,以了解如何规避此问题。

请注意,如果您具有通配符 SSL 证书,或者使用 subjectAltName 字段在其上具有多个主机名的证书,则可以在基于名称的虚拟主机上使用 SSL,而无需其他解决方法。

是否可以使用基于名称的虚拟主机来标识不同的 SSL 虚拟主机?

基于名称的虚拟主机是一种识别不同虚拟主机的非常流行的方法。它允许您将相同的 IP 地址和相同的端口号用于许多不同的站点。当人们 continue 使用 SSL 时,很自然地假设可以使用同一方法在同一服务器上具有许多不同的 SSL 虚拟主机。

可能的,但是仅当使用 2.2.12 或更高版本的 Web 服务器(使用 0.9.8j 或更高版本的 OpenSSL 构建)时才可行。这是因为它要求仅添加 SSL 规范的最新修订(即服务器名称指示(SNI))的功能。

请注意,如果您具有通配符 SSL 证书,或者使用 subjectAltName 字段在其上具有多个主机名的证书,则可以在基于名称的虚拟主机上使用 SSL,而无需其他解决方法。

原因是 SSL 协议是封装 HTTP 协议的单独层。因此,SSL 会话是一个单独的事务,发生在 HTTP 会话开始之前。服务器在 IP 地址 X 和端口 Y(通常为 443)上收到 SSL 请求。由于 SSL 请求不包含任何 Host:字段,因此服务器无法决定要使用哪个 SSL 虚拟主机。通常,它只使用找到的第一个与指定的端口和 IP 地址匹配的地址。

但是,如果使用的 Web 服务器和 OpenSSL 版本支持 SNI,并且 Client 端的浏览器也支持 SNI,则主机名将包含在原始 SSL 请求中,并且 Web 服务器可以选择正确的 SSL 虚拟主机。

当然,您可以使用基于名称的虚拟主机来识别许多非 SSL 虚拟主机(例如,全部在端口 80 上),然后拥有一个 SSL 虚拟主机(在端口 443 上)。但是,如果这样做,则必须确保将非 SSL 端口号放在 NameVirtualHost 指令上,例如

NameVirtualHost 192.168.1.1:80

其他解决方法包括:

为不同的 SSL 主机使用单独的 IP 地址。对不同的 SSL 主机使用不同的端口号。

如何使 SSL 压缩正常工作?

尽管 SSL 压缩协商是在 SSLv2 和 TLS 规范中定义的,但直到 2004 年 5 月,RFC 3749 才将 DEFLATE 定义为可协商的标准压缩方法。

使用zlib选项进行编译时,默认情况下,OpenSSL 0.9.8 开始支持此功能。如果 Client 端和服务器均支持压缩,则将使用压缩。但是,大多数 Client 端仍然尝试最初与 SSLv2 Hello 连接。由于 SSLv2 在其握手过程中未包含一系列首选的压缩算法,因此无法与这些 Client 端协商压缩。如果 Client 端禁用对 SSLv2 的支持,则取决于所使用的 SSL 库,可能会发送 SSLv3 或 TLS Hello,并且可能会设置压缩。您可以通过记录%{SSL_COMPRESS_METHOD}x变量来验证 Client 端是否利用 SSL 压缩。

当我通过 HTTPS 使用基本身份验证时,弹出对话框时,Netscape 浏览器中的锁定图标将保持解锁状态。这是否意味着用户名/密码未加密发送?

否,用户名/密码以加密方式传输。 Netscape 浏览器中的图标实际上并未与 SSL/TLS 层同步。仅当传输实际网页数据的第一部分时,它才会切换到锁定状态,这可能会使人们感到困惑。基本身份验证功能是 HTTP 层的一部分,它位于 HTTPS 的 SSL/TLS 层之上。在 HTTPS 中进行任何 HTTP 数据通信之前,SSL/TLS 层已完成其握手阶段,并已切换为加密通信。因此,请勿对此图标感到困惑。

在使用旧版本的 Microsoft Internet Explorer(MSIE)通过 HTTPS 连接到 Apache mod_ssl 服务器时,为什么会出现 I/O 错误?

第一个原因是,某些 MSIE 版本中的 SSL 实现存在一些与 HTTP 保持活动功能有关的细微错误,并且套接字连接关闭时 SSL 关闭通知警报。此外,在某些 MSIE 版本中,SSL 和 HTTP/1.1 功能之间的交互存在问题。您可以通过强制 Apache 不使用 HTTP/1.1,保持活动连接或将 SSL 关闭通知消息发送给 MSIE Client 端来解决这些问题。可以通过在可识别 SSL 的虚拟主机部分中使用以下指令来完成此操作:

SetEnvIf User-Agent "MSIE [2-5]" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

此外,某些 MSIE 版本在特定密码方面存在问题。不幸的是,这不可能实现特定于 MSIE 的解决方法,因为早在 SSL 握手阶段就需要密码。因此,特定于 MSIE 的SetEnvIf不能解决这些问题。相反,您将不得不对全局参数进行更大幅度的调整。在您决定这样做之前,请确保您的 Client 确实有问题。如果没有,请不要进行这些更改-它们会影响您的所有 Client 端(MSIE 或其他)。

如何启用 TLS-SRP?

TLS-SRP(用于 TLS 的安全远程密码密钥交换,在 RFC 5054 中指定)可以补充或替换认证 SSL 连接的证书。要使用 TLS-SRP,请将SSLSRPVerifierFile指令设置为指向 OpenSSL SRP 验证程序文件。要创建验证程序文件,请使用openssl工具:

openssl srp -srpvfile passwd.srpv -add username

创建此文件后,在 SSL 服务器配置中指定它:

SSLSRPVerifierFile /path/to/passwd.srpv

要强制 Client 端使用非证书的 TLS-SRP 密码套件,请使用以下指令:

SSLCipherSuite "!DSS:!aRSA:SRP"

使用超过 1024 位的证书时,为什么与基于 Java 的 Client 端发生握手失败?

从版本 2.4.7 开始,mod_ssl将使用 DH 参数,其中包括长度超过 1024 位的质数。但是,Java 7 和更早版本将其对 DH 素数大小的支持限制为最大 1024 位。

如果基于 Java 的 Client 端因java.lang.RuntimeException: Could not generate DH keypairjava.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 1024 (inclusive)之类的异常而中止,并且 httpd 日志tlsv1 alert internal error (SSL alert number 80)(在LogLevel info或更高级别),则可以将SSLCipherSuite重新安排 mod_ssl 的密码列表(可能与SSLHonorCipherOrder结合使用),或者可以使用自定义 DH 具有 1024 位素数的参数,这些参数始终优先于任何内置 DH 参数。

要生成自定义 DH 参数,请使用openssl dhparam 1024命令。或者,您可以使用RFC 2409第 6.2 节中的以下标准 1024 位 DH 参数:

-----BEGIN DH PARAMETERS-----
MIGHAoGBAP//////////yQ/aoiFowjTExmKLgNwc0SkCTgiKZ8x0Agu+pjsTmyJR
Sgh5jjQE3e+VGbPNOkMbMCsKbfJfFDdP4TVtbVHCReSFtXZiXn7G9ExC6aY37WsL
/1y29Aa37e44a/taiZ+lrp8kEXxLH+ZJKGZR7OZTgf//////////AgEC
-----END DH PARAMETERS-----

将自定义参数(包括“ BEGIN DH PARAMETERS”和“ END DH PARAMETERS”)添加到使用SSLCertificateFile指令配置的第一个证书文件的末尾。

mod_ssl Support

如果有 mod_ssl 问题,可以使用哪些信息资源?

以下信息资源可用。如有问题,请先在这里搜索。

  • 用户手册的常见问题解答中的答案 Lists(这个)

如果出现 mod_ssl 问题,可以使用哪些支持联系方式?

以下按优先 Sequences 列出了对 mod_ssl 的所有支持可能性。请按此 Sequences尝试这些可能性-不要只选择您喜欢的外观。

  • 将问题报告发送到 Apache httpd 用户支持邮件列表
    [email protected]
    这是提交问题报告的第二种方法。同样,您必须首先订阅该列表,但是然后您可以与整个 Apache httpd 用户社区轻松讨论您的问题。

  • 在错误数据库中写入问题报告
    http://httpd.apache.org/bug_report.html
    这是提交问题报告的最后一种方法。仅当您已经张贴到邮件列表并且没有成功时,才应该这样做。请认真遵守上一页的指示。

编写错误报告时应提供哪些信息?

您应始终至少提供以下信息:

  • Apache httpd 和 OpenSSL 版本信息

    • 可以通过运行httpd -v确定 Apache 版本。可以通过运行openssl version来确定 OpenSSL 版本。或者,如果已安装 Lynx,则可以运行命令lynx -mime_header http://localhost/ | grep Server一步收集该信息。
  • 有关如何构建和安装 Apache httpd 和 OpenSSL 的详细信息

    • 为此,您可以提供终端会话的日志文件,其中显示了配置和安装步骤。如果不可能,则至少应提供您使用的configure命令行。
  • 如果发生核心转储,请包含回溯

    • 如果您的 Apache httpd 转储了其核心,请附加一个堆栈框架的``backtrace''(有关如何获取此信息的信息,请参见below)。需要此信息才能找到导致核心转储的原因。
  • 您的问题的详细说明

    • 不要笑,我们真的是真的!许多问题报告并未包含对实际问题的描述。没有这个,任何人都很难帮助您。因此,请尽可能包含尽可能多的细节,这符合您的个人利益(您想解决问题,不是吗?)。当然,您仍然应该包括上面所有的要点。

我有一个核心转储,您能帮我吗?

通常,除非您提供有关 Apache 转储内核的代码位置的更多详细信息,否则至少不会。为了帮助您,通常总是需要回溯(请参阅下一个问题)。没有这些信息,几乎不可能找到问题并帮助您解决问题。

如何获取回溯信息以帮助查找核心转储的原因?

以下是完成回溯所需完成的步骤:

  • 确保至少在 Apache 中具有可用的调试符号。在使用 GCC/GDB 的平台上,必须使用``````+782+`''。

  • 启动服务器,然后尝试重现核心转储。为此,您可能需要使用类似```+783++784++785++786++787+``+788+`以强制 Apache 不进行分叉。

  • 分析核心转储。为此,请运行gdb /path/to/httpd /tmp/httpd.core或类似的命令。在 GDB 中,您所需要做的就是 Importingbt,瞧,您将获得回溯。对于其他调试器,请查阅本地调试器手册。