为什么 Nginx 以相反的顺序提供客户端 SSL DN?

2024-04-25

我很好奇为什么某些 Web 服务器(例如 Nginx)以相反的顺序提供客户端 SSL DN。

Web 应用程序将 DN 发布到 Java Web 服务,该服务尝试创建 Javajavax.naming.ldap.LdapName http://docs.oracle.com/javase/7/docs/api/javax/naming/ldap/LdapName.html?is-external=true.

标准订单(LDAP 或 X500Name):

"CN=Jimmy Blooptoop,OU=Someplace,OU=Employees,DC=Bloopsoft-Inc"

逆序(OpenSSL 单行格式)(Nginx 返回为 _$ssl_client_s_dn _):

"/DC=Bloopsoft-Inc/OU=Employees/OU=Someplace/CN=Jimmy Blooptoop"

为什么是这样?

哪一项符合 LDAP RFC?

他们两个都这样吗?

LDAP RFC 注释:

有许多与 LDAP 相关的 RFC:https://www.ldap.com/ldap-specifications-define-in-rfcs https://www.ldap.com/ldap-specifications-defined-in-rfcs

许多人引用了不同的内容,以下是对它们的快速历史的尝试:

  • July 1993: RFC 1485 - A String Representation of Distinguished Names
  • March 1995: RFC 1779 - A String Representation of Distinguished Names
  • 1997 年 12 月:RFC 2253 - 轻量级目录访问协议 (v3):可分辨名称的 UTF-8 字符串表示形式
  • 2002 年 9 月:RFC 3377 - 轻量级目录访问协议 (v3):技术规范(更新 RFC 2253)
  • March 2003: RFC 3494 - Lightweight Directory Access Protocol version 2 (LDAPv2) to Historic Status (Retiring RFC 1485, RFC 1779)
  • 2006 年 6 月:RFC 4514- 轻量级目录访问协议 (LDAP):可分辨名称的字符串表示形式

最近的一个,它取代了其他的:RFC 4514:轻量级目录访问协议 (LDAP):可分辨名称的字符串表示形式 https://docs.ldap.com/specs/rfc4514.txt

Java 库:

是否有一个Java库可以来回转换(从反向到不反向)? LdapName 抛出 InvalidNameException。看起来应该有,倒退格式经常出现。

Java 库:

  • javax.naming.ldap.LdapName https://docs.oracle.com/javase/7/docs/api/javax/naming/ldap/LdapName.html支持 RFC 2253
  • org.apache.directory.api.ldap.model.filter.FilterEncoder https://directory.apache.org/api/gen-docs/latest/apidocs/org/apache/directory/api/ldap/model/filter/FilterEncoder.html支持 RFC 4514
  • Spring LdapUtils http://docs.spring.io/spring-ldap/docs/current/apidocs/org/springframework/ldap/support/LdapUtils.html包裹 LdapName
  • 关于使用 BouncyCastle X509Name 解析和压缩 DN 的文章:http://www.sivachandran.in/2012/11/comparing-x509-distinguished-name-with.html http://www.sivachandran.in/2012/11/comparing-x509-distinguished-name-with.html

Nginx 注释:

  • http://nginx.org/en/docs/http/ngx_http_ssl_module.html http://nginx.org/en/docs/http/ngx_http_ssl_module.html

链接:

  • 如何在Java中从X509Certificate中提取CN? https://stackoverflow.com/questions/2914521/how-to-extract-cn-from-x509certificate-in-java
  • 从证书 DN 中解析 CN https://stackoverflow.com/questions/7933468/parsing-the-cn-out-of-a-certificate-dn(借用 DN 示例)
  • Nginx 信息 http://nategood.com/client-side-certificate-authentication-in-ngi
  • X500主要杰出姓名顺序 https://stackoverflow.com/questions/10871922/x500principal-distinguished-name-order
  • https://wiki.nikhef.nl/grid/How_to_handle_OpenSSL_and_not_get_hurt_background_information https://wiki.nikhef.nl/grid/How_to_handle_OpenSSL_and_not_get_hurt_background_information
  • https://www.openssl.org/docs/manmaster/apps/x509.html#item_oneline https://www.openssl.org/docs/manmaster/apps/x509.html#item_oneline

为什么是这样?

这是因为这就是 OpenSSL 返回的内容。 Apache HTTPD 做同样的事情,因为它也使用 OpenSSL。

