证书格式为X.509。将证书直接写在服务端代码内,尝试用Java解析证书并获取公钥
代码如下:

try{CertificateFactory CF = CertificateFactory.getInstance("X.509"); // 从证书工厂中获取X.509的单例类InputStream fileIn = new FileInputStream("F:\XH3.0\Base64X509.cer"); // 将本地证书读入文件流Certificate C = CF.generateCertificate(fileIn);  // 将文件流的证书转化为证书类String  certificateStr = C.toString();System.out.println("使用[自带库函数]读入证书结果如下:");System.out.print(certificateStr);System.out.println("--------------------------------------\n证书主要字段:");X509Certificate cer = (X509Certificate)C;System.out.println("版本号:" + cer.getVersion());System.out.println("序列号:" + cer.getSerialNumber().toString());System.out.println("颁发者:" + cer.getSubjectDN());     // System.out.println("颁发者唯一标识符: " + cer.getSubjectUniqueID().toString());System.out.println("使用者:" + cer.getIssuerDN());//  System.out.println("使用者唯一标识符: " + cer.getIssuerUniqueID().toString());System.out.println("有效期:from:" + cer.getNotBefore() + "  to: " + cer.getNotAfter());System.out.println("签发算法" + cer.getSigAlgName());System.out.println("签发算法ID:" + cer.getSigAlgOID());System.out.println("证书签名:" + cer.getSignature().toString());byte [] sig = cer.getSigAlgParams();PublicKey publicKey = cer.getPublicKey();byte [] pkenc = publicKey.getEncoded();System.out.println("解析出的公钥:" + Base64.getEncoder().encodeToString(pkenc));System.out.println("公钥:");for(int i = 0; i < pkenc.length; i++){System.out.print(pkenc[i]);}
} catch(Exception e){e.printStackTrace();
}

运行后报错

java.security.cert.CertificateParsingException: java.io.IOException: Unknown named curve: 1.2.156.10197.1.301at sun.security.x509.X509CertInfo.<init>(X509CertInfo.java:169)at sun.security.x509.X509CertImpl.parse(X509CertImpl.java:1855)at sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:195)at sun.security.provider.X509Factory.engineGenerateCertificate(X509Factory.java:104)at java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:339)at com.yunyong.ufs.api.bank.executor.client.Test.main(Test.java:89)

