문제

UsernameToken을 사용하여 파트너 WS를 호출하려고합니다. 나는 PHP5.2.x 및 IT 록 아래의 WS02 WSF_2.0.0에 대해 사용합니다. 이제 우리는 PHP5.3을 기반으로하는 다른 솔루션을 마이그레이션하고 있습니다. 다행히 WS02는 PHP5.3과 호환되는 2.1.0 태그를 제공합니다. 나는이 새로운 릴리스의 새로운 기능과 문서를 읽을 시간을 가지며 특히 UsernameToken에 관한 것입니다. Cert와 Private 키를 통해 UsernameToken에 관한이 릴리스 사용을 이해했습니다. 나는 AsymetrictransportBinding 정책의 B / C를 추측합니다. 내 경우에 나는 인증서를 통해 아무것도 서명하고 싶지 않았습니다. WS02는 서명을 피하기 위해 별도의 XML 파일에서 종류의 대체를 제공한다는 것을 읽었습니다.

많은 게시물을 읽은 후, 포럼에서 공동체 B / C에서 도움이 필요합니다. B / C는 완전히 갇혀 있습니다.

HTTP를 사용하여 PHP5.3 - WSF 2.1.0 (HTTP 사용)에서 WS를 요청하는 데 사용되는 코드가 있습니다.

$policy   = new \WSPolicy( $policy ); ( $policy is the one from the call_back folder with a file_get_contents() )

$security = new \WSSecurityToken( array(
  'user'                    => 'my_username',
  'password'                => 'my_password',
  'passwordType'            => 'Digest',
  'ttl'                     => '300'
));

$this->oSoapClient = new \WSClient( array(
  wsdl:          http://www.xxx.xx/comparatorservices/CalculationService?WSDL
  to:            http://www.xxx.xx/comparatorservices/CalculationService
  useWSA:        true
  useSOAP:       1.1,
  policy:        $policy,
  securityToken: $security
));

$proxy = $this->oSoapClient->getProxy();
$response = $proxy->wykonajKalkulacje( $MySuperRequestObject );
.

이 단계 :

  1. 디버그 추적 (로그 레벨 4)
  2. 를 활성화했습니다.
  3. I "to"가 WSDL 정의에 HTTP를 사용하는 것을 확인합니다

    wsdl : 포트 이름="calculationserviceHttpport"바인딩="TNS : 계산 서비스 됨" wsdlsoap : 주소 위치="http : //www.xxxx.xx/comparatorservices/calculeservice" / wsdl : 포트

  4. 이제 디버그 로그 에서이 값을 잡습니다.

    [Wed Jul 25 05:22:53 2012] [error] rampart_in_handler.c(91) [rampart]SOAP header cannot be found.
    [Wed Jul 25 05:22:53 2012] [error] phase.c(224) Handler RampartInHandler invoke failed within phase Security
    [Wed Jul 25 05:22:53 2012] [error] engine.c(657) Invoking phase Security failed
    [Wed Jul 25 05:22:53 2012] [error] engine.c(262) Invoking operation specific phases failed for operation __OPERATION_OUT_IN__
    [Wed Jul 25 05:22:53 2012] [error] /home/agruet/08_KRK_sources/wso2-wsf-php-src-2.1.0/src/wsf_wsdl.c(1226)      [wsf_wsdl] Response envelope not found
    
    .

    첫 번째 아이디어는 트래픽과 특히 WSF_2.0.0 / pHP5.2.x와 묶음 (WSF_2.1.0 / pHP5.3)

    사이의 트래픽 및 특히 비누 머리글을 냄새 맡는 것이 었습니다.

    여기에 2.0.0 (작동)

        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
      <soapenv:Header>
        <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    
            <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
                <wsse:Username>my_username</wsse:Username>
    
                <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">
                  hashed(my_password)
                </wsse:Password>
    
                <wsse:Nonce>hashed</wsse:Nonce>
                <wsu:Created>2012-07-26T20:40:26.991Z</wsu:Created>
    
            </wsse:UsernameToken>
        </wsse:Security>
    </soapenv:Header>
    
    .

    및 2.1.0 (작동 / 파괴되지 않음)

             <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
           <soapenv:Header>
             <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
    
            <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    
                <wsse:Username>my_username</wsse:Username>
                <wsse:Password
                    Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">hashed(my_password)</wsse:Password>
                <wsse:Nonce>hashed</wsse:Nonce>
                <wsu:Created>2012-07-25T00:44:56.758Z</wsu:Created>
            </wsse:UsernameToken>
        </wsse:Security>
    </soapenv:Header>
    
    .

    WSSE : 보안 네임 스페이스에서 유일한 차이점을 볼 수 있습니다. (XMLN 누락 : SOAPENV="http://schemas.xmlsoap.org/soap/envelope/)

    그리고 그게 다야 ...

    디버그 로그에 따라 91 줄에서 RAMPART_IN_HANDLER.C를 검사합니다.

    soap_header = axiom_soap_envelope_get_header(soap_envelope, env);
        if(!soap_header)
        {
            /*No SOAP header, so no point of proceeding. FAIL*/
            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, "[rampart]SOAP header cannot be found.");
            return AXIS2_FAILURE;
        }
    
    .

    의미는 .... soap_header는 거짓입니다 ..하지만 왜? 무엇이 잘못되었는지 설명하기 위해 스마트 한 사람이 있습니까?

    nota 1 : 나는 asymetricbinding이 사용되는 것처럼 보이는 정책을 파트너 (2.0.0)로 보낸 정책을 검사 ... 2.0.0의 모든 인증서 또는 열쇠를 제공하지 않았다.

    nota 2 : Classic Wspolicy Object Array Params가있는 서명 된 사용자 이름 토큰을 사용하려고했습니다. X509 Cert 및 PreventKey를 생성 한 다음이 파일을로드하고 배열 매개 변수를 사용하여 WSSecurity 생성자에로드하십시오 ... 그러나 나는 동일한 오류 / 스니핑은 고통이 있습니다. B / C 데이터는 암호화되었거나 그와 비슷한 것입니다 (이는 이런 식으로 정상적인 것 같습니다)

    not 3 : 현재 apt-get

    에서 미리 컴파일 된 PHP 패키지가있는 Ubuntu10.04-3LT에서 현재 테스트되었습니다.

    plz 도움말!