哪一项符合 LDAP RFC?

您所描述的“标准订单”。然而,这是一个 SSL 证书和一个 SSL API。它与 LDAP 没有任何关系,并且没有理由它应该遵守任何 LDAP RFC。这只是提供证书主体 DN 的另一种方式。这是由 X.509 定义的,而不是由 LDAP 定义的(尽管最终它们都是由 X.500 定义的,至少最初是这样)。

是否有一个Java库可以来回转换(从反向到不反向)

离题了,我不知道,但写起来很容易:

public class OpenSSLSubjectName
{
    private String  name;

    public OpenSSLSubjectName(String name)
    {
        this.name = name;
    }

    public String   getX500Name() throws NamingException
    {
        return getLdapName().toString();
    }

    public LdapName getLdapName() throws NamingException
    {
        List<Rdn>   rdns = new LinkedList<>();
        String[]    parts = name.split("/");
        for (int i = 1; i < parts.length; i++)
        {
            rdns.add(new Rdn(parts[i]));
        }
        return new LdapName(rdns);
    }
}

E&OE

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Nginx 以相反的顺序提供客户端 SSL DN? 的相关文章

  • 编译错误:表达式非法开始

    我正在学习 Java 游戏方面 我买了一本书 里面有一些代码 我尝试复制并测试它 唯一的问题是 当我尝试编译它时 它会出现错误 C Users James Desktop Java gt Javac GamePanel java GameP
  • ModelMapper:匹配多个源属性层次结构

    我无法解决 modelMapper 错误 您知道问题出在哪里吗 注意 鉴于 java sql Time 没有无参构造函数 我没有找到比编写转换器更好的方法 org modelmapper ConfigurationException Mod
  • Android 2.x 天城文 unicode 问题

    我正在尝试使用以下代码支持 android 2 x 的梵文字体 即使 android 2 x 无法渲染梵文字体 除了 raswa 和 dirga 存在一些问题之外 代码工作正常 是否有可能在 android 2 x 中获得正确的梵文表示形式
  • 使用 Java Config 围绕 Spring Security 匿名访问的混乱

    我将以下 Java 配置与 Spring Security 结合使用 protected void configure HttpSecurity http throws Exception http authorizeRequests an
  • 如何将列表从控制器发送到百里香

    我需要将列表中存在的数据从我的 spring 控制器发送到 thymeleaf html 我如何发送数据 收到后如何迭代百里香中的数据 将您的清单放入您的ModelMap or ModelAndView对象然后使用遍历它th each在你的
  • Single.zip - 如何捕获失败的呼叫并继续其余的网络呼叫?

    我正在进行 5 个并行网络调用 模拟其中 4 个成功 其中 1 个失败 失败的调用使整个Single zip 失败 即使其他 4 个网络调用成功 我也无法获得它们的结果 如何处理单个失败的网络调用的错误Single zip 并获得成功者的结
  • SQL状态[99999];错误代码[17004];无效的列类型:1111 使用 Spring SimpleJdbcCall

    大家好 我正在使用 spring 简单的 JDBC 模板来调用 oracle 过程 下面是我的代码 步骤 create or replace PROCEDURE get all system users pi client code IN
  • 如何修改s_client的代码?

    我正在玩apps s client c in the openssl源代码 我想进行一些更改并运行它 但是在保存文件并执行操作后 我的更改没有得到反映make all or a make 例如 我改变了sc usage函数为此 BIO pr
  • Java 支持多行字符串吗?

    来自 Perl 我肯定缺少在源代码中创建多行字符串的 here document 方法 string lt lt EOF create a three line string text text text EOF 在 Java 中 当我从头
  • 将问号 (?) 替换为 (\\?)

    我正在尝试定义一个模式来匹配文本中带有问号 的文本 在正则表达式中 问号被认为是 一次或根本不 那么我可以用 替换文本中的 符号来解决模式问题吗 String text aaa aspx pubid 222 zzz Pattern p Pa
  • Java中的引用变量到底是什么?它与其他变量有何不同?

    我一直在研究 Java 中的继承 作者声明 被引用的对象类型 而不是引用变量的类型 决定了将执行哪个版本的重写方法 这种说法非常令人困惑 这本书所指的是多态性 更具体地通过动态调度 简而言之 想象一下以下类 public class Per
  • jsoup 的奇怪编码行为

    我用jsoup从不同页面的html源代码中提取一些信息 大多数都是UTF 8编码的 其中一个是用 ISO 8859 1 编码的 这会导致一个奇怪的错误 在我看来 包含错误的页面是 http www gudi ch armbanduhr me
  • “Java”“List”方法“size”如何工作?

    在Java中 有一个List接口和size 计算尺寸的方法List 当我打电话时List size 怎么算呢 是线性计数 还是确定计数后只返回值size 大小定义为列表中元素的数量 该实现未指定 size 成员函数如何操作 迭代成员 返回存
  • DateTimeFormatter 中的通配符

    我需要将一个字符串解析为LocalDate 该字符串看起来像31 03 2016用正则表达式术语 即 表示日期数字后可能有 0 个或多个未知字符 输入 输出示例 31xy 03 2016 gt 2016 03 31 我希望在 DateTim
  • 信任所有将文件发送到 https Web 服务的 java 类

    我需要编写自己的类来告诉 mule 与服务 wsdl 的 https 连接已验证 我的 mule 项目已经接近完成 但最后一块丢失了 在特定的 url 发送文件 我想要实现的目标 建立连接并将 xml 发送到目标 url 读取 xml 格式
  • 在 Spring Boot 集成中的 MqttPahoMessageHandler 和 MqttPahoMessageDrivenChannelAdapter 之间共享相同的 MQTT 客户端实例

    假设我有一个 Spring Boot 应用程序 需要实例化多个 MQTT 客户端 10 4 以将物理设备虚拟化为代理 Mosquitto 每个主题都有一个唯一的客户端 ID 以便从专用主题获取消息或向专用主题发送消息 我正在尝试使用 Spr
  • 在Fragment中第一次调用时SharedPreferences为空

    我有一个示例 Android 应用程序 根据位置 邮政编码 和设置 SharedPreference 中设置的温度单位 该应用程序显示 7 天的天气 当应用程序第一次获取温度并检查 SharedPreference 中设置的温度单位时 它似
  • 如何从 Ant 构建文件设置 Eclipse 构建路径和类路径?

    关于 Ant 和 Eclipse 有很多讨论 但之前的答案似乎对我没有帮助 事情是这样的 我正在尝试构建一个可以从命令行使用 Ant 成功编译的 Java 程序 更令人困惑的是 我尝试编译的程序是 Ant 本身 我真正想做的是将这个项目引入
  • 我想在Java中使用关于随机索引的索引

    我使用Java 当我在Java中使用ArrayList时 如果我随机访问索引号 这可能吗 如果这是不可能的 我应该怎么做 例如 ArrayList
  • IntelliJ IDEA 无法在 Ubuntu 上启动

    我用IDEA好几个月了 到现在还可以 现在从快捷方式启动IDEA没有效果 我想这是在一些更新之后发生的 我尝试重新安装IDEA 但问题仍然存在 从终端启动 idea sh 会产生类似的效果 chronoexp ChronoExp PC Pr

