2014-05-08 57 views
2

我有一个基于SSL客户端证书的PHP登录模块。它适用于Apache。现在我试图弄清楚如何将它移植到nginx。SSL客户端证书和PHP:Apache与nginx兼容的信息

使用Apache使用许多环境变量设置访问证书的内容非常方便。例如,邮件地址将在$_SERVER['SSL_CLIENT_S_DN_Email']

我找到了nginx变量$ssl_client_s_dn,我可以通过fastcgi_param将它传递给PHP。但是,我会得到整个DN字符串。

  • 我是否必须自己解析提供的DN字符串还是有更好的方法吗?
  • 如果我必须解析它,我可以使用哪种规范来获取正确的格式?
  • nginx提供的字符串与Apache的SSL_CLIENT_S_DN相同吗?

回答

1

Nginx使用OpenSSL的X509_NAME_oneline()函数来生成字符串。这个函数的documentation规定如下:

功能X509_NAME_oneline()X509_NAME_print()是产生非标准输出形式,他们不处理多字符型字段,并有各种怪癖和不一致的传统功能。在新的应用中强烈阻止它们的使用。

Apache 2.2对SSL_CLIENT_S_DN使用相同的功能。从版本2.3.11开始,Apache HTTPD默认使用RFC 2253兼容格式。

所以回答我的问题:

  • 我一定要分析我自己提供的DN字符串还是有 更好的方法?

    $ssl_client_s_dn变量是nginx提供的唯一信息。作为 替代方案,原始证书数据也可以。但是,这可能会导致性能问题 ,因为nginx必须为每个 调用复制整个证书。

  • 如果我必须解析它,我可以使用哪种规范来获取格式 对不对?

    该字符串形成为X509_NAME_oneline()已实施。它看起来像解析 这个字符串不能以防弹的方式完成。

  • nginx是否提供了与Apache for SSL_CLIENT_S_DN相同的字符串?

    2.3.11之前的Apache确实,后来的版本默认使用RFC 2253格式。但是,它们可以配置为使用传统格式。

0

可以使用地图指示像

map $ssl_client_s_dn $ssl_client_s_dn_cn { 
    default   ""; 
    ~/CN=(?<CN>[^/]+) $CN; 
}; 

然后你可以使用$ ssl_client_s_dn_cn变量。同样使用正则表达式来处理电子邮件。