上网搜索得知:国密证书使用了自有的椭圆曲线,所以无法使用JDK自带的java.security解析证书(http://www.jonllen.com/jonllen/work/162.aspx)。经过调研,需要引入BouncyCastle,BC库支持国密算法。参考这篇文章(https://blog.csdn.net/jinhill/article/details/9996117)修改代码,在pom.xml增加BC库依赖:

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

修改测试代码为

try{// 引入BC库Security.addProvider(new BouncyCastleProvider());// 使用BC解析X.509证书CertificateFactory CF = CertificateFactory.getInstance("X.509", "BC"); // 从证书工厂中获取X.509的单例类InputStream fileIn = new FileInputStream("F:\XH3.0\Base64X509.cer"); // 将本地证书读入文件流Certificate C = CF.generateCertificate(fileIn);  // 将文件流的证书转化为证书类String  certificateStr = C.toString();System.out.println("使用[自带库函数]读入证书结果如下:");System.out.print(certificateStr);System.out.println("--------------------------------------\n证书主要字段:");X509Certificate cer = (X509Certificate)C;System.out.println("版本号:" + cer.getVersion());System.out.println("序列号:" + cer.getSerialNumber().toString());System.out.println("颁发者:" + cer.getSubjectDN());     // System.out.println("颁发者唯一标识符: " + cer.getSubjectUniqueID().toString());System.out.println("使用者:" + cer.getIssuerDN());//  System.out.println("使用者唯一标识符: " + cer.getIssuerUniqueID().toString());System.out.println("有效期:from:" + cer.getNotBefore() + "  to: " + cer.getNotAfter());System.out.println("签发算法" + cer.getSigAlgName());System.out.println("签发算法ID:" + cer.getSigAlgOID());System.out.println("证书签名:" + cer.getSignature().toString());byte [] sig = cer.getSigAlgParams();PublicKey publicKey = cer.getPublicKey();byte [] pkenc = publicKey.getEncoded();System.out.println("解析出的公钥:" + Base64.getEncoder().encodeToString(pkenc));System.out.println("公钥:");for(int i = 0; i < pkenc.length; i++){System.out.print(pkenc[i]);}
} catch(Exception e){e.printStackTrace();
}

经测试,可以正常读取证书内容

内容参考 https://www.jianshu.com/p/6390cde8f4fd?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

Java读取证书报错:java.io.IOException: Unknown named curve: 1.2.156.10197.1.301相关推荐

  1. Java IDEA pom 报错java.lang.OutOfMemoryError: GC overhead limit exceeded 基本所有依赖都报错(除了JDK自带String等)解决详

    @Java IDEA pom 报错java.lang.OutOfMemoryError: GC overhead limit exceeded 基本所有依赖都报错(除了JDK自带String等)解决详 ...

  2. java解压报错java.io.IOException: failed to skip current tar entry

    #java解压出现java.io.IOException: failed to skip current tar entry 当使用如下函数解压: AntBuilder antBuilder = ne ...

  3. java格式错误什么意思_java.io.IOException可能的原因是什么:“文件名,目录名或卷标语法不正确”...

    我试图使用以下代码复制一个文件: File targetFile = new File(targetPath + File.separator + filename); ... targetFile. ...

  4. java 合并pdf报错,[Java教程]java合并PDF文件

    [Java教程]java合并PDF文件 0 2017-02-22 12:00:52 使用java代码合并PDF文件需要导入iText-2.1.7.jar包1 import java.io.FileOu ...

  5. java v_java -v报错 java -version正确

    如题:maven打包上传项目时报错 mvn deploy Error occurred during initialization of VM java/lang/NoClassDefFoundErr ...

  6. java程序启动报错 “java.lang.OutOfMemoryError: Java heap space”问题的解决办法(IDEA开发工具)

    项目执行 mvn clean install 成功 在idea 进行debug启动一直报错, 报编译错: maven-resources-production:xxx java.nio.file.in ...

  7. java(优化15) 报错java.lang.ClassNotFoundException: net.sf.ezmorph.Morpher解决方案

    一. 测试类 public static void main(String[] args) {String str="{\"value\":\"我是测试valu ...

  8. java 读取文件 报错 java.io.FileNotFoundException

    一般来说就两个问题: 1 路径写错了 2 对应路径下没有要找的文件 解决方法: 绝大部分情况都是路径写错了... 路径的错误: 1)最好用绝对路径 2)如果是win10的话,看看格式里的反斜杠对不对( ...

  9. java 读utf-8 xml_〖JAVA经验〗JDom输出UTF-8的XML完美解决方法

    完美的解决方法从辟谣开始: 1)JDOM是否生成UTF-8的文件与Format是否设置无关,只有输出其他字符编码才需要设置,见下面的注释. 2)JDOM输出UTF-8文件乱码的根本原因并非在JDOMA ...

  10. java里面add报错,java错误

    1.在Spring的管理下,运用entity对象是需要在XML配置alias别名.既是Spring需先创建对象 2.在springMVC中,返回modelandview时,可能遇到 model is ...

最新文章

  1. BI+Tableau
  2. 禁止苹果手机默认行为(阻止页面的滚动)
  3. oracle中获取年份、月份段内的时间
  4. PHP安装之configure的配置参数
  5. ncurses下c语言定位光标,C指针原理教程之Ncurses介绍
  6. c#byte字节流的读取_C#中的byte关键字
  7. oraoledb.oracle 12c,关于OraOLEDB.Oracle找不到驱动问题的一种可能解决方案
  8. Mobile Terminal无法使用常用Unix命令
  9. new 失败的处理方式
  10. Android开发-无法新建Activity及新建后编译错误
  11. SQL Server创建数据库
  12. 2019数据安装勾选_怎么安装勾选平台控件,如何网上勾选认证发票?
  13. 判断二元关系的性质:自反性、对称性、传递性
  14. ABAP的OPEN CURSOR语法
  15. 一段让你虎躯一震的代码
  16. 信息安全系统设计基础第八周期中总结
  17. 算法题-排列组合问题
  18. HDFS(下):NameNode和SecondaryNameNode、HDFS工作机制、故障处理、集群安全模式、服役退役节点、集群黑白名单、DataNode多目录详解、HDFS2.x新特性
  19. 五子棋游戏图形化实现
  20. 计算机学院华北科技学院考研,2019年华北科技学院硕士研究生招生拟录取名单公示...

热门文章

  1. 新浪UC端自动登录小工具和分析UC端登录
  2. xp此计算机无法连接到,WinXP打印机共享无法连接如何解决?
  3. python学习之面对对象程序设计作业
  4. GraphQL 总结 + 在Django应用(Graphene)
  5. 动词ing形式的5种用法_动词ing形式的用法及变化规则.
  6. 【产品】 产品设计:ID工业设计、MD结构设计、HW硬件设计和SW软件设计详解
  7. php获取ip归属地
  8. psn注册什么服务器,怎么注册PSN港服账号?PSN港服官网注册教程
  9. 全国英语计算机四六级成绩查询,大学英语四六级考试成绩查询
  10. Monkey测试个人笔记