随机推荐

  • 使用列表项的多重过滤器逻辑

    以下代码将搜索任何重复的类 li class duplicate duplicate 在无序列表中的列表项中 它将显示结果 show and hide 其他的 当前版本 目前它适用于两种场景 First 它显示具有相同类别 至少一个或多个
  • Python 中 FFT 的循环加速(使用“np.einsum”)

    Problem 我想加速包含大量乘积和求和的 python 循环np einsum 但我也愿意接受任何其他解决方案 我的函数采用形状为 n n 3 的向量配置 S 我的情况 n 72 并对 N N 点的相关函数进行傅里叶变换 相关函数定义为
  • 任务 :':app:mergeDebugResources' 执行失败。安卓工作室

    我刚刚安装了 android studio 出现一个错误 我不知道如何修复 尝试干净的项目 如果不起作用的话 然后 转到项目部分中的 build gradle 尝试降级gradle版本 From dependencies classpath
  • 离子范围滑块 2.0.3

    我正在尝试使用离子范围滑块 2 0 3 URL http ionden com a plugins ion rangeSlider demo advanced html http ionden com a plugins ion range
  • 类型错误:无法读取未定义的属性(读取“html”)

    我正在尝试将 Jest 引入我当前的项目 然而 在初始设置过程中 我遇到了这个错误 并且无法正常运行 我该如何解决这个问题 我目前正在使用 vue cli 中的 vue2 Test suite failed to run TypeError
  • 使用 Excel 连接函数

    我正在尝试将 Excel 中三列的数据合并到一列中 例如 我想将 Product Location 和 Key id 合并到一列中 Product Location Key Id Car VA 86421910 Car VA 8642448
  • 在 header("Location: ") 调用后是否调用 exit 有关系吗?

    我似乎无法找到答案 直到我发现这个帖子 http www php net manual en function exit php 90713 on exit在 php net 上 发送 Location 标头 PHP 后will继续解析 h
  • Matlab:不正确的索引矩阵参考(或智胜matlab)

    我希望能够写jasmine http pivotal github io jasmine 类似于 Matlab 中的测试 所以像 expect myfibonacci 0 toBe 0 expect myfibonacci 5 toBe 1
  • C# 与 C++ 中的运算符 new

    来自 C 我对使用newC 中的关键字 我知道它不像 C 那样工作new从某种意义上说 您不必手动控制对象的生命周期 因为 C 具有垃圾收集功能 然而 当阅读其他人的 C 代码时 我注意到代码片段 1 中的语句 避免使用new总而言之 就像
  • 如何在模拟器android studio中设置密度

    我想创建一个 Samsung Galaxy XCover4S 720 x 1280 px 5 00 294ppi 64 6 屏幕与机身比例 的模拟器 但是我只找到了如何设置预定义的密度 如 120 240 320 和更多密度 ppi in
  • 如何识别托管 bean 中单击的 commandButton

    我有一个actionListener我的托管 bean 中的方法由许多命令按钮调用 public void verifyTestDisponibility ActionEvent actionEvent if button1 clicked
  • SQL 作为访问表单字段的控制源

    有什么方法可以使用 SQL 填充 Access Form 的文本字段值吗 我读到不可能简单地输入 SQL 作为控制源 这是真的 谢谢你的帮助 edit 我需要执行这个查询 SELECT tblCaseIssues IssueDesc FRO
  • Chartjs 插件数据标签不在图表上显示值

    我正在尝试使用 Chartjs 数据标签插件获取每个条形上的值 因此 在 a 条上方 a 想要看到数字 30 在 b 条上方或内部我想看到数字 50 但它根本没有显示任何价值 谁能帮忙并告诉我出了什么问题吗 我也尝试过使用不同版本的char
  • 让隐藏的div出现然后消失?

    让 div 出现然后淡出几秒钟的最简单方法是什么 fade div visibility none position fixed background color yellow border 1px solid black top 300p
  • 单个 CMakeLists.txt 足以满足我的项目需求吗?

    我正在尝试将旧的 CMake 移植到现代 CMake CMake 3 0 2 或更高版本 在旧的设计中 我有多个 CMakelists txt 每个目录都包含一个 CMakeLists txt 文件 我当前项目的目录结构如下所示 VizSi
  • 如何在describe()的before()块中动态生成Mocha测试?

    我正在创建一个 mocha 测试套件 该套件正在测试我们的 nwjs 应用程序正在调用的命令行实用程序 该实用程序获取文件并生成输出 json 文件 我有数千种输入文件组合和我想要生成的测试 it s 具体取决于 cmdline 实用程序的
  • 如何在 x 轴上显示每个元素的标签?

    我有包含文件名和编号的元组序列 我想绘制柱形图 其中 X 轴上有文件名 我的问题是现在 X 轴下仅显示 3 个标签 文件名 这可能是因为屏幕无法容纳更多内容 还是X轴间隔错误 如何让图表显示所有文件名 也许有办法将这些标签逆时针旋转 90
  • CSS 中具有透明背景的锯齿状边缘

    使 div 的顶部和底部边框具有锯齿状边缘 https stackoverflow com questions 18972888 make a divs top and bottom border have a jagged edge 根据
  • 如何将嵌套数据结构作为 LitElement 中的属性传递?

    在父组件中我有类似的内容 render gt const data a 1 b 1 2 3 of course this is a simplified version of the code return html
  • 为什么 Nginx 以相反的顺序提供客户端 SSL DN?

    我很好奇为什么某些 Web 服务器 例如 Nginx 以相反的顺序提供客户端 SSL DN Web 应用程序将 DN 发布到 Java Web 服务 该服务尝试创建 Javajavax naming ldap LdapName http d