<-
Apache > HTTP Server > 文档 > 版本 2.4 > SSL/TLS

SSL/TLS 强加密:常见问题解答

可用语言:  en  |  fr 

智者不给出正确答案,他提出正确的问题。

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

Support Apache!

另请参阅

top

安装

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

诸如“mod_ssl: 子进程无法打开 SSLMutex 锁定文件 /opt/apache/logs/ssl_mutex.18332(系统错误如下)[...] 系统:权限被拒绝(errno: 13)”之类的错误通常是由目录上的过度限制性权限引起的。确保所有父目录(此处为 /opt/opt/apache/opt/apache/logs)都为 Apache 子进程运行的 UID 设置了 x 位(至少)。(请参阅 User 指令)。

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

加密软件需要一个不可预测数据的来源才能正常工作。许多开源操作系统提供一个“随机性设备”来实现此目的(通常名为 /dev/random)。在其他系统上,应用程序必须在生成密钥或执行公钥加密之前,使用适当的数据手动为 OpenSSL 伪随机数生成器 (PRNG) 播种。从 0.9.5 版本开始,需要随机性的 OpenSSL 函数如果 PRNG 未播种至少 128 位随机性,则会报告错误。

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

top

配置

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

可以。HTTP 和 HTTPS 使用不同的服务器端口(HTTP 绑定到端口 80,HTTPS 绑定到端口 443),因此它们之间没有直接冲突。您可以运行绑定到这些端口的两个独立的服务器实例,或者使用 Apache 的优雅虚拟主机功能创建两个虚拟服务器,这两个服务器都由 Apache 的同一个实例提供服务 - 一个通过 HTTP 响应端口 80 上的请求,另一个通过 HTTPS 响应端口 443 上的请求。

HTTPS 使用哪个端口?

您可以在任何端口上运行 HTTPS,但标准指定端口 443,这是任何符合 HTTPS 的浏览器默认情况下会查找的端口。您可以通过在 URL 中指定端口来强制浏览器查找其他端口。例如,如果您的服务器设置为在端口 8080 上通过 HTTPS 提供页面,则可以在 https://example.com:8080/ 处访问它们。

如何手动进行 HTTPS 通信以进行测试?

虽然您通常只使用

$ telnet localhost 80
GET / HTTP/1.0

用于通过 HTTP 对 Apache 进行简单测试,但对于 HTTPS 来说并不容易,因为 TCP 和 HTTP 之间存在 SSL 协议。但是,借助 OpenSSL 的 s_client 命令,您可以通过 HTTPS 进行类似的检查

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

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

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

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

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

为什么当我尝试通过 HTTPS 访问新安装的 Apache+mod_ssl 服务器时,会收到“连接被拒绝”消息?

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

为什么我的 CGI 和 SSI 脚本无法使用 SSL_XXX 变量?

请确保您已为 CGI/SSI 请求的上下文启用了“SSLOptions +StdEnvVars”。

如何在相对超链接中切换 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。(将 SSL 替换为 NOSSL 以切换到 HTTP。)

top

证书

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

RSA 私钥文件是一个数字文件,您可以使用它来解密发送给您的消息。它有一个公共组件,您可以分发(通过您的证书文件),这允许人们将这些消息加密到您。

证书签名请求 (CSR) 是一个数字文件,其中包含您的公钥和您的姓名。您将 CSR 发送到证书颁发机构 (CA),CA 将通过对其进行签名将其转换为真实的证书。

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

有关 SSL 协议的总体描述,请参阅 简介 章节。

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

是的。通常,使用内置的 mod_ssl 启动 Apache 与不使用它启动 Apache 是一样的。但是,如果您在 SSL 私钥文件上设置了密码短语,则会弹出一个启动对话框,要求您输入密码短语。

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

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

  1. 确保 OpenSSL 已安装并在您的 PATH 中。

  2. 运行以下命令,以创建 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"
  3. 重要的是,您必须意识到此 server.key 没有任何密码短语。要向密钥添加密码短语,您应该运行以下命令,并按要求输入和验证密码短语。

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

    请将 server.key 文件和您输入的密码短语备份到安全位置。

