Java MTLS主题和发行者顺序

Java MTLS主题和发行者顺序,java,ssl,mtls,Java,Ssl,Mtls,我们正在升级我们与合作伙伴之间的连接,他们要求我们升级到MTL。我一直在调试低级java javax.net.debug=all 我可以看出握手是成功的。但是,合作伙伴会对Subject和Issuer字段进行完整的字符串匹配,并与数据库中的其他字段进行比较 我使用了以下方法 if (cert instanceof X509Certificate) { X509Certificate x509cert = (X509Certificate) cert; //

我们正在升级我们与合作伙伴之间的连接,他们要求我们升级到MTL。我一直在调试低级java

javax.net.debug=all
我可以看出握手是成功的。但是,合作伙伴会对Subject和Issuer字段进行完整的字符串匹配,并与数据库中的其他字段进行比较

我使用了以下方法

   if (cert instanceof X509Certificate) {
        X509Certificate x509cert = (X509Certificate) cert;

        // Get subject
        Principal principal = x509cert.getSubjectDN();
        String subjectDn = principal.getName();
        logger.error(subjectDn);
        // Get issuer
        principal = x509cert.getIssuerDN();
        String issuerDn = principal.getName();
        logger.error(issuerDn);
    }
转储java具有的值。一个有趣的注释是openssl,它以与java报告完全不同的顺序报告它们

我现在一直在Wireshark中搜寻,我可以看到从那个层面上的握手,但是,它似乎将名字翻译成了commonName的
id
pkcs-9-at-emailAddress


有没有办法知道实际发送的是什么?

没有协议MTL,但听起来您关心的是TLS中的客户端身份验证,也称为相互身份验证,与服务器身份验证一样,通常使用X.509类型(更确切地说,是PKIX)证书

背景:X.509/PKIX证书使用也称为X500名称、X501名称或简单名称来标识主体和颁发者(有时在某些扩展中还包括其他事物/实体)。该结构在ASN.1中定义为相对的DistingUIshedName项的序列(有序),每个项都是正式的属性类型和值对(序列)的集合(无序),尽管在实践中RDN集合几乎总是单态的,因此名称实际上是属性类型和值的序列。此名称格式设计用于“目录”的全球分布式分层网络,与DNS类似(因为CCITT-now-ITU-T是政府机构的组织)主要植根于基于国家的国家目录,而不是功能性或“通用”目录,如
.com.org.edu.gov.mil.net
,X.509证书的设计基本上是从离线可用的目录网络导出数据。实际上,根本不使用真正的X.500目录,甚至LDAP(轻量级目录访问协议)之类的协议也没有在Microsoft Windows“域”(Active Directory)之外的其他应用程序中使用,但X.509证书(包括其中使用的名称格式)在SSL now TLS、S/MIME和许多其他应用程序中广泛使用

DN的传统文本或外部形式是一系列attr=值项,其中attr通常缩写,例如C表示国家,ST表示州或省,CN表示通用名等。Java使用RFCs 1485、1779定义的标准化形式(稍加修改/改进),2253和4514,其中项目由逗号分隔,并以相反顺序给出,即从最后一个(最低级别)到第一个(最高级别通常为根),类似于DNS。例如,Java将www.duckduckgo.com当前使用的证书主题显示为

CN=*.duckduckgo.com, O="Duck Duck Go, Inc.", L=Paoli, ST=Pennsylvania, C=US
OpenSSL传统上使用的默认格式是在每个项前面都有斜杠(而不是逗号分隔它们),并且也是按顺时针顺序排列的

C = US, ST = Pennsylvania, L = Paoli, O = "Duck Duck Go, Inc.", CN = *.duckduckgo.com 
但是1.1.0以上版本将默认值更改为使用逗号分隔符和前进顺序

C = US, ST = Pennsylvania, L = Paoli, O = "Duck Duck Go, Inc.", CN = *.duckduckgo.com 
一些OpenSSL命令行操作,如
x509
,支持其他显示格式;请参阅“名称选项”下的手册页。特别是
x509-nameopt-oneline,dn_rev
提供了与Java几乎相同的格式:

CN = *.duckduckgo.com, O = "Duck Duck Go, Inc.", L = Paoli, ST = Pennsylvania, C = US
Wireshark如果您只查看传输的证书(在TLS中)的摘要,则会显示属性=值对,并带有全名,而不是属性的缩写,其顺序与RFCs和Java相反:

但是,如果单击加号框展开几个级别,则可以分别看到每个属性项的结构,按正向顺序排列:


正是因为显示格式有很多变化,所以将DNs作为字符串进行比较不是一个好主意。如果需要将其作为字符串存储在数据库中,更好的方法是从字符串中重建结构化表单(使用顺序、缩写等一致约定),并比较结构化对象。如果您阅读javadoc并看到类似的
.getSubjectDN()
被“贬损”(显然是被“弃用”)并且自Java 1.4以来被使用文档化API类的
.getIssuerX500Principal()
.getSubjectX500Principal()
取代,这会变得更容易一些(而不是一个不透明的内部类)使用有文档记录的
.equals()
操作。

没有协议MTL,但听起来您关心的是TLS中的客户端身份验证,也称为相互身份验证,与服务器身份验证一样,通常使用X.509类型(更确切地说,是PKIX)证书

背景:X.509/PKIX证书使用也称为X500Name、X501Name或简称的名称来标识主体和颁发者(有时在某些扩展中还有其他事物/实体)。该结构在ASN.1中定义为相对的DistingUIshedName项的序列(有序),每个项都是一组正式的(无序的)对(序列)属性类型和值,尽管在实践中RDN集几乎总是单例的,因此名称实际上是属性类型和值的序列。此名称格式设计用于全局、分布式、层次化的“目录”网络,而不像DNS那样(因为CCITT-now-ITU-T是政府机构的组织)X.509证书主要源于基于国家的国家目录,而不是功能性或“通用”目录,如
.com.org.edu.gov.mil.net
,X.509证书的设计基本上是从离线可用的目录网络中导出数据。实际上,根本不使用真正的X.500目录,甚至是用于我喜欢LDAP(轻量级目录访问协议),除了