首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

RSA 加密報錯「DER input, Integer tag error」:密鑰格式不匹配排查與解決

     編輯:Java 綜合教學

RSA 加密報錯「DER input, Integer tag error」:密鑰格式不匹配排查與解決

調用 RSAUtil.sign(priKey, reqVal) 簽名時拋出 DER input, Integer tag error,經排查為私鑰格式與代碼解析邏輯不匹配。

錯誤現象

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: DER input, Integer tag error
    at sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:217)
    at java.security.KeyFactory.generatePrivate(KeyFactory.java:372)
    ...

根因分析

  • 代碼期望 PKCS#8 格式私鑰(以 -----BEGIN PRIVATE KEY----- 開頭)
  • 實際傳入 PKCS#1 格式(以 -----BEGIN RSA PRIVATE KEY----- 開頭)或含換行/空格的異常字串
  • DER 解碼器按 PKCS#8 結構解析,遇到 PKCS#1 結構的 INTEGER 標籤不匹配而報錯

解決方案

  1. 統一密鑰格式:使用 OpenSSL 轉換
    openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out pkcs8_private_key.pem
  2. 代碼兼容兩種格式:檢測頭部標識,PKCS#1 需手動構建 PKCS#8 結構再解析
  3. 清理密鑰字串:移除 -----BEGIN ...-----、-----END ...-----、換行符、空格,Base64 解碼後再構建 KeySpec

最佳實踐

  • 生成密鑰對時直接輸出 PKCS#8:openssl genrsa -out key.pem 2048 && openssl pkcs8 -topk8 -inform PEM -in key.pem -outform PEM -nocrypt -out pkcs8_key.pem
  • 配置文件存儲 Base64 編碼的純密鑰體,避免換行干擾
  • 單元測試覆蓋多種格式輸入,確保解析健壯性
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved