2014-05-08 58 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變量。同樣使用正則表達式來處理電子郵件。