如何创建真实的 SSL 证书?

以下是分步说明

  1. 确保 OpenSSL 已安装并在您的 PATH 中。

  2. 为您的 Apache 服务器创建一个 RSA 私钥(将使用 Triple-DES 加密并以 PEM 格式存储)

    $ openssl genrsa -des3 -out server.key 2048

    请将此 server.key 文件和您输入的密码短语备份到安全位置。您可以使用以下命令查看此 RSA 私钥的详细信息

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

    如有必要,您还可以使用以下命令创建此 RSA 私钥的未加密 PEM 版本(不推荐)

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

  3. 使用服务器 RSA 私钥创建证书签名请求 (CSR)(输出将以 PEM 格式存储)

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

    当 OpenSSL 提示您输入“CommonName”时,请确保输入服务器的 FQDN(“完全限定域名”),即,当您为稍后将通过 https://www.foo.dom/ 访问的网站生成 CSR 时,在此处输入“www.foo.dom”。您可以使用以下命令查看此 CSR 的详细信息

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

  4. 您现在必须将此证书签名请求 (CSR) 发送到证书颁发机构 (CA) 以进行签名。CSR 签名后,您将拥有一个真实的证书,可以由 Apache 使用。您可以让商业 CA 签名 CSR,也可以创建自己的 CA 来签名。
    商业 CA 通常会要求您将 CSR 发布到 Web 表单中,支付签名费用,然后发送一个签名的证书,您可以将其存储在 server.crt 文件中。
    有关如何创建自己的 CA 以及如何使用它来签名 CSR 的详细信息,请参阅 以下内容。
    CSR 签名后,您可以使用以下命令查看证书的详细信息

    $ openssl x509 -noout -text -in server.crt
  5. 您现在应该有两个文件:server.keyserver.crt。这些可以在您的 httpd.conf 文件中按如下方式使用
    SSLCertificateFile    "/path/to/this/server.crt"
    SSLCertificateKeyFile "/path/to/this/server.key"
    server.csr 文件不再需要。

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

简而言之,可以使用 OpenSSL 提供的 CA.shCA.pl 脚本。除非有充分的理由,否则应优先使用这些脚本。如果无法使用,可以按照以下步骤创建自签名证书:

  1. 为您的服务器创建一个 RSA 私钥(将使用 Triple-DES 加密并以 PEM 格式存储)

    $ openssl genrsa -des3 -out server.key 2048

    请将此 server.key 文件和您输入的密码短语备份到安全位置。您可以使用以下命令查看此 RSA 私钥的详细信息

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

    如有必要,您还可以使用以下命令创建此 RSA 私钥的未加密 PEM 版本(不推荐)

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

  2. 使用刚刚创建的 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

第一次提示输入 PEM 密码时,应输入旧密码。之后,将再次提示您输入密码 - 这次,使用新密码。如果要求您验证密码,则需要再次输入新密码。

如何在 Apache 启动时消除密码短语对话框?

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

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

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

  2. 确保 server.key 文件只能由 root 用户读取

    $ chmod 400 server.key

现在 server.key 包含密钥的未加密副本。如果将服务器指向此文件,它不会提示您输入密码。但是,如果任何人获得了此密钥,他们将能够在网络上冒充您。请确保此文件的权限设置为只有 root 用户或 Web 服务器用户可以读取它(最好让您的 Web 服务器以 root 用户身份启动,但以其他用户身份运行,并且密钥只能由 root 用户读取)。

作为另一种方法,可以使用 ``SSLPassPhraseDialog exec:/path/to/program'' 功能。请记住,这既不更安全也不更不安全。

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

私钥包含一系列数字。其中两个数字构成“公钥”,其他数字构成“私钥”的一部分。“公钥”位包含在您生成 CSR 时,并随后成为相关证书的一部分。

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

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

密钥和证书中的 moduluspublic exponent 部分必须匹配。由于公钥通常为 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 指令一起包含。

top

SSL 协议

为什么在服务器负载过重的情况下会遇到很多随机的 SSL 协议错误?

