Solaris 开发者安全性指南 6
GSSAPI 服务器示例:main() 函数
第6 章• GSS-API 服务器示例129
示例6–1 gss-server 示例:main() (续)
} else if (strcmp(*argv, "-once") == 0) {
once = 1;
} else if (strcmp(*argv, "-inetd") == 0) {
do_inetd = 1;
} else if (strcmp(*argv, "-logfile") == 0) {
argc--; argv++;
if (!argc) usage();
log = fopen(*argv, "a");
display_file = log;
if (!log) {
perror(*argv);
exit(1);
}
} else
break;
argc--; argv++;
}
if (argc != 1)
usage();
if ((*argv)[0] == ’-’)
usage();
GSSAPI 服务器示例:main() 函数
130 Solaris 开发者安全性指南• 2006 年11 月
示例6–1 gss-server 示例:main() (续)
service_name = *argv;
/* Acquire service credentials. */
if (server_acquire_creds(service_name, &server_creds) = 0) {
do {
/* Accept a TCP connection */
if ((s = accept(stmp, NULL, 0)) string", maj_stat, min_stat);
return -1;
}
fprintf(log, "Accepted connection using mechanism OID %.*s.\n",
(int) oid_name.length, (char *) oid_name.value);
(void) gss_release_buffer(&min_stat, &oid_name);
}
maj_stat = gss_display_name(&min_stat, client, client_name, &doid);
if (maj_stat != GSS_S_COMPLETE) {
display_status("displaying name", maj_stat, min_stat);
return -1;
}
maj_stat = gss_release_name(&min_stat, &client);
if (maj_stat != GSS_S_COMPLETE) {
从客户机接收数据
146 Solaris 开发者安全性指南• 2006 年11 月
示例6–4 server_establish_context() 函数(续)
display_status("releasing name", maj_stat, min_stat);
return -1;
}
return 0;
}
sign_server() 函数使用以下源代码,通过调用server_establish_context() 来接受上下
文。
/* Establish a context with the client */
if (server_establish_context(s, server_creds, &context,
&client_name, &ret_flags) 1 -支持验证、完整性和保密性。数字表示加密密钥长度。
保密性和完整性操作是通过安全机制执行的。libsasl 可以协调这些请求。
注– 在协商过程中,SASL客户机会选择具有最大SSF 的机制。但是,实际所选的SASL机制
可能随后会协商较小的SSF。
SASL 中的通信
应用程序通过libsasl API 与libsasl 进行通信。libsasl 可通过应用程序注册的回调方式请
求其他信息。应用程序不会直接调用插件,而只是通过libsasl 进行调用。一般情况下,插
件会调用libsasl 框架的插件,随后这些插件调用应用程序的回调。SASL 插件还可以直接
调用应用程序,不过应用程序不知道调用来自插件还是来自libsasl。
回调在以下几个方面非常有用。
libsasl 可以使用回调获取完成验证所需的信息。
libsasl 消费方应用程序可以使用回调更改插件和配置数据的搜索路径、验证文件以及
更改各种缺省行为。
服务器可以使用回调来更改授权策略、提供不同的口令验证方法以及获取口令更改信
息。
客户机和服务器可以使用回调来指定错误消息的语言。
应用程序可以注册两种回调:全局回调和会话回调。此外,libsasl 定义了大量用于为不同
种类的回调注册的回调标识符。如果未注册给定类型的回调,则libsasl 将执行缺省操作。
会话回调将覆盖全局回调。如果为给定ID 指定了会话回调,则不会为该会话调用全局回
调。某些回调必须是全局的,因为这些回调发生在会话之外。以下实例要求使用全局回调
:
确定要装入的插件的搜索路径
验证插件
配置数据的位置
记录错误消息
对libsasl 或其插件的其他全局配置
可以使用给定SASL 回调ID 的NULL回调函数来注册SASL 回调。NULL回调函数指示装配
客户机的目的是为了提供所需的数据。所有的SASL 回调ID 都以前缀SASL_CB_ 开头。
SASL 提供以下可供客户机或服务器使用的回调:
SASL_CB_GETOPT 获取SASL 选项。选项用于修改libsasl (3LIB) 和相关插件的行
为。可由客户机或服务器使用。
SASL_CB_LOG 设置libsasl 及其插件的日志记录函数。缺省行为是使用
syslog。
以上文章转自于 :
http://developers.sun.com.cn/
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/2710/showart_530366.html