2012-06-18 3 views
4

SAML SPI로 작동하는 서버에 대한 SAML 응답을 통해 로그인을 시도하는 PHP 응용 프로그램 (SAML IdP로 작동)을 작성 중입니다. 현재 요청을 거부하는 서버가 있습니다. (단지 500 개의 잘못된 요청이 있습니다.)DER ASN.1에서 XMLDSIG P1363으로 PHP DSA 서명 변환

테스트 앱 (Java/openSAML - 서버에서 사용하고 있음을 확신합니다)을 작성하여 볼 수 있습니다. 문제는 SAML SignatureValidator 유효성이

org.apache.xml.security.signature.XMLSignatureException 생성하는 것을 : DSA 서명의 유효 XMLDSIG 형식을

,

SAML SignatureValidator code에서 XMLDISG 서명이 정확히 40 바이트 길이 (P1363 형식)인지 확인 할 수 있습니다. 생성 된 서명은 46-48 바이트 길이입니다 (DER ASN.1 형식?).

다음과 같이 서명이 PHP openssl_sign에 의해 생성됩니다.

openssl_sign($canonicalized_signedinfo, 
        $signature, 
        $private_key, 
        OPENSSL_ALGO_DSS1)) 

예제 서명 (명확성을 위해 16 진수로 2 진수로 표시)은 다음과 같습니다. 이것은 46 바이트이지만 46 바이트에서 48 바이트까지 (임의의 키에 따라 다름) 알 수 있습니다.

302c02146e74afeddb0fafa646757d73b43bca688a12ffc5021473dc0ca572352c922b80abd0662965e7b866416d

나는 성공적으로 다음과 같이 openssl_verify PHP를 사용하여이 서명을 확인할 수 있습니다.

openssl_verify ($canonicalized_signedinfo, 
       $signature , 
       $public_key, 
       OPENSSL_ALGO_DSS1)) 

하지만 (아래)를 SignatureValidator의 유효성 검사를 수행 할 때 내 테스트 응용 프로그램에

은 내가 XMLSignatureException: Invalid XMLDSIG format of DSA signature 예외를 얻을.

BasicCredential credential = new BasicCredential(); 
    credential.setPublicKey(publicKey); 
    credential.setUsageType(UsageType.SIGNING); 
    SignatureValidator sigValidator = new SignatureValidator(credential); 
    sigValidator.validate(signature); 

사람이 openSAML에 의해 예상되는 40 바이트 P1363 형식으로 PHP의 openssl_sign에 의해 생성 된 46-48 DER의 ASN.1 형식에서 PHP 서명 변환을 수행하는 방법을 알고 있나요?

답변

4

resource from code project은 ASN.1 형식을 코드 예제와 함께 P1363으로 변환하는 방법에 대한 설명이 있습니다. Java 유효성 검증 메소드를 작성하는 것이 유용 할 수 있습니다. 단순히 서명을 생성하고 검증 것보다 더 복잡한 소리, 그런데 http://xmlsig.sourceforge.net/

:

는 그리고 난 당신이 PHP에서 DSIG 준수 서명을 생성하기 위해 C++ 코드를 사용하여 제안한다. 당신은에 관심이있을 수 있습니다 XMLBlackbox