2011-01-26 6 views
1

SSPI 및 LDAP API를 사용하여 Kerberos와 상호 인증을 구현하는 방법에 대해 질문하고 싶습니다.LDAP API 및 SSPI를 사용한 상호 인증 구현

ldap_sasl_bind_s(GSSAPI) - What should be provided in the credentials BERVAL structure에 설명 된 가이드 라인을 사용하고 있습니다. 여기

은 내가 사용하고있는 알고리즘 :


//-------------------------------------------------------------------------------------------- 
// client side 

AcquireCredentialsHandle(NULL, "Kerberos", SECPKG_CRED_BOTH, NULL, &secIdent, NULL, NULL, &kClientCredential, &kClientTimeOut); 
// AcquireCredentialsHandle returns SEC_E_OK 

// begin validation 

unsigned long ulClientFlags = ISC_REQ_CONNECTION | ISC_REQ_MUTUAL_AUTH | ISC_REQ_DELEGATE; 

int iCliStatus = InitializeSecurityContext(&kClientCredential, isContextNull(kClientContext) ? NULL : &kClientContext, 
          pacTargetName, ulClientFlags, 0, SECURITY_NATIVE_DREP, pkServerToken, 
          0, &kClientContext, &kClientToken, &ulContextAttr, NULL); 

// InitializeSecurityContext returns SEC_I_CONTINUE_NEEDED 

//-------------------------------------------------------------------------------------------- 
// server side 

// ldap_init returns ok 

ldap_set_option(ld, LDAP_OPT_SIGN, LDAP_OPT_OFF); 
ldap_set_option(ld, LDAP_OPT_ENCRYPT, LDAP_OPT_OFF); 

unsigned long ulVersion = LDAP_VERSION3; 
ldap_set_option(ld, LDAP_OPT_VERSION, &ulVersion); 

// ldap_connect returns LDAP_SUCCESS 

// build the credentials based on what InitializeSecurityContext returned 
BERVAL creds; 
creds.bv_len = kClientToken.pBuffers[0].cbBuffer; 
creds.bv_val = reinterpret_cast(kClientToken.pBuffers[0].pvBuffer); 

BERVAL* pServerCreds = NULL; 
int iError = ldap_sasl_bind_s(ld, "", "GSSAPI", &creds, NULL, NULL, &pServerCreds); 

// ldap_sasl_bind_s returns LDAP_SUCCESS 

unsigned long ulError = 0; 
ldap_get_option(ld, LDAP_OPT_ERROR_NUMBER, &ulError); 

// ulError is equal to LDAP_SASL_BIND_IN_PROGRESS 

그리고 여기에 문제가 : 모두 LDAP 오류 코드가 확인하지만, 빈 BERVAL 구조 pServerCreds 포인트 (NULL 아니지만, 0 bv_len 동일) , 그리고 다음 InitializeSecurityContext 호출에 전달해야하는 서버 자격 증명을 포함해야합니다. 이 데이터를 사용하여 다음 호출에 대한 SecBufferDesc 구조체를 작성하면 SEC_E_INVALID_TOKEN을 반환합니다.

ldap_sasl_bind_s는 (는) 빈 BERVAL을 반환해야합니까? 아니면 내가 잘못하고 있습니까?

전체 SSPI 호출 (서버의 AcceptSecurityContext)을 사용하여 인증을 테스트했으며 예상대로 작동합니다. 문제는 서버가 크로스 플랫폼이어야하므로 SSPI를 사용할 수 없다는 것입니다.

시간을내어 답변 해 주셔서 감사합니다. 후안

답변

0

문제점을 발견했습니다.

this thread에 따르면 Windows XP에서 빈 서버 자격 증명을 반환하는 ldap_sasl_bind_s 버그가 있습니다. Windows 2008 Server에서 응용 프로그램을 테스트했으며 자격 증명이 제대로 반환되었습니다.