如何通过Java代码获取GitHub App私钥PEM文件的指纹?
从GitHub App的PEM私钥文件获取SHA256指纹(Java实现)
GitHub App生成的私钥指纹,本质是该私钥对应公钥的SHA256哈希值,经过Base64编码后加上SHA256:前缀。以下是用Java代码获取该指纹的具体实现:
依赖准备
GitHub生成的私钥是PKCS#8格式的PEM文件,JDK默认API解析起来比较繁琐,推荐使用BouncyCastle库简化操作。如果用Maven管理项目,添加以下依赖:
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcpkix-jdk15on</artifactId> <version>1.70</version> </dependency>
代码实现
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo; import org.bouncycastle.openssl.PEMParser; import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter; import java.io.FileReader; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.RSAPublicKeySpec; import java.security.MessageDigest; import java.util.Base64; public class GitHubKeyFingerprint { public static void main(String[] args) throws Exception { // 替换为本地PEM私钥文件的实际路径 String pemFilePath = "/your/local/path/github-app-key.pem"; try (PEMParser pemParser = new PEMParser(new FileReader(pemFilePath))) { // 解析PEM文件得到私钥信息 PrivateKeyInfo keyInfo = (PrivateKeyInfo) pemParser.readObject(); JcaPEMKeyConverter converter = new JcaPEMKeyConverter(); PrivateKey privateKey = converter.getPrivateKey(keyInfo); // 从私钥中提取对应公钥 KeyFactory keyFactory = KeyFactory.getInstance("RSA"); RSAPublicKeySpec publicKeySpec = keyFactory.getKeySpec(privateKey, RSAPublicKeySpec.class); PublicKey publicKey = keyFactory.generatePublic(publicKeySpec); // 计算公钥的SHA256哈希 MessageDigest sha256Digest = MessageDigest.getInstance("SHA-256"); byte[] hashBytes = sha256Digest.digest(publicKey.getEncoded()); // 生成与GitHub UI一致的指纹格式 String base64Hash = Base64.getEncoder().encodeToString(hashBytes); String fingerprint = "SHA256:" + base64Hash; System.out.println("匹配GitHub的指纹: " + fingerprint); } } }
关键逻辑说明
- 解析PEM文件:通过BouncyCastle的
PEMParser直接读取并解析PKCS#8格式的PEM私钥,无需手动处理文件头部、尾部的标识行。 - 提取公钥:GitHub显示的指纹基于私钥对应的公钥生成,因此需要从私钥中推导公钥。
- 生成指纹:对公钥的DER编码字节计算SHA256哈希,再进行Base64编码,最后拼接
SHA256:前缀,即可得到与GitHub UI完全一致的指纹字符串。
内容的提问来源于stack exchange,提问作者kolobok_ua
相关产品推荐
相关产品推荐