这可能有多种原因,但主要原因是 SSLSessionCache 指令指定的 SSL 会话缓存存在问题。DBM 会话缓存是最有可能出现问题的地方,因此使用 SHM 会话缓存(或根本不使用缓存)可能会有所帮助。

为什么我的 Web 服务器现在提供 SSL 加密流量后负载更高?

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

为什么我的服务器上的 HTTPS 连接有时需要长达 30 秒才能建立连接?

这通常是由 SSLRandomSeed/dev/random 设备引起的,该设备会阻塞 read(2) 调用,直到有足够的熵来服务请求。有关 SSLRandomSeed 指令的更多信息,请参阅参考手册。

mod_ssl 支持哪些 SSL 密码?

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

  1. 使用 SHA1 的 RC4
  2. 使用 SHA1 的 AES
  3. 使用 SHA1 的 Triple-DES

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

$ openssl ciphers -v

为什么在尝试使用匿名 Diffie-Hellman (ADH) 密码时会收到“没有共享密码”错误?

默认情况下,OpenSSL 出于安全原因不允许 ADH 密码。请确保您了解启用这些密码的潜在副作用。

为了使用匿名 Diffie-Hellman (ADH) 密码,您必须使用 ``-DSSL_ALLOW_ADH'' 构建 OpenSSL,然后将 ``ADH'' 添加到您的 SSLCipherSuite 中。

为什么在连接到新安装的服务器时会收到“没有共享密码”错误?

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

为什么我无法将 SSL 与基于名称/非基于 IP 的虚拟主机一起使用?

原因非常技术性,并且是一个有点“鸡和蛋”的问题。SSL 协议层位于 HTTP 协议层之下,并封装 HTTP。当建立 SSL 连接(HTTPS)时,Apache/mod_ssl 必须与客户端协商 SSL 协议参数。为此,mod_ssl 必须咨询虚拟服务器的配置(例如,它必须查找密码套件、服务器证书等)。但是,为了转到正确的虚拟服务器,Apache 必须知道 Host HTTP 标头字段。为此,必须读取 HTTP 请求标头。这在 SSL 握手完成之前无法完成,但完成 SSL 握手阶段需要此信息。有关如何规避此问题的说明,请参见下一个问题。

请注意,如果您有通配符 SSL 证书,或者证书使用 subjectAltName 字段包含多个主机名,那么您可以在基于名称的虚拟主机上使用 SSL,无需进一步的解决方法。

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

基于名称的虚拟主机是一种非常流行的识别不同虚拟主机的方法。它允许您对许多不同的站点使用相同的 IP 地址和相同的端口号。当人们迁移到 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 地址匹配的虚拟主机。

但是,如果您使用的是支持 SNI 的 Web 服务器和 OpenSSL 版本,并且客户端的浏览器也支持 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 定义为可协商的标准压缩方法。

OpenSSL 0.9.8 在使用 `zlib` 选项编译时,默认开始支持此功能。如果客户端和服务器都支持压缩,则会使用它。但是,大多数客户端仍然尝试使用 SSLv2 Hello 初始连接。由于 SSLv2 在其握手过程中不包含首选压缩算法数组,因此无法与这些客户端协商压缩。如果客户端禁用对 SSLv2 的支持,则可能会发送 SSLv3 或 TLS Hello,具体取决于使用哪个 SSL 库,并且可以设置压缩。您可以通过记录 `%{SSL_COMPRESS_METHOD}x` 变量来验证客户端是否使用 SSL 压缩。

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

不,用户名/密码是加密传输的。Netscape 浏览器中的图标实际上并没有与 SSL/TLS 层同步。它只会在实际网页数据的第一部分传输时切换到锁定状态,这可能会让人感到困惑。基本身份验证功能是 HTTP 层的一部分,它位于 HTTPS 中的 SSL/TLS 层之上。在 HTTPS 中进行任何 HTTP 数据通信之前,SSL/TLS 层已经完成了其握手阶段,并切换到加密通信。所以不要被这个图标迷惑。

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

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

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

