一、说明

随着信息安全的重要性日益凸显,数字证书在各种安全通信场景中扮演着至关重要的角色。国密算法,作为我国自主研发的加密算法标准,其应用也愈发广泛。然而,在Java环境中解析使用国密算法的数字证书时,我们可能会遇到一些挑战。

本文主要分享如何在 Java 中解析采用 SM3WITHSM2 签发算法的国密数字证书。

二、问题背景

数字证书通常遵循 X.509 格式标准,而在 Java 中,我们通常使用 java.security 包下的工具来解析这些证书。但是,当证书采用了国密算法,如 SM3WITHSM2 时,标准的 Java 库可能无法识别这种算法特定的椭圆曲线,因此在解析时会抛出异常。

例如,尝试使用以下代码解析一个采用国密算法的证书时:

CertificateFactory cf = CertificateFactory.getInstance("X509");
String filePath ="C:\\Users\\example\\Desktop\\ca.crt";
FileInputStream in =new FileInputStream(filePath);
X509Certificate cer = (X509Certificate) cf.generateCertificate(in);

可能会遇到如下错误:

java.security.cert.CertificateParsingException: java.io.IOException: Unknown named curve: 1.2.156.10197.1.301

这个错误表明 Java 标准库无法识别国密算法使用的椭圆曲线。

三、解决方案

为了解决这个问题,我们需要借助 BouncyCastle 这个强大的加密库,它提供了对多种加密算法的支持,包括国密算法。

步骤 1:添加BouncyCastle依赖

首先,需要将 BouncyCastle 库添加到项目中,在 pom.xml 中添加以下依赖:

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

步骤 2:修改代码以使用BouncyCastle

接下来需要修改代码,以便在解析证书时使用 BouncyCastle 提供者:

// 引入BC库
Security.addProvider(new BouncyCastleProvider());
// 使用BC解析X.509证书
CertificateFactory cf = CertificateFactory.getInstance("X509", "BC");

