2012-07-30 41 views
1

我在使用BouncyCastle檢查XMLSignature以驗證使用ECDSA的Sigantures時遇到問題。Bouncycastle XmlSignatureFactory NoSuchAlgorithmException

這裏是代碼中的相關行:

BouncyCastleProvider provider = new BouncyCastleProvider(); 
Security.addProvider(provider); 
//some unrelated code 
XMLSignatureFactory factory = XMLSignatureFactory.getInstance("DOM", provider); 

在最後一行,以下異常拋出:

javax.xml.crypto.NoSuchMechanismException: java.security.NoSuchAlgorithmException: no such algorithm: DOM for provider SC 

如果我改變行

XMLSignatureFactory factory = XMLSignatureFactory.getInstance("DOM"); 

我得到

javax.xml.crypto.MarshalException: unsupported SignatureMethod algorithm: http://www.w3.org/2007/05/xmldsig-more#ecdsa-ripemd160 

任何人有任何想法是什麼原因造成的?

回答

2

在第一個錯誤中,您可以在錯誤描述中讀入「沒有這樣的算法:供應商SC的DOM」。這很奇怪,因爲它應該像「提供商SC」(Sun PC/SC提供商)而不是「提供商BC」(BouncyCastle安全提供商)。它看起來像你的代碼(內部)沒有使用Bouncycastle,只要你想。你應該知道爲什麼會發生這種情況。這可能是關於BC庫和類路徑(如果您正在使用應用程序服務器)或提供程序順序配置的問題。

第二個錯誤。你改變你的方法得到XMLSignatureFactory。這一個是更好的,因爲如果你不指定供應商,這是因爲:

此方法使用標準的JCA提供者查找機制來查找 和實例化所需的 機制類型的XMLSignatureFactory實現。它遍歷了註冊安全提供商名單 ,從最優先的提供商開始。返回支持指定機制的第一個Provider的新的 XMLSignatureFactory對象。

但現在,算法不存在。所以爲什麼?在這裏,我會說BC沒有被使用。它在那裏?查看你的類路徑。

它可以幫助列出所有可用的提供商:

for (Provider p : Security.getProviders()) { 

    log.debug(p.getName()); 
    log.debug(p.getInfo()); 
} 
當我列出所有供應商
+0

BouncyCastle的安全提供v1.46列:「名稱:SC」,「信息:BouncyCastle的安全提供商v1.46「,所以SC是BouncyCastle提供商。 – billdoor 2012-07-30 07:52:34

+0

剛纔看到完整的條目是 – billdoor 2012-07-30 08:08:45

+0

你確定?看看這個:http://stackoverflow.com/q/10817964/980472當我列出提供商BouncyCastle名稱是「BC」。 – jddsantaella 2012-07-30 08:20:38