我们正在使用客户端证书来验证我们的一位客户。
我们的设置如下:我们在 Django 应用程序前面安装了 nginx。在我们的 nginx 配置中,我们拥有使实际客户端证书验证正常运行所需的参数(ssl_client_certificate
等ssl_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
解决这个问题很容易,但我不明白为什么。所以我的问题是:
- 的值从哪里来的
$ssl_client_s_dn
?是 nginx 设置的吗?还是客户端设置的? - 是否有任何文档/规范表明该值的格式以及其名称?
答案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.
如果你想避免这种情况,你应该坚持使用稳定版本,而不是不稳定的主线版本。无论哪种方式,在盲目升级生产之前,你都应该先进行测试。