2014-04-30 10 views
0

자바 웹 서비스 클라이언트를 구현하려고합니다. 비누 메시지가 서명되었습니다 (내부 분리 서명).Java xmldsig DigestValue (jsr105Provider apche, oracl)

올바른 서명으로 유효성을 검사하는 유효한 메시지의 예가 있습니다.

코드를 시도 할 때 메시지가 올바르게 서명되지 않았습니다. 문제를 추적하려고 할 때, 나는 그 문제 (또는 나의 실수)가에있는 참조 중 하나에 대한 세대와 관련이 있다는 것을 깨달았다.

<ds:Reference URI="#Id-4889213"> 
<ds:Transforms> 
    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
    <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList=""/> 
    </ds:Transform> 
</ds:Transforms> 
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
<ds:DigestValue>VYRVoWOIiZx/7QMavLyDmAZ3Mb0=</ds:DigestValue> 

참고 문헌이 URI는 메시지 본문입니다 : 제대로 작동 예, 나는의 DigestValue가 생성되는 방법을 '확인'할 수에서

<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-4889213"> 
<web:consultarEstados xmlns:web="https://webservice.face.gob.es"/> 

나는이 매뉴얼을 'canononicalize'하고 시도하고 apli sha1, 내가 얻을 결과는 exactl입니다 y는 DigestValue입니다.

손 정규화 soapenv : 바디 :

<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-4889213"><web:consultarEstados xmlns:web="https://webservice.face.gob.es"></web:consultarEstados></soapenv:Body> 

명령 SH1 값을 생성 : (. 캔 몸 bodyib.txt previos 문자열에 저장)

cat bodyib.txt|openssl dgst -binary -sha1 | openssl enc -base64 

출력 :

VYRVoWOIiZx/7QMavLyDmAZ3Mb0= (Yes, the value in DigestValue !!) 

메시지에 서명 할 때 참조 번호는 다음과 같습니다.

<ds:Reference URI="#Id-4889213"> 
<ds:Transforms> 
    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"> 
    <InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList=""/> 
    </ds:Transform> 
    </ds:Transforms> 
    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> 
    <ds:DigestValue>sA5MIQPm4b2YhMRTPHg9CY8J1FI=</ds:DigestValue> 
</ds:Reference> 

필자는 예와 똑같은 비누 메시지를 얻기 위해 모든 네임 스페이스와 ID를 모방합니다. 본문 : 그래서 나는 foolowing의 soapenv 얻을 나는 손으로이 정규화 경우

<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-4889213"> 

을, 나는 이전에 정확히 동일한 문자열을 얻을 수 있지만, 참조에 표시된의 DigestValue는 동일하지 않습니다.

나는 두 개의 서로 다른 jsr105 제공 업체와이 시도했다 :

오라클 : "org.jcp.xml.dsig.internal.dom.XMLDSigRI" 쉐르의 산 투아 리오를 (1.5.6) : "org.apache.jcp .xml.dsig.internal.dom.XMLDSigRI "

결과는 동일한 다이제스트 (내가 가진 예제에 따라 예상 한 것과 다릅니다)입니다. 나는이 소화가 어디에서 오는지는 모른다. 이것을 손으로 계산하려고하면 결과가 예제에있는 것입니다.

두 가지 다른 라이브러리를 사용하기 때문에 동일한 값을 얻지 못하기 때문에이 모든 것에 대한 개념이 생기지 않을 것이라고 생각합니다. 문제는이 라이브러리의 코드입니다.

답변

1

나는 서명이 될 데이터의 차이점을 발견했습니다. 문제는 http://www.w3.org/2001/10/xml-exc-c14n# 변환 알고리즘과 관련됩니다.

내 예제에서 기호되고있는 contente :

<web:consultarEstados></web:consultarEstados> 

네임 스페이스 정보를 가지고 있지 않는 이유

<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-4889213"><web:consultarEstados></web:consultarEstados></soapenv:Body> 

내가 모르는 내가 하나가 올바른지 마녀을 모르는 .

이것은 org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI 구현의 버그 일 수 있습니다. http://www.w3.org/2001/10/xml-exc-c14n#은 요소가 비어있을 수 있습니다.

나는 찾으려고 노력할 것이다.

마지막으로 발견 된 문제 : 서명하기 전에 일부 네임 스페이스 변경을 수행하고 있습니다. 예제가 있습니다. 추가해야합니다 : soapEnvelope.getOwnerDocument(). normalizeDocument();

정상적으로 작동하려면. 이것이 없으면 정규화가 제대로 작동하지 않습니다.