AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 387921
Accepted
tim
tim
Asked: 2012-05-11 05:55:12 +0800 CST2012-05-11 05:55:12 +0800 CST 2012-05-11 05:55:12 +0800 CST

SSL 用户身份验证在 Apache 中不起作用

  • 772

我遇到了通过 ssl 证书对客户端进行身份验证的问题,这似乎与我在整个网络中发现的许多问题类似 - 不幸的是没有解决方案。

设置是:Debian Linux 上的 apache 2.2、mod_ssl、openssl。我有一个使用 Globalsign PersonalSign 证书进行身份验证的客户端。我已经设置了 SSLCACertificatePath 我认为是正确的,因为 apache 调试告诉我:

[Thu May 10 15:31:35 2012] [debug] ssl_engine_init.c(1196): CA certificate: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
[Thu May 10 15:31:35 2012] [debug] ssl_engine_init.c(1196): CA certificate: /C=BE/O=GlobalSign nv-sa/CN=GlobalSign PersonalSign 1 CA - G2
[Thu May 10 15:31:35 2012] [debug] ssl_engine_init.c(1196): CA certificate: /C=BE/O=GlobalSign nv-sa/CN=GlobalSign PersonalSign 1 CA - G2
[Thu May 10 15:31:35 2012] [debug] ssl_engine_init.c(1196): CA certificate: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA

我不知道为什么两个证书都出现在这个列表中两次。哈希通过 c_rehash 实用程序正确链接。

现在客户端进行身份验证(我从调试日志中复制了我认为相关的条目):

Certificate Verification: depth: 1, subject: /C=BE/O=GlobalSign nv-sa/CN=GlobalSign PersonalSign 1 CA - G2, issuer: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
Certificate Verification: Error (20): unable to get local issuer certificate
OpenSSL: Write: SSLv3 read client certificate B
OpenSSL: Exit: error in SSLv3 read client certificate B
Re-negotiation handshake failed: Not accepted by client!?

据我有限的理解,这意味着他未能获得中间GlobalSign PersonalSign 1 CA - G2证书的颁发者证书。事实上,该证书的 issuer_hash 与GlobalSign Root CA的哈希相匹配,该哈希确实在 SSLCACertificatePath 中找到,并与该哈希正确地进行了符号链接,并且在加载的日志中前面提到过。

所以我卡住了。有什么想法吗?

编辑:

如果我通过 openssl 命令行实用程序验证用户的证书,它会起作用:

# openssl verify -CApath conf/ssl.user.crt/ test.pem  
test.pem: OK

(conf/ssl.user.crt是我的 SSLCACertificatePath)

apache-2.2 ssl openssl
  • 1 1 个回答
  • 10618 Views

1 个回答

  • Voted
  1. Best Answer
    tim
    2012-05-23T01:50:39+08:002012-05-23T01:50:39+08:00

    解决了。原来是权限问题:

    我在一台干净的 Debian Squeeze 机器上设置了类似的设置,它从一开始就运行良好。调试输出的区别是:

    [debug] ssl_engine_kernel.c(1321): [client 80.252.98.156] Certificate Verification: depth: 2, subject: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA, issuer: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA 
    [debug] ssl_engine_kernel.c(1321): [client 80.252.98.156] Certificate Verification: depth: 1, subject: /C=BE/O=GlobalSign nv-sa/CN=GlobalSign PersonalSign 1 CA - G2, issuer: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
    [debug] ssl_engine_kernel.c(1321): [client 80.252.98.156] Certificate Verification: depth: 0, subject: /[email protected]/[email protected], issuer: /C=BE/O=GlobalSign nv-sa/CN=GlobalSign PersonalSign 1 CA - G2
    

    在“好的”方面,对比:

    [debug] ssl_engine_kernel.c(1321): [client 80.252.98.156] Certificate Verification: depth: 1, subject: /C=BE/O=GlobalSign nv-sa/CN=GlobalSign PersonalSign 1 CA - G2, issuer: /C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
    [error] [client 80.252.98.156] Certificate Verification: Error (20): unable to get local issuer certificate
    

    在“坏”的一面。

    两种设置之间的主要区别在于 CA 证书所在的 apache 安装的 /conf 目录的权限。出于安全原因,我们将权限设置为 750 并将目录归 root 所有。将 CA 文件移动到可读目录(或准确地说是“可执行”以在路径中使用)使问题消失。

    因此,尽管 mod_ssl 声称在服务器启动时读取证书,但它仍然需要在运行时访问散列文件(并且已经放弃了它的根权限)。

    • 3

相关问题

  • Apache Django Mod_Wsgi - 自动重新加载应用程序

  • Apache:对多个虚拟主机使用相同的目录指令

  • Apache 上的子域不工作 - 找不到服务器

  • PHP 作为 CGI 还是 Apache 模块?

  • 避免将某些丢失的文件记录到 Apache2 错误日志中

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve