2010-11-16 81 views
0

我有一個有趣的問題,試圖使用IBM的JRE 6.0簽署SAML2聲明。如果我在Sun JDK下運行代碼,它會正確地簽署這些斷言並驗證簽名。如果我在IBM JRE下運行完全相同的代碼,則斷言創建正確,但簽名不會驗證。同樣,這是相同的代碼,事實上,它是從Jetty運行的,它與Jetty配置和WAR文件完全相同。我有兩個Jetty實例在不同的JRE上運行,但指向同一個Jetty主頁。在Sun JRE下生成的簽名將生效,但在IBM JRE下生成的簽名不會。我坦然地被難倒了,並且沒有辦法嘗試,所以任何建議都會有幫助。使用IBM SDK 6.0生成XML簽名

+0

好的,想通了。事實證明,XML Dsig的Sun實現比Xerces/XML Security和IBM的實現更加寬容。 DOM1和DOM2調用混合導致了問題,並且URI被解除引用的方式也引發了問題。用DOM2調用替換所有的DOM1調用(沒有名稱空間的DOM調用),並在DOMSignContext上設置ID信息解決了這個問題,它現在可以在兩個JVM下運行。 – 2010-11-17 16:52:42

+0

嘿,你能進一步解釋你在評論中做了什麼嗎?它的Xerces Implmentation必須改變嗎?什麼是最好的方式來做到這一點?我試着改變Parent_ClassLaoader,但是我得到了Servlet的classpath錯誤。所以我想避免這樣做。 – MikeDubs307 2011-02-02 15:11:48

+0

基本上我只是確保每個DOM調用都使用一個名稱空間值。因此,而不是Document.createElement(),我使用Document.createElementNS()。通過確保一切都有一個名稱空間定義它清除了錯誤。不需要更改Xerces實現,只是不要在同一個文檔中混合使用DOM1(不支持名稱空間)和DOM2 +(支持名稱空間)調用。 – 2011-02-02 22:01:26

回答

1

遲了幾年,但我會自己回答這個問題。問題是混合了DOM1(非名稱空間感知)和DOM2 +(名稱空間感知)調用。通過將所有內容都轉移到名稱空間感知的DOM2 +調用,問題就消失了。