nginx $ssl_client_i_dn 的格式为什么突然改变?

nginx $ssl_client_i_dn 的格式为什么突然改变?

我们正在使用客户端证书来验证我们的一位客户。

我们的设置如下:我们在 Django 应用程序前面安装了 nginx。在我们的 nginx 配置中,我们拥有使实际客户端证书验证正常运行所需的参数(ssl_client_certificatessl_verify_client),并且

uwsgi_param X-Client-Verify $ssl_client_verify;
uwsgi_param X-Client-DN $ssl_client_s_dn;
uwsgi_param X-SSL-Issuer $ssl_client_i_dn;

这意味着我们将这些变量的值放入我们的 Django 应用中。然后,Django 应用会使用此信息来识别哪个用户正在连接并对其进行授权。

我们已经成功使用了几个月,没有任何问题,但突然我们开始收到有关人们无法使用证书登录的报告。原来是$ssl_client_s_dn$ssl_client_i_dn值的格式发生了变化,从斜线分隔的格式变成了:

 /C=SE/O=Some organziation/CN=Some CA

改为逗号分隔的格式:

CN=Some CA,O=Some organization,C=SE

解决这个问题很容易,但我不明白为什么。所以我的问题是:

  1. 的值从哪里来的$ssl_client_s_dn?是 nginx 设置的吗?还是客户端设置的?
  2. 是否有任何文档/规范表明该值的格式以及其名称?

答案1

它们之所以发生变化,是因为 nginx 在 1.11.6 版本中对它们进行了更改。如变更日志中所示:

    *) Change: format of the $ssl_client_s_dn and $ssl_client_i_dn variables
       has been changed to follow RFC 2253 (RFC 4514); values in the old
       format are available in the $ssl_client_s_dn_legacy and
       $ssl_client_i_dn_legacy variables.

如果你想避免这种情况,你应该坚持使用稳定版本,而不是不稳定的主线版本。无论哪种方式,在盲目升级生产之前,你都应该先进行测试。

相关内容