【问题标题】:Configure Apache to send SSL Client certificate to backend server配置 Apache 以将 SSL 客户端证书发送到后端服务器
【发布时间】:2017-12-06 06:28:42
【问题描述】:

我想配置 Apache 以便它接收客户端证书,然后将其传递给另一台服务器。 我正在使用:

  • windows 上的 apache 2.0.65
  • 后端服务器是基于 apache 的解决方案(IBM HTTP Server)

我试过这个配置:

<VirtualHost *:443>
ServerName apacheserver.domain.com
SSLEngine on
SSLProxyEngine on
SSLCertificateFile "e:/Apache/Apache2/conf/server.cer"
SSLCertificateKeyFile "e:/Apache/Apache2/conf/server.key"
SSLCACertificateFile  "e:/Apache/Apache2/conf/certca.cer"
SSLVerifyClient require
SSLVerifyDepth 2
ProxyPreserveHost on
ProxyRequests off
<Proxy *>
  AddDefaultCharset Off
  Order deny,allow
  Allow from all
</Proxy>
# initialize the special headers to a blank value to avoid http header forgeries
RequestHeader set SSL_CLIENT_S_DN    ""
RequestHeader set SSL_CLIENT_I_DN    ""
RequestHeader set SSL_SERVER_S_DN_OU ""
RequestHeader set SSL_CLIENT_VERIFY  ""
<Directory />
  # add all the SSL_* you need in the internal web application
  RequestHeader set SSL_CLIENT_S_DN "%{SSL_CLIENT_S_DN}e"
  RequestHeader set SSL_CLIENT_I_DN "%{SSL_CLIENT_I_DN}e"
  RequestHeader set SSL_SERVER_S_DN_OU "%{SSL_SERVER_S_DN_OU}e"
  RequestHeader set SSL_CLIENT_VERIFY "%{SSL_CLIENT_VERIFY}e"
  ProxyPass  https://192.168.10.191/
  ProxyPassReverse  https://192.168.10.191/
</Directory>
</VirtualHost>

当我尝试这个配置时,我在 apache 的 error.log 文件中有这个错误:

[Tue Dec 31 12:14:52 2013] [warn] Proxy client certificate callback: (apacheserver.domain.com:443) downstream server wanted client certificate but none are configured

有什么想法吗?

【问题讨论】:

    标签: apache client certificate


    【解决方案1】:

    客户端证书在 SSL 连接中用于验证用户的身份。验证是通过公钥加密完成的,例如客户端使用其私钥对某些内容进行签名,并且可以使用公钥验证签名。并且由于私钥只有客户端知道,而公钥是每个人都知道(包含在证书中),所以只有客户端可以签名,但每个人都可以验证签名,从而证明签名文本来自客户端.

    如果您使用 apache 作为请求客户端证书的代理,它将收到包含客户端公钥的证书,并且能够验证客户端的签名。但它无法访问客户端私钥,因此无法使用客户端原始证书创建另一个 https 连接。它所能做的就是验证客户端证书,然后将重要信息作为 HTTP 标头转发到上游服务器。

    您似乎试图将来自客户端证书的信息放入 HTTP 标头中,但您的上游服务器需要更多信息,例如它需要您无法提供的客户端证书(错误消息:“..下游服务器需要客户端证书..”)。因此,您需要更改上游服务器,使其接受没有客户端证书的连接,并从您插入代理中的 HTTP-Headers 中读取授权信息。

    【讨论】:

    • 小附录:如果您有代理的客户端证书,您可以使用设置SSLProxyMachineCertificateFile mycertificate.pem 来指定它。代理请求现在将包含该证书。可能无法回答最初的问题,但在类似情况下会有所帮助。
    【解决方案2】:

    ProxyPass 指令中使用http: 而不是https:。 Apache 将在标头中传递客户端证书。

    【讨论】:

      猜你喜欢
      • 2014-04-15
      • 1970-01-01
      • 2017-07-04
      • 2015-10-20
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 2014-02-23
      • 1970-01-01
      相关资源
      最近更新 更多