java实现解析x509数字证书DN的各项属性,并校验DN是否符合标准

news/2024/10/19 4:21:37/

目录

  • 前言
  • 一、使用 javax.naming.ldap.LdapName 类
  • 二、使用 org.bouncycastle.asn1.x500.X500Name 类(推荐)
  • 总结


前言

公司产品中一个业务需要解析证书DN的各项属性,并提取某项属性的属性值。之前的实现是将DN作为字符串进行操作,以逗号split之后遍历取出各项属性,再以等号split取出某项属性值。在碰到某个DN中有一个逗号(,)的特殊格式后就会导致数组越界的问题。这种方式很不可取,遂查资料写了以下两种方式。


一、使用 javax.naming.ldap.LdapName 类

		LdapName ln = null;try {ln = new LdapName(dn);} catch (InvalidNameException e) {// TODO Auto-generated catch blocke.printStackTrace();}for(Rdn rdn : ln.getRdns()) {System.out.println("LdapName--Type-- "+rdn.getType());System.out.println("LdapName--Value-- "+rdn.getValue());}

这个方法是在网上查到,容易实现,不用引入其他jar包,是java自带的方法。符合RFC 2253规定的,类似于CN = Steve Kille,O = Isode Limited,C = CN这种格式的字符串都能解析。但在这个业务场景下,该方法的缺点是不能判断某个属性是否是证书DN中规定的属性。比如CNTest = Steve Kille,O = Isode Limited,C = CN,标准的证书DN项中没有CNTest 这一项,但是这种方法同样可以解析出来。

二、使用 org.bouncycastle.asn1.x500.X500Name 类(推荐)

基于以上原因,考虑到产品中的实际业务使用,翻阅bouncycastle的源码,写了如下方法。

maven引入

        <dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.51</version></dependency>

代码如下

	private static Map<String, String> parseDNToMap(String dn) {if(StrUtil.isBlank(dn)) {return null;}Map<String, String> resMap = new HashMap<String, String>();X500Name x500Name = new X500Name(dn);RDN[] rdNs = x500Name.getRDNs();for (int i = 0; i < rdNs.length; i++) {AttributeTypeAndValue first = rdNs[i].getFirst();//获取属性名的oidASN1ObjectIdentifier type = first.getType();//将属性名的oid转换为属性名String typeString = BCStyle.INSTANCE.oidToDisplayName(type).toUpperCase();//或使用RFC4519Style.INSTANCE.oidToDisplayName(type).toUpperCase();//获取属性值String valueString = first.getValue().toString();resMap.put(typeString, valueString);}return resMap;}

如果有非标准规定的属性名,会抛出异常如下

Exception in thread "main" java.lang.IllegalArgumentException: Unknown object id - CNTest - passed to distinguished nameat org.bouncycastle.asn1.x500.style.IETFUtils.decodeAttrName(Unknown Source)at org.bouncycastle.asn1.x500.style.BCStyle.attrNameToOID(Unknown Source)at org.bouncycastle.asn1.x500.style.IETFUtils.rDNsFromString(Unknown Source)at org.bouncycastle.asn1.x500.style.BCStyle.fromString(Unknown Source)at org.bouncycastle.asn1.x500.X500Name.<init>(Unknown Source)at org.bouncycastle.asn1.x500.X500Name.<init>(Unknown Source)at com.certTest.x509NameTest.main(x509NameTest.java:86)

总结

以上两种方法亲测有效,如果只是要解析DN各项,第一种方法更方便。如果同时需要校验DN是否符合标准可选用第二种。


http://www.ppmy.cn/news/187295.html

相关文章

IBM Power 550

特性和优势 特性 优势 领先的 POWER6 性能 更快速地访问数据并缩短响应时间 以更少的服务器完成更多工作并通过减少服务器和软件许可的数量实现基础架构成本节省 出色的可扩展性和容量 随您的企业的增长轻松扩展系统 利用 PowerVM 版本整合 UNIX …

高性能计算工作站的尴尬

http://blog.daviesliu.net/ 我原来的论文工作进展不下去&#xff0c;调剂到了隔壁实验室做课题&#xff0c;需要用ANSYS做电磁场仿真&#xff0c;分析管道的涡流场。ANSYS对计算机的性能要求比较高&#xff0c;尤其是内存容量&#xff0c;同学要做一个70万自由度的分析&#x…

R语言:作业六(逆变换法生成随机变量;线性同余发生器LCG的编写)

1. 用逆变换法编写产生下述随机变量的程序&#xff1a; X 0 1 p 0.4 0.6 模拟10000次&#xff0c;并确定随机变量的值0的比例。 f <- function(n){{x <- rep(0,n)for (i in 1:n){u <- runif(1)if(u < 0.6) x[i] <- 1else x[i] <- 0}x} } test <- f(1000…

SAML入门

SAML (Security Assertion Markup Language)入门 提到SAML (Security Assertion Markup Language), 很多人都会联想到单点登录SSO。那么Saml到底是什么&#xff0c;它跟sso到底有什么联系&#xff1f;这里给大家分享一下我在读完了saml差不多全部规范之后的一些心得。希望给sa…

深入浅出单点登录---3、基于SAML实现的统一认证

概述 SAML 2.0 用来在安全域中交换身份验证&#xff08;Authentication&#xff09;数据和 授权&#xff08;Authorization&#xff09;数据。SAML 2.0基于 XML协议&#xff0c;使用包含断言&#xff08;Assertions&#xff09;的安全令牌在SAML授权方&#xff08;即身份提供者…

神基X500笔记本系统故障无法启动怎么重装系统?

神基X500笔记本系统故障无法启动怎么重装系统&#xff1f;在使用这款神基X500笔记本的时候&#xff0c;用户遇到了一些系统问题&#xff0c;导致电脑无法正常的开机使用。系统不能启动的时候一般是系统损坏&#xff0c;或者电脑受到攻击。这个情况可以去进行电脑系统的重装&…

计算机组成大题分析(六)

假定计算机的主频为 500MHz &#xff0c;CPI 为4。现有设备A 和 B&#xff0c;其数据传输率分别为2MB/s 和 40MB/s &#xff0c;对应 I/O 接口中各有一个 32 位数据缓冲寄存器。请回答下列问题&#xff0c;要求给出计算过程。 (1) 若设备 A 采用定时查询 I/O 方式&#xff0c;每…

x570 raidxpert2

搞了两个1TB硬盘组raid&#xff0c;AMD x570支持硬件raid, raid0模式&#xff0c;但操作系统下raid驱动只看到了windows的&#xff0c;对于一个也厌烦了windows且工作于嵌入式Linux的人来说&#xff0c;是头疼的事。 虽然linux下有软raid开源程序&#xff08;试过mdadm&#x…