此外,某些 MSIE 版本在特定密码方面存在问题。不幸的是,无法为此实现 MSIE 特定的解决方法,因为密码在 SSL 握手阶段就需要。因此,MSIE 特定的 `SetEnvIf` 无法解决这些问题。相反,您将不得不对全局参数进行更大幅度的调整。在您决定这样做之前,请确保您的客户端确实存在问题。如果没有,请不要进行这些更改 - 它们会影响您所有客户端,无论是 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

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

SSLCipherSuite "!DSS:!aRSA:SRP"

为什么在使用证书超过 1024 位时,使用基于 Java 的客户端会遇到握手失败?

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

如果您的基于 Java 的客户端因异常而中止,例如 `java.lang.RuntimeException: Could not generate DH keypair` 和 `java.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`(可能与 `SSLHonorCipherOrder` 结合使用)重新排列 mod_ssl 的密码列表,或者您可以使用具有 1024 位素数的自定义 DH 参数,它将始终优先于任何内置 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` 指令配置的第一个证书文件的末尾。

top

mod_ssl 支持

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

以下信息资源可用。如果出现问题,您应该首先在此处搜索。

用户手册中的常见问题解答列表(本节)中的答案
https://httpd.apache.org/docs/2.4/ssl/ssl_faq.html
首先检查常见问题解答(本节)。如果您的问题是常见问题,它可能以前被多次解答,并已包含在本文档中。

如果出现 mod_ssl 问题,有哪些支持联系人可用?

以下列出了 mod_ssl 的所有支持可能性,按优先级排序。请按此顺序浏览这些可能性 - 不要只选择您喜欢的那个。

  1. 向 Apache httpd 用户支持邮件列表发送问题报告
    [email protected]
    这是提交问题报告的第二种方式。同样,您必须先订阅该列表,但随后您可以轻松地与整个 Apache httpd 用户社区讨论您的问题。
  2. 在错误数据库中编写问题报告
    https://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 转储其核心,请附加一个堆栈帧“回溯”(有关如何获取此信息,请参见 下面)。需要此信息才能找到核心转储的原因。
您问题的详细描述
别笑,我们真的意思是!许多问题报告没有包含实际问题的描述。没有它,任何人都很难帮助您。因此,为了您自己的利益(您希望问题得到解决,不是吗?),请尽可能详细地包含信息。当然,您也应该包含上面所有必需的信息。

我遇到了核心转储,你能帮我吗?

一般来说,不,至少除非您提供有关 Apache 转储核心代码位置的更多详细信息。通常,为了帮助您,始终需要回溯(见下一个问题)。没有此信息,几乎不可能找到问题并帮助您解决它。

如何获取回溯,以帮助找到核心转储的原因?

以下是您需要完成的步骤,以获取回溯

  1. 确保您有调试符号可用,至少在 Apache 中。在使用 GCC/GDB 的平台上,您将不得不使用“`OPTIM="-g -ggdb3"`”来构建 Apache+mod_ssl 以获得它。在其他平台上,至少需要“`OPTIM="-g"`”。
  2. 启动服务器并尝试重现核心转储。为此,您可能需要使用类似“`CoreDumpDirectory /tmp`”的指令,以确保可以写入核心转储文件。这应该会导致 ` /tmp/core` 或 ` /tmp/httpd.core` 文件。如果您没有得到其中一个,请尝试在非 root UID 下运行您的服务器。出于安全原因,许多现代内核不允许进程在执行 `setuid()` 后转储核心(除非它执行 `exec()`)(因为内存中可能存在特权信息)。如有必要,您可以手动运行 ` /path/to/httpd -X` 来强制 Apache 不进行分叉。
  3. 分析核心转储。为此,运行 `gdb /path/to/httpd /tmp/httpd.core` 或类似的命令。在 GDB 中,您只需输入 `bt`,瞧,您将获得回溯。对于其他调试器,请查阅您的本地调试器手册。

可用语言:  en  |  fr 

top

评论

注意
这不是问答部分。此处放置的评论应指向有关改进文档或服务器的建议,如果它们被实施或被认为无效/主题无关,可能会被我们的版主删除。有关如何管理 Apache HTTP Server 的问题应发送到我们的 IRC 频道 #httpd(在 Libera.chat 上)或发送到我们的 邮件列表