正文


用到的依赖

<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version>
</dependency>
// 从字符串生成证书对象
// 证书必须以 "-----BEGIN CERTIFICATE-----" 开头,以 "-----END CERTIFICATE-----" 结尾。
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream in = new ByteArrayInputStream(cert.getBytes());
X509Certificate cert = (X509Certificate) cf.generateCertificate(in); // 证书指纹 -1
// getEncoded 返回的是完整的证书编码,包括了证书的元数据和签名信息,适合用于将证书进行持久化存储或者在网络上传输
String certthumbprint1 = getThumbprint(cert.getEncoded(), "SHA-1");
// 证书指纹 -2
// getTBSCertificate 返回的是证书的原始信息,不包括数字签名,适合用于检查证书的内容和属性
String certthumbprint2 = getThumbprint(cert.getTBSCertificate(), "SHA-1"); // 公钥指纹
PublicKey publicKey = cert.getPublicKey();
String publickeythumbprint = getThumbprint(publicKey.getEncoded(), "SHA-1"); // 主体秘钥标识符 SubjectKeyIdentifier
// 详细作用见:https://blog.csdn.net/a82514921/article/details/104589443/
// SubjectKeyIdentifier 在证书的扩展部分,需要使用下面的方法提取,subjectKeyIdentifierExt 直接取出来的还需要做一下处理
byte[] subjectKeyIdentifierExt = cert.getExtensionValue(Extension.subjectKeyIdentifier.getId());
// SN1OctetString 类的具体作用是对 OCTET STRING 类型数据进行封装和处理,提供了一系列方法来操作 OCTET STRING 数据,例如获取数据的字节数组、比较两个 OCTET STRING 是否相等等操作。
// 在证书处理和加密算法中,经常会涉及到对 ASN.1 编码的数据进行解析和处理,ASN1OctetString 类就提供了对 OCTET STRING 数据进行操作的便利接口。
// 更具体的作用还需要研究 ASN.1
ASN1OctetString octetString = ASN1OctetString.getInstance(subjectKeyIdentifierExt);
SubjectKeyIdentifier subjectKeyIdentifier = SubjectKeyIdentifier.getInstance(octetString.getOctets());
String dnQualifier = Base64.getEncoder().encodeToString(subjectKeyIdentifier.getKeyIdentifier()); // 获取Base64格式化的指纹
public static String getThumbprint(byte[] input, String algorithm) {
try {
List<String> algorithmList = Arrays.asList("SHA-1", "SHA-256", "MD5");
if(StringUtils.isEmpty(algorithm)){
// 默认 SHA-1
algorithm = "SHA-1";
}else{
if(!algorithmList.contains(algorithm)){
// 算法不支持
return null;
}
}
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(input);
byte[] digest = md.digest();
String thumbPrint = Base64.getEncoder().encodeToString(digest);
return thumbPrint;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

参考


[1]. chatgpt3.5

[2]. openssl对SSL证书及密钥操作说明

java 提取证书指纹的更多相关文章

  1. java keytool证书工具使用小结

    java keytool证书工具使用小结 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, .crt    PEM-encod ...

  2. java keytool证书工具使用小结【转】

    java keytool证书工具使用小结 keytool导入导出多条目对比 在Security编程中,有几种典型的密码交换信息文件格式: DER-encoded certificate: .cer, ...

  3. java keytool证书工具使用小结(转)

    Keytool 是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:密钥实体(K ...

  4. java keytool证书工具使用小结(转载)

    原文地址:http://www.micmiu.com/lang/java/keytool-start-guide/ Keytool 是一个Java数据证书的管理工具 ,Keytool将密钥(key)和 ...

  5. 记支付宝接口对接,涉及到提取证书SN号的解决方案

    支付宝针对.NET SDK并未封装有提取证书SN序列号的方法,仅针对Java平台才有对应的方法(赤裸裸的歧视啊~~) 要想在提取这个SN序列号有两种方案: 1. 直接用Java SDK包来提取SN 2 ...

  6. Android 中获取 debug 测试 SHA1 和 release SHA1 证书指纹数据的方法

    百度地图开发的时候要申请KEY,需要提供SHA1证书指纹数据 Eclipse eclipse中直接查看:windows -> preferance -> android -> bui ...

  7. Android Studio中获取sha1证书指纹数据的方法

    高德地图开发申请KEY的时候需要开发者提供SHA1证书指纹数据,在eclipse很容易就找到了,但是Android Studio很久也没找到,只能使用在网上看到的方法了,在Android Studio ...

  8. java 提取目录下所有子目录的文件到指定位置

    package folder; import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundExcept ...

  9. Java提取URL某个参数的值

    Java提取Url中某个参数的值. public static String getParam(String url, String name) { String params = url.subst ...

  10. Azure 经典模式中虚拟机证书指纹的生成和作用

    用户在使用经典虚拟机时,经常会有如下疑问:门户主板页面中的 SSH/RDP 证书指纹这项信息是怎么来的?用途是什么?为什么有的时候为空?有没有对虚拟机使用有什么影响?以下我们进行一些基本的介绍: 证书 ...

随机推荐

  1. java netty 实现 websocket 服务端和客户端双向通信 实现心跳和断线重连

    java netty 实现 websocket 服务端和客户端双向通信 实现心跳和断线重连 maven依赖 <dependency> <groupId>io.netty< ...

  2. Python 多线程、线程池、协程 爬虫

    多线程生产者消费者模型爬虫 import queue import requests from bs4 import BeautifulSoup import threading import tim ...

  3. Redis内存容量评估

    业务侧申请redis服务器资源时,需要事先对redis容量做一个大致评估,之前的容量评估公式基本只是简单的 (key长度 value长度)* key个数,误差较大,后期经常需要进行缩扩容调整,因此提出 ...

  4. .NET Core 中使用GBK GB2312编码报错的问题

    错误描述 环境 dotnet core 2.1 2.2   dotnet core 3.1 dotnet core 5.0 现象 当代码中使用 System.Text.Encoding.GetEnco ...

  5. 机器学习策略篇:详解超过人的表现(Surpassing human- level performance)

    超过人的表现 讨论过机器学习进展,会在接近或者超越人类水平的时候变得越来越慢.举例谈谈为什么会这样. 假设有一个问题,一组人类专家充分讨论辩论之后,达到0.5%的错误率,单个人类专家错误率是1%,然后 ...

  6. Swift 计算字符串展示的区域

    一.如果是普通文本,那么可以采用NSString的方法,代码如下: import UIKit import PlaygroundSupport class MyViewController : UIV ...

  7. 用Python脚本迁移MongoDB数据到金仓-kingbase数据库

    1.首先需要明确MongoDB与kingbase的对应关系,collection相当于table,filed相当于字段,根据这个对应关系创建表: 此次迁移的MongoDB里的数据字段是:_id(自动生 ...

  8. 前端使用 Konva 实现可视化设计器(12)- 连接线 - 直线

    这一章实现的连接线,目前仅支持直线连接,为了能够不影响原有的其它功能,尝试了2.3个实现思路,最终实测这个实现方式目前来说最为合适了. 请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 ...

  9. 利用QEMU模拟大端序机器

    简介 当前我们安装虚拟机,一般小端机器比较多,有时候想模拟大端机器测试程序,这时就有模拟大端机器的需求. 参考:利用 QEMU USER 模式运行 mips 程序 - sinpo828 - 博客园 ( ...

  10. Lru在Rust中的实现, 源码解析

    LRU(Least Recently Used)是一种常用的页面置换算法,其核心思想是选择最近最久未使用的页面予以淘汰. LRU算法原理 基本思想:LRU算法基于一个假设,即如果一个数据在最近一段时间 ...