2013-12-14 3 views
1

gss_export_name을 사용하여 이름을 내보내는 데 문제가 있습니다. 일단 이름을 내 보내면 인쇄 할 수 있어야하지만 빈 Literaly가 나타납니다. 내보내기 이름 : 내 보낸 이름 길이 : 여기에 47GSSAPI : gss_export_name이 공백을 반환합니다.

내가 검사를 포함하지 않기로 결정 명확성을 위해 내 코드

OM_uint32 major_status; 
gss_cred_usage_t usage; 
OM_uint32 lifetime; 
gss_name_t inquired_name; 
major_status = gss_inquire_cred(&minor_status, GSS_C_NO_CREDENTIAL, &inquired_name, 
          &lifetime, &usage, &oid_set); 
gss_buffer_desc exported_name_buffer; 
major_status = gss_export_name(&minor_status, inquired_name, &exported_name_buffer); 
printf("EXPORTED NAME: %s, EXPORTED NAME LENGTH: %d\n", 
     exported_name_buffer.value, exported_name_buffer.length); 

, 그러나 나는 또한 == GSS_S_COMPLETE 은 어떤 아이디어 감사합니다 major_status 항상 있는지 확인하는데주의를 기울여야

+0

나는 주위에 파고가'gss_export_name' 전에'gss_canonicalize_name'을 호출해야한다고 제안했습니다. 그러나 작업 코드에서이를 확인할 수 없었습니다. –

+0

활성 자격 증명과 반대로 문자열에서 이름을 가져온 경우에만 정규화가 필요하다는 인상하에있었습니다. 어느 쪽이든 다른 방법으로 시도해 보았습니다. 버퍼가 텍스트 값을 포함하지 않고 추가로 디코딩 될 필요가있을 수 있습니다. 약간 – pu239ppy

답변

0

불행히도 gss_export_name에 의한 버퍼 출력은 사람이 읽을 수없는 문자열이 아닌 ASN.1 데이터 구조입니다. 세 섹션 3.2의 RFC 2743. 해당 구조체의 헤더를 건너 뛰고 메커니즘에 따라 이름을 파싱해야합니다. GSS-API 개발자 중 일부는이를 권장합니다. 예를 들어 Openssh에 대한 gss-api 패치는 Kerberos 이름을 구문 분석하기 위해이 작업을 수행합니다. 이것은 이론적으로 올바른 접근 방식입니다. 그러나 실제로는 gss_display_name을 사용하고 해당 호출의 출력을 처리하면 실제로 다중 메커니즘 응용 프로그램에서 이상한 결과가 발생할 수 있지만 실제로는 더 이식 가능한 결과가 생성됩니다. GSS-API 커뮤니티에서이를 처리하는 방법에 대해 중요한 논쟁이있을 것입니다. 디버깅 및 로그 출력을 위해 gss_display_name을 사용해야한다는 데 모두 동의합니다. 질문은 액세스 제어 목록에서 검색하기위한 이름을 원하면 무엇을해야합니까? gss_export_name의 출력을 직접 사용하고 이진 비교를 수행 할 수 있다면 그렇게하십시오. 그러나 사람이 입력 한 내용과 비교해야 할 경우 gss_display_name의 출력을 사용하는 것이 더 좋지만 다른 사람들은 gss_export_name 출력을 구문 분석하는 것이 더 낫다고 주장합니다.

+0

gss_display_name에 더 많은 것을 원했던 것은 내가 필요한 것을 정확하게 수행했다. 고마워! – pu239ppy