도움이 되었습니까?

해결책

나는 마침내 그 문제를 발견했고, 나는 Rampart_in_handler.c : 91

을 수정했다.

이 문제는 응답에서 오지 않았으며 요청이 아닌 ... TCP 스니퍼를 통해 검사하고 파트너 WS의 응답은 SOAP : 헤더없이 만들어졌습니다.

표준이 아닌 경우 마지막 릴리스 (2.0.0)가 작동 중임. 그래서 SOAP 헤더가없는 경우에 성공을 반환하려면 RAMPART_IN_HANDLER.C 파일의 코드를 조금 조정하기로 결정했습니다.

내 의견과 PLZ가 잘못 되었다면 나를 바로 잡습니다 :

SoApheReader 응답에 대한 테스트는 Asymetricbinding 전송의 B / C를 확실히 첨가하고 새로운 서명 된 UsernameToken 케이스를 추가했습니다. 그러나 SOAP () 에 서명하지 않고 UsernameToken을 사용하지 않고 사용하려는 경우 SOAP : 헤더없이 응답이 이루어집니다. 그런 다음 Rampart는 항상 실패를 반환합니다 ...

또한 WSF가 응답을 처리하는 방식에 관한 스크립트 / 폴더 아래에서 PHP 코드를 분석 하고이 파일에서 보았습니다. wsf_wsdl.php 함수 아래의 wsf_process_response() :

if($response_header_string && !empty($response_header_string)) {
    $header_dom = new DomDocument();
    $header_dom->preserveWhiteSpace = FALSE;
    $header_dom->loadXML($response_header_string);
}
.

PHP 측에서 데이터가 수신되면 WSF / PHP는 SOAPHEADER없이 케이스를 가정합니다 ... (SOAPHEADER가 누락 된 경우 실패가 없음) 슈퍼 이상한!?

마침내 wsf_wsdl_serialization.phpwsf_wsdl_deserialization.php 파일 모두에서 이상한 버그를 찾았습니다.

라는 문자열로 params / 값을 보내고 / 또는받을 계획이있는 경우 다음과 같이하십시오.

                            "110% Sigma of something" 
.

Serialize / Suserialize 프로세스 중에는 SegFault를 생성합니다!

이제 나 스스로 왜 궁금해? 그러나 첫 번째 시야에서 "110 % sig .."는 "% s"가 포함되어 있고 "% s"가 꽤 닫혀 있습니다 ...

나는이 버그가 여기에 언급 된 것이 있다고 생각합니다 :

http : // old. nabble.com/wsf-php-server-segfault-on-wsf_wsdl_serialization.php---td24329956.html

S를 D 또는 다른 것으로 변경하면 작동합니다 ...

통증이 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top