• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 常见问题

    安装

    • 当我启动 Apache 时,为什么会收到与 SSLMutex 相关的权限错误?
    • 当我启动 Apache 时,为什么 mod_ssl 会因错误“无法生成临时 512 位 RSA 私有 key”而停止?

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

    诸如“mod_ssl: Child could not open SSLMutex lockfile /opt/apache/logs/ssl_mutex.18332(System error follows)[...] System: Permission denied(errno: 13)”之类的错误通常是由 parent 目录上的过度限制性权限引起的。确保所有 parent 目录(此处为/opt/opt/apache/opt/apache/logs)的 x-bit 至少设置为 Apache 的子项运行的 UID(参见用户指令)。

    当我启动 Apache 时,为什么 mod_ssl 会因错误“无法生成临时 512 位 RSA 私有 key”而停止?

    加密软件需要不可预测的数据源才能正常工作。许多开源操作系统提供了用于此目的的“随机设备”(通常名为/dev/random)。在其他系统上,applications 必须在生成密钥或执行公共 key 加密之前,使用适当的数据手动为 OpenSSL 伪随机数 Generator(PRNG)播种。从 version 0.9.5 开始,如果 PRNG 没有播种至少 128 位的随机性,那么需要随机性的 OpenSSL 函数会报告错误。

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

    Configuration

    • 是否可以从同一台服务器提供 HTTP 和 HTTPS?
    • HTTPS 使用哪个 port?
    • 为了测试目的,我如何手动说 HTTPS?
    • 当我连接到 SSL-aware Apache 服务器时,为什么连接会挂起?
    • 当尝试通过 HTTPS 访问我新安装的 Apache mod_ssl 服务器时,为什么会出现“连接被拒绝”错误?
    • 为什么我的 CGI 和 SSI 脚本无法使用 SSL_XXX 变量?
    • 如何在相对超链接中切换 HTTP 和 HTTPS?

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

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

    HTTPS 使用哪个 port?

    您可以在任何 port 上运行 HTTPS,但标准指定 port 443,这是默认情况下任何 HTTPS 兼容浏览器的外观。您可以通过在 URL 中指定浏览器来强制浏览器查看其他 port。例如,如果您的服务器设置为在 port 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 握手的详细信息。对于更通用的命令 line client,它可以直接理解 HTTP 和 HTTPS,可以执行 GET 和 POST 操作,可以使用代理,支持字节范围等等,你应该看一下漂亮的卷曲工具。使用此方法,您可以检查 Apache 是否通过 HTTP 和 HTTPS 正确响应请求,如下所示:

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

    为什么连接到我的 SSL-aware Apache 服务器时连接会挂起?

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

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

    错误的 configuration 可能导致此错误。请确保听指令匹配您的<VirtualHost>指令。如果所有其他方法都失败了,请使用mod_ssl提供的默认 configuration 重新开始。

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

    请确保为 CGI/SSI 请求的 context 启用了“SSLOptions +StdEnvVars”。

    如何在相对超链接中切换 HTTP 和 HTTPS?

    通常,要在 HTTP 和 HTTPS 之间切换,您必须使用 fully-qualified 超链接(因为您必须更改 URL scheme)。但是,使用modrewrite,您可以操纵相对超链接,以达到相同的效果。

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

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

    证书

    • 什么是 RSA 私钥,CSR 和证书?
    • non-SSL-aware Apache 和 SSL-aware Apache 之间的启动是否存在差异?
    • 如何为测试目的创建 self-signed SSL 证书?
    • 如何创建真正的 SSL 证书?
    • 如何创建和使用我自己的证书 Authority(CA)?
    • 如何更改私有 key 文件的 pass-phrase?
    • 如何摆脱 Apache 启动 time 时的 pass-phrase 对话框?
    • 如何验证私有 key 是否与其证书匹配?
    • 如何将证书从 PEM 转换为 DER 格式?
    • 为什么浏览器会抱怨他们无法验证我的服务器证书?

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

    RSA 私有 key 文件是一个数字文件,可用于解密发送给您的邮件。它有一个公共 component(你通过你的证书文件分发),允许人们加密这些消息给你。

    证书签名请求(CSR)是一个包含公共 key 和 name 的数字文件。您将 CSR 发送给 Certifying Authority(CA),通过签名将其转换为真实证书。

    证书包含您的 RSA 公共 key,您的 name,CA 的 name,并由 CA 进行数字签名。知道 CA 的浏览器可以验证该证书上的签名,从而获得您的 RSA 公钥 key。这使他们能够发送只能解密的消息。

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

    non-SSL-aware Apache 和 SSL-aware Apache 之间的启动是否存在差异?

    是。通常,使用mod_ssl built-in 启动 Apache 就像在没有它的情况下启动 Apache 一样。但是,如果您的 SSL 私有 key 文件上有密码短语,则会弹出一个启动对话框,要求您输入密码短语。

    在启动服务器时必须手动输入密码可能会有问题- 例如,从系统 boot 脚本启动服务器时。在这种情况下,您可以按照步骤下面从私有 key 中删除密码。请记住,这样做会带来额外的安全风险- 请谨慎行事!

    如何为测试目的创建 self-signed SSL 证书?

    • 确保已安装 OpenSSL 并在PATH中。
    • 运行以下命令,创建server.keyserver.crt files:
      $ 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没有任何密码短语。要为 key 添加密码,您应该运行以下命令,然后根据请求输入并验证密码。

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

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

    如何创建真正的 SSL 证书?

    这是一个 step-by-step 描述:

    • 确保已安装 OpenSSL 并在PATH中。
    • 为 Apache 服务器创建一个 RSA 私有 key(将 Triple-DES 加密和 PEM 格式化):

      $ openssl genrsa -des3 -out server.key 2048

    请备份此server.key文件和您在安全位置输入的 pass-phrase。您可以使用以下命令查看此 RSA private key 的详细信息:

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

    如有必要,您还可以使用以下命令创建此 RSA 私有 key 的解密 PEM version(不推荐):

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

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

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

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

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

    • 您现在必须将此证书签名请求(CSR)发送到要签名的 Certifying Authority(CA)。 CSR 签署后,您将拥有一个真正的证书,可由 Apache 使用。您可以使用商业 CA 签署 CSR,也可以创建自己的 CA 进行签名。
      商业 CA 通常会要求您将 CSR 发布到 web 表单,支付签名费用,然后发送签名证书,您可以将其存储在 server.crt 文件中。
      有关如何创建自己的 CA 以及使用此签名 CSR 的详细信息,请参阅下面。
      CSR 签署后,您可以看到证书的详细信息如下:

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

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

    不再需要server.csr文件。

    如何创建和使用我自己的证书 Authority(CA)?

    简短的回答是使用 OpenSSL 提供的CA.shCA.pl脚本。除非你有充分的理由不这样做,否则你应该优先使用这些。如果不能,您可以创建 self-signed 证书,如下所示:

    • 为您的服务器创建一个 RSA 私有 key(将 Triple-DES 加密和 PEM 格式化):

      $ openssl genrsa -des3 -out server.key 2048

    请备份此server.key文件和您在安全位置输入的 pass-phrase。您可以使用以下命令查看此 RSA private key 的详细信息:

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

    如有必要,您还可以使用以下命令创建此 RSA 私有 key 的解密 PEM version(不推荐):

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

    • 使用刚刚创建的 RSA key 创建 self-signed 证书(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

    如何更改私有 key 文件的 pass-phrase?

    您只需使用旧的 pass-phrase 读取它并再次写入,指定新的 pass-phrase。您可以使用以下命令完成此操作:

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

    第一次你被要求输入 PEM pass-phrase 时,你应该输入旧的 pass-phrase。之后,您将再次被要求输入 pass-phrase -此 time,使用新的 pass-phrase。如果要求您验证 pass-phrase,则需要输入新的 pass-phrase 秒 time。

    如何摆脱 Apache 启动 time 时的 pass-phrase 对话框?

    这个对话框在启动时弹出的原因是每个 re-start 是为了安全起见,server.key 文件中的 RSA 私有 key 以加密格式存储。解密此文件需要 pass-phrase,因此可以读取和解析它。删除 pass-phrase 会从服务器中删除一层安全保护- 请谨慎操作!

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

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

    • 确保 server.key 文件只能由 root 读取:

      $ chmod 400 server.key

    现在server.key包含 key 的未加密副本。如果您将服务器指向此文件,则不会提示您输入 pass-phrase。但是,如果有人得到这个 key,他们将能够在网上冒充你。请确保此文件的权限是只有 root 或 web 服务器用户才能读取它(最好让你的 web 服务器以 root 身份启动,但 run 作为另一个用户,并且 key 只能由 root 读取)。

    作为替代方法,您可以使用“SSLPassPhraseDialog exec:/path/to/program”工具。请记住,当然,这既不是更安全,也不是更安全。

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

    私有 key 包含一系列 numbers。其中两个 numbers 构成了“public key”,其他的则是“私钥 key”的一部分。生成 CSR 时会包含“public key”位,并随后形成相关证书的一部分。

    要检查证书中的公共 key 是否与私有 key 的公共部分匹配,您只需要比较这些 numbers。要查看证书和 key run 命令:

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

    key 和证书中的modulus' and the公共指数'部分必须 match。由于公共指数通常为 65537,并且很难直观地检查 long modulus numbers 是否相同,因此您可以使用以下方法:

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

    这将为您留下两个相当短的 numbers 进行比较。从理论上讲,这些 numbers 可能是相同的,没有模数_number 是相同的,但这种情况的机会极其严重。

    如果您想检查特定 CSR 所属的 key 或证书,您可以在 CSR 上执行相同的计算,如下所示:

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

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

    OpenSSL 的默认证书格式是 PEM,它只是 Base64 编码的 DER,带有页眉和页脚 lines。对于某些 applications(e.g. 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 证书(安装在浏览器中)和服务器证书(您在服务器上安装)之间。在 order 中,浏览器能够遍历并验证从服务器证书到根证书的信任链,需要为其提供中间证书。 CA 应该能够为您提供可以安装在服务器上的此类中间证书包。

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

    SSL 协议

    • 为什么在服务器负载很重的情况下会出现大量随机 SSL 协议错误?
    • 为什么我的网络服务器负载较高,现在它提供 SSL 加密流量?
    • 为什么与我的服务器的 HTTPS 连接有时需要 30 秒才能建立连接?
    • mod_ssl 支持哪些 SSL 密码?
    • 在尝试使用匿名 Diffie-Hellman(ADH)密码时,为什么会出现“无共享密码”错误?
    • 当连接到我新安装的服务器时,为什么会出现“无共享密码”错误?
    • 为什么我不能在 name-based/non-IP-based 虚拟主机上使用 SSL?
    • 是否可以使用 Name-Based Virtual Hosting 来识别不同的 SSL 虚拟主机?
    • 如何使 SSL 压缩工作?
    • 当我通过 HTTPS 使用基本身份验证时,Netscape 浏览器中的锁定图标会在弹出对话框时保持解锁状态。这是否意味着 username/password 是未加密发送的?
    • 当通过 HTTPS 连接到带有 Microsoft Internet Explorer(MSIE)的 Apache mod_ssl 服务器时,为什么会出现 I/O 错误?
    • 如何启用 TLS-SRP?
    • 使用超过 1024 位的证书时,为什么使用 Java-based clients 进行握手失败?

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

    这可能有很多原因,但主要原因是SSLSessionCache指令指定的 SSL session Cache 存在问题。 DBM session 缓存是问题的最可能的来源,因此使用 SHM session 缓存(或根本没有缓存)可能会有所帮助。

    为什么我的网络服务器负载较高,现在它提供 SSL 加密流量?

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

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

    这通常是由SSLRandomSeed的/dev/random设备阻止 read(2 调用,直到有足够的熵可用于服务请求。有关SSLRandomSeed指令的 reference 手册中提供了更多信息。

    mod_ssl 支持哪些 SSL 密码?

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

    • RC4 与 SHA1
    • AES 与 SHA1
    • Triple-DES 与 SHA1

    要确定可用的密码实际列表,您应该运行以下内容:

    $ openssl ciphers -v

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

    默认情况下,出于安全原因,OpenSSL 不允许 ADH 密码。如果您选择启用这些密码,请确保您知道 side-effects 的潜力。

    在 order 中使用匿名 Diffie-Hellman(ADH)密码,你必须在中使用`-DSSL_ALLOW_ADH`'', and then addADH''构建 OpenSSL。

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

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

    为什么我不能在 name-based/non-IP-based 虚拟主机上使用 SSL?

    原因很简单,有点“鸡蛋和鸡蛋”问题。 SSL 协议层保持在 HTTP 协议层之下并封装 HTTP。建立 SSL 连接(HTTPS)时,Apache/mod_ssl 必须与 client 协商 SSL 协议参数。为此,mod_ssl 必须查阅虚拟服务器的 configuration(例如,它必须查找密码套件,服务器证书,etc.)。但是在 order 中要转到正确的虚拟服务器 Apache 必须知道Host HTTP 头字段要做到这一点,必须读取 HTTP 请求标头。这在 SSL 握手完成之前无法完成,但是 order 需要信息才能完成 SSL 握手阶段。请参阅下一个问题,了解如何规避此问题。

    请注意,如果您使用通配符 SSL 证书或使用 subjectAltName 字段在其上具有多个主机名的证书,则可以在 name-based 虚拟主机上使用 SSL,而无需进一步的解决方法。

    是否可以使用 Name-Based 虚拟主机来识别不同的 SSL 虚拟主机?

    Name-Based 虚拟主机是一种非常流行的识别不同虚拟主机的方法。它允许您为许多不同的站点使用相同的 IP 地址和相同的 port 号。当人们转向使用 SSL 时,似乎很自然地认为可以使用相同的方法在同一台服务器上拥有许多不同的 SSL 虚拟主机。

    这是可能的,但仅限于使用 2.2.12 或更高版本的 web 服务器,使用 0.9.8j 或更高版本的 OpenSSL 构建。这是因为它需要一个 feature,只添加了 SSL 规范的最新版本,称为 Server Name Indication(SNI)。

    请注意,如果您使用通配符 SSL 证书或使用 subjectAltName 字段在其上具有多个主机名的证书,则可以在 name-based 虚拟主机上使用 SSL,而无需进一步的解决方法。

    原因是 SSL 协议是一个封装 HTTP 协议的独立层。所以 SSL session 是一个单独的 transaction,它发生在 HTTP session 开始之前。服务器在 IP 地址 X 和 port Y(通常是 443)上接收 SSL 请求。由于 SSL 请求不包含任何 Host:字段,因此服务器无法决定使用哪个 SSL 虚拟 host。通常,它只使用它找到的第一个匹配指定的 port 和 IP 地址。

    如果您使用 web 服务器的 version 和支持 SNI 的 OpenSSL,并且 client 的浏览器也支持 SNI,则主机名包含在原始 SSL 请求中,web 服务器可以选择正确的 SSL 虚拟 host。

    当然,您可以使用 Name-Based 虚拟主机来识别许多 non-SSL 虚拟主机(全部在 port 80 上,对于 example),然后有一个 SSL 虚拟主机(在 port 443 上)。但是如果你这样做,你必须确保将 non-SSL port 号放在 NameVirtualHost 指令 e.g 上。

    NameVirtualHost 192.168.1.1:80
    

    其他解决方案包括:

    为不同的 SSL 主机使用单独的 IP 地址。对不同的 SSL 主机使用不同的 port numbers。

    如何使 SSL 压缩工作?

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

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

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

    不,username/password 是加密传输的。 Netscape 浏览器中的图标实际上并未与 SSL/TLS 层同步。当实际网页数据的第一部分被传输时,它只切换到锁定的 state,这可能会使人感到困惑。基本身份验证工具是 HTTP 层的一部分,位于 HTTPS 的 SSL/TLS 层之上。在 HTTPS 中进行任何 HTTP 数据通信之前,SSL/TLS 层已经完成其握手阶段,并切换到加密通信。所以不要被这个图标搞糊涂。

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

    第一个原因是某些 MSIE 版本中的 SSL implementation 有一些与 HTTP keep-alive 工具相关的微妙错误,并且 socket 连接上的 SSL 关闭通知警报关闭。此外,SSL 和 HTTP/1.1 features 之间的交互在某些 MSIE 版本中存在问题。您可以通过强制 Apache 不使用 HTTP/1.1,keep-alive 连接或将 SSL 关闭通知消息发送到 MSIE clients 来解决这些问题。这可以通过在 SSL-aware virtual host 部分中使用以下指令来完成:

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

    此外,一些 MSIE 版本具有特定密码的问题。遗憾的是,无法为此实现 MSIE-specific 解决方法,因为早在 SSL 握手阶段就需要使用密码。所以 MSIE-specific SetEnvIf 之后不会解决这些问题。相反,您将不得不对 global 参数进行更大幅度的调整。在您决定执行此操作之前,请确保您的 clients 确实存在问题。如果没有,请不要进行这些更改- 它们会影响您的所有客户,MSIE 或其他方式。

    如何启用 TLS-SRP?

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

    openssl srp -srpvfile passwd.srpv -add username

    在 creating 此文件后,在 SSL 服务器 configuration 中指定它:

    SSLSRPVerifierFile /path/to/passwd.srpv

    要强制 clients 使用 non-certificate TLS-SRP 密码套件,请使用以下指令:

    SSLCipherSuite "!DSS:!aRSA:SRP"

    为什么在使用超过 1024 位的证书时,Java-based clients 会出现握手失败?

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

    如果你的 Java-based client 使用和java.security.InvalidAlgorithmParameterException: Prime size must be multiple of 64, and can only range from 512 to 1024(inclusive)等 exceptions 以及 httpd logs tlsv1 alert internal error(SSL alert number 80)(LogLevel info或更高版本)中止,你可以用SSLCipherSuite重新排列 mod_ssl 的密码列表(可能与SSLHonorCipherOrder一起),或者你可以使用自定义 DH 具有 1024-bit prime 的参数,它始终优先于任何 built-in DH 参数。

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

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

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

    mod_ssl 支持

    • 如果出现 mod_ssl 问题,可以获得哪些信息资源?
    • 如果出现 mod_ssl 问题,可以使用哪些支持联系人?
    • 在编写错误报告时,我应该提供哪些信息?
    • 我有一个核心转储,你能帮帮我吗?
    • 我如何获得回溯,以帮助找到我的核心转储的原因?

    如果出现 mod_ssl 问题,可以获得哪些信息资源?

    提供以下信息资源。如有问题,请先在此处搜索。

    • 用户手册中的答案是 F.A.Q。清单(这个)
      http://httpd.apache.org/docs/2.4/ssl/ssl_faq.html 首先检查 F.A.Q。(本文)。如果您的问题是 common 问题,可能之前已经多次回答,并且已包含在此文档中。

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

    以下列出所有支持 mod_ssl 的可能性,在优先顺序中。请在这个 order 中完成这些可能性- 不要只选择你喜欢的那个。

    • 将问题报告发送到 Apache httpd 用户支持邮件列表
      users@httpd.apache.org
      这是提交问题报告的第二种方式。同样,您必须首先订阅列表,但您可以轻松地与整个 Apache httpd 用户社区讨论您的问题。
    • 在 Bug 数据库中编写问题报告
      http://httpd.apache.org/bugreport.html
      这是提交问题报告的最后一种方式。如果您已经发布到邮件 lists,并且没有成功,那么您应该这样做。请仔细按照上页的说明进行操作。

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

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

    • Apache httpd 和 OpenSSL version 信息
      Apache version 可以通过 running httpd -v 来确定。 OpenSSL version 可以通过 running openssl version 来确定。或者,如果安装了 Lynx,则可以运行命令 lynx -mime_header http://localhost/| grep Server 用于在单个 step 中收集此信息。
    • 有关如何构建和安装 Apache httpd 和 OpenSSL 的详细信息
      为此,您可以提供终端 session 的日志文件,其中显示了 configuration 和安装步骤。如果无法做到这一点,您至少应该提供您使用的 configure 命令 line。
    • 如果是核心转储,请包含 Backtrace
      如果您的 Apache httpd 转储其核心,请附加 stack-frame“`backtrace''(有关如何获取此信息,请参阅下文)。在 order 中需要此信息以查找核心转储的原因。
    • 您问题的详细说明不要笑,我们真的是这个意思!许多问题报告不包括对实际问题的描述。没有这个,任何人都很难帮助你。所以,这符合您自己的利益(您希望问题得到解决,不是吗?)请尽可能多地包含详细信息。当然,您仍应包含上述所有必需品。

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

    通常不会,除非您提供有关 Apache 转储核心的 code 位置的更多详细信息,否则至少不会。 order 中通常总是需要帮助你的是一个回溯(见下一个问题)。没有这些信息,几乎不可能找到问题并帮助您修复它。

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

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

    • 确保您有可用的调试符号,至少在 Apache 中。在使用 GCC/GDB 的平台上,您需要 build Apache mod_ssl 并且需要`OPTIM="-g -ggdb3"`'' to get this. On other platforms at leastOPTIM="-g"''。
    • 启动服务器并尝试重现 core-dump。为此,您可能希望使用类似“CoreDumpDirectory /tmp”的指令来确保可以写入 core-dump 文件。这应该导致/tmp/core/tmp/httpd.core文件。如果您没有获得其中一个,请尝试在 non-root UID 下运行您的服务器。许多现代内核出于安全原因不允许 process 在完成setuid()(除非它执行exec())之后转储核心(在 memory 中可能存在特权信息)。如有必要,您可以手动 run /path/to/httpd -X强制 Apache 不要分叉。
    • 分析 core-dump。为此,run gdb /path/to/httpd /tmp/httpd.core或类似的命令。在 GDB 中,你所要做的就是输入bt,瞧,你得到了回溯。对于其他调试器,请参阅本地调试器手册。

    上篇:操作方法

    下篇:通用术语