完整的测试代码如下:

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.Security;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.io.FileInputStream; public class SMCertificateParser {
public static void main(String[] args) {
try {
// 注册BouncyCastle提供者
Security.addProvider(new BouncyCastleProvider()); // 使用BouncyCastle提供者解析X.509证书
CertificateFactory cf = CertificateFactory.getInstance("X509", "BC");
String filePath = "C:\\Users\\example\\Desktop\\ca.crt";
FileInputStream in = new FileInputStream(filePath);
X509Certificate cer = (X509Certificate) cf.generateCertificate(in); // 打印证书信息
System.out.println("版本号:" + cer.getVersion());
System.out.println("序列号:" + cer.getSerialNumber().toString());
System.out.println("有效期:from:" + cer.getNotBefore() + " to: " + cer.getNotAfter());
System.out.println("签发算法:" + cer.getSigAlgName());
System.out.println("签发算法ID:" + cer.getSigAlgOID()); in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}

执行程序后,输出以下信息:

版本号:3
序列号:228766466093659650410797181222534438848
有效期:from:Mon Mar 13 17:31:00 CST 2023 to: Mon Feb 23 17:31:00 CST 2093
签发算法:SM3WITHSM2
签发算法ID:1.2.156.10197.1.501

四、结论

通过引入 BouncyCastle 库并修改代码以使用该库,我们现在能够成功解析采用国密 SM3WITHSM2 算法的数字证书。这一解决方案不仅限于 SM3WITHSM2 还适用于其他国密算法或任何非标准算法,只要 BouncyCastle 库支持这些算法。

扫码关注有惊喜!

如何基于Java解析国密数字证书的更多相关文章

  1. openssl解析国密X509证书

    openssl解析国密X509证书,把公钥拿出来重写一下就行了        x = strToX509(pbCert, pulCertLen);dwRet = getCertPubKey(x, &a ...

  2. java 解析国密SM2算法证书

    首先说明用Java自带的解析x509证书类,是不能解析sm2算法的证书,执行会抛出异常. 用开源库bouncycastle能够解析.详细代码 private byte[] getCSPK(byte[] ...

  3. 部署国密SSL证书,如何兼容国际主流浏览器?

    国密算法在主流操作系统.浏览器等客户端中,还没有实现广泛兼容.因此,在面向开放互联网的产品应用中,国密算法无法得到广泛应用.比如,在SSL证书应用领域,由于国际主流浏览器不信任国密算法,如果服务器部署 ...

  4. 国密SSL证书申请免费试用

    沃通提供国密SSL证书免费申请试用服务,一次申请可同时签发SM2/RSA双算法证书,试用周期1个月,用于测试国密SM2 SSL证书的运行效果和SM2/RSA双证书部署效果. 试用产品:SM2/RSA双 ...

  5. java sm4国密算法加密、解密

      java sm4国密算法加密.解密 CreationTime--2018年7月5日09点20分 Author:Marydon 1.准备工作 所需jar包: bcprov-jdk15on-1.59. ...

  6. 国密SSL证书免费试用申请指南

    沃通提供国密SSL证书免费申请试用服务,一次申请可同时签发SM2/RSA双算法证书,试用周期1个月,用于测试国密SM2 SSL证书的运行效果和SM2/RSA双证书部署效果. 试用产品:SM2/RSA双 ...

  7. Java加密解密与数字证书的操作

    1 keytool命令总结 一.创建数字证书 交互模式 使用默认的密钥库.keystore(文件夹是c: Documents and Settingusername)和算法(DSA) keytool  ...

  8. JAVA JDK keytool 生成数字证书

    简介: 数字证书作为网络安全数据传输的凭证,web在传输时客户端(浏览器)和 服务端(服务器)先进行会话握手,在握手过程中服务端会验证客户端的是否已经在服务端做了认证,这是单向认证.如果是双向认证的话 ...

  9. k8s基于CA签名的双向数字证书认证(三)

    1.设置kube-apiserver的CA证书相关的文件和启动参数   1)创建CA证书和私钥相关的文件 openssl genrsa -out ca.key openssl req -x509 -n ...

  10. OpenSSL 1.1.1 国密算法支持

    OpenSSL 1.1.1 国密算法支持 https://www.openssl.org/ https://github.com/openssl/openssl OpenSSL 1.1.1 新特性: ...

随机推荐

  1. [oeasy]python0137_相加运算_python之禅_import_this_显式转化

    变量类型 相加运算 回忆上次内容 上次讲了是从键盘输入变量 input 函数 可以有提示字符串 需要有具体的变量接收输入的字符串   输入单个变量没有问题 但是输入两个变量之后 一相加就非常离谱   ...

  2. oeasy教您玩转vim - 23 - 配置文件

    配置文件 回忆上节课内容 我们上次找到配置文件的位置 ~/.vimrc 了解各种配置开关 修改配置文件并应用 这次想了解和配色方案相关的内容 colorscheme vi ~/.vimrc.old 中 ...

  3. Umov移动方块-scratch编程作品

    程序说明: <Umov移动方块>是一款基于Scratch平台制作的小游戏.在这个游戏中,玩家将面对一个3×3的圆圈棋盘,并通过鼠标控制蓝色方块在这些圆圈中灵活移动.游戏的挑战在于,舞台的四 ...

  4. 如何实现对ELK各组件的监控?试试Metricbeat

    一.前言 开发排查系统问题用得最多的手段就是查看系统日志,ELK 是 Elastic 公司开源的实时日志处理与分析解决方案,已经为日志处理方案的主流选择. 而在生产环境中,如何针对 ELK 进行监控, ...

  5. Java--匿名类(学习笔记)

    匿名类的特点:(1) 匿名类是final类:(3) 在匿名类中可以定义实例变量和若干个实例初始化代码块和新的实例方法.Java虚拟机首先调用父类的构造方法,然后按照实例变量的和实例初始化代码块定义的先 ...

  6. 【Web】 抓包工具Charles

    官方软件包下载 https://www.charlesproxy.com/download/ 在线生成激活码: https://www.zzzmode.com/mytools/charles/ 代理设 ...

  7. Asp.Net Core之Identity源码学习

    什么是Identity ASP.NET Identity是构建核心 Web 应用程序(ASP.NET.登录和用户数据)的成员系统.ASP.NET核心标识允许您向应用程序添加登录功能,并可以轻松自定义有 ...

  8. 【转载】 AI与人类首次空战,5:0大胜!40亿次模拟造美国怪兽,谁与争锋? (再次证明深度强化学习路线的正确性)

    原文: https://mbd.baidu.com/newspage/data/landingsuper?context=%7B%22nid%22%3A%22news_1003478953355572 ...

  9. POI1999 Store-keeper 题解

    前言 题目链接:洛谷:SPOJ:hydro & bzoj. \(\Theta(nm)\) 的算法. 题意简述 在一个划分为 \(n \times m\) 个区域的二维仓库中,称有公共边的两个区 ...

  10. 2.3.6版本发布!Apache SeaTunnel Zeta引擎迎来新架构!

    Apache SeaTunnel 2.3.6 版本于近日正式发布,社区期待的 SeaTunnel Zeta Master/Worker 新架构.事件通知机制.支持动态编译的transform等新功能和 ...