我一直在c/c ++应用程序中使用GSSAPI.显然我不得不谷歌和研究很多.我发现的最有趣的文档之一是在Sun的旧网站上.在Oracle接管Sun之后,旧的网站已经消失,但不知何故,这些信息仍然存在. http://docs.oracle.com/cd/E19253-01/816-4863/index.html 令人震惊的是,我在Oracle的文档中找不到上述URL的任何链接.内容还包括几个PDF文件,我幸运地保存在我的笔记本电脑上.
上面的URL也提供了使用SASL和c/c ++的出色指南.
内容引用了一些包含示例源代码的tar文件.根据当前网站内容,该文件应该可以在以下网址获得:http: //www.sun.com/download/products.xml?id = 41912db5 但遗憾的是我现在无法在网站上找到它们.
内容是ac/c ++程序员在GSSAPI/Kerberos/PAM/SASL上重新开始的一个很好的起点
看看Oracle现在的网站,我坚信内容目前"意外"落后,很快就会消失.
现在,这是我访问stackoverflow的奇妙黑客的问题:
我认为这些内容真的非常宝贵,而且我无法想到任何其他网络资源,以获得有关使用GSSAPI和C/C++的非常明确的信息.如果您可以对此做些什么,请立即执行,因为我认为上述网址很快就会消失.
我真诚地感谢你们,我向你们许多人也会感谢你们.
编辑:在Oracle网站上有点狩猎,我发现了其中一个PDF的链接,但是给了一个新名称: Oracle Solaris Security for Developers 如果你开始使用GSSAPI/SASL,那么肯定是一个参考的宝石C++
在过去的几年里,我不得不"偶尔"与Heimdal/MIT Gssapi合作进行kerberos认证.我必须构建一个应用程序,用作在Linux机器上运行的Web服务,并提供运行在Windows和/或Linux桌面和工作站上的浏览器等客户端应用程序.当然不是最容易驯服的野兽.最后,在总结我的工作时,我可以记录由于多方面的挑战而产生的困难.开始使用gssapi编程确实是一个挑战,因为文档很差,并且实际上是不存在的教程.谷歌搜索通常会导致对什么是kerberos进行一些理论上的讨论,或者导致内容写成假设你已经知道除了某些特定的语义问题之外的所有内容.这里有一些非常好的黑客对我有所帮助,因此我认为从开发人员的角度总结这些东西是个好主意,并在这里分享它作为某种维基,给回到这个梦幻般的地方,和其他程序员.
以前没有真正做过像这样的维基,而且我肯定对GSSAPI和Kerberos没有权限,所以请善待,但更重要的是请贡献并纠正我的错误.网站编辑,我指望你做你的魔术;)
成功完成项目需要正确完成3项具体任务:
正如我已经说过的那样,这些项目都是野兽,因为这三个项目都没有放在同一个页面的任何地方.
好的,让我们从头开始吧.
新手 GSSAPI的不可避免的理论帮助客户端应用程序为服务器提供凭据以权威地识别用户.非常有用,因为服务器应用程序可以根据用户调整其服务响应.因此非常自然地 - 客户端和服务器应用程序必须是kerberized,或者有些人会说kerberos知道.
基于kerberos的身份验证要求客户端和服务器应用程序都是Kerberos领域的成员.KDC(Kerberos域控制器)是指定领域的指定权限.Microsoft的AD服务器是KDC中最受欢迎的示例之一,但您当然可以使用基于*NIX的KDC.但肯定没有KDC,根本就没有Kerberos业务.只要所有桌面,服务器和工作站都加入域中,它们就会相互识别.
对于您的初始实验,请在同一领域中设置客户端和服务器应用程序.虽然Kerberos身份验证肯定也可以通过在这些领域的KDC之间创建信任,甚至合并来自不相互信任的不同KDC的密钥记录来跨领域使用.您的代码实际上不需要任何更改来适应这种不同且复杂的场景.
Kerberos身份验证基本上通过"票证(或令牌)"工作.当一个成员加入这个领域时,KDC会向每个成员"授予令牌".这些代币是独一无二的; 时间和FQDN是这些门票的必要因素.
在你想到代码的第一行之前,请确保你有这两个权利:
陷阱#1在设置开发和测试环境时,请确保所有内容都经过测试并以FQDN进行寻址.例如,如果要检查连接,请使用FQDN而不是IP进行ping.因此,不用说,它们必须具有相同的DNS服务配置.
陷阱#2确保所有运行KDC,客户端软件,服务器软件的主机系统都具有相同的时间服务器.时间同步是一种忘记的东西,并且在经过大量的分裂和头撞之后意识到自己很不舒服!
两者,客户端和服务器应用程序都需要kerberos keytabs.因此,如果您的应用程序将在*NIX主机中运行,并且是Microsoft域的一部分,那么在我们开始查看gss编程的剩余准备步骤之前,您必须生成kerberos keytab.
Kerberos 5循序渐进指南(krb5 1.0)互操作性绝对必读.
GSS-API编程指南是一个很好的书签.
根据您的*NIX发行版,您可以安装用于构建代码的标头和库.我的建议是下载源代码并自行构建.是的,你可能不会一气呵成,但它肯定是值得的.
陷阱#3确保您的应用程序在Kerberos感知环境中运行.我真的很努力地学到了这一点,但也许是因为我不那么聪明.在我最初的gssapi编程斗争阶段,我发现kerberos keytabs对于让我的应用程序感知kerberos是绝对必要的.但我根本找不到任何关于如何在我的应用程序中加载这些keytabs.你知道为什么?!!因为没有这样的api !!! 因为:应用程序将在知道keytabs的环境中运行.好吧,让我这么简单:在将环境变量设置KRB5_KTNAME为存储keytabs的路径之后,应该运行应该执行GSSAPI/Kerberos事务的应用程序.所以要么你做的事情如下:
export KRB5_KTNAME=<path/to/your/keytab>
Run Code Online (Sandbox Code Playgroud)
或者在运行使用gssapi的第一行代码之前充分setenv设置KRB5_KTNAME应用程序.
我们现在准备在应用程序的代码中执行必要的操作.
据我所知,应用程序开发人员必须审查其他许多方面,以编写和测试应用程序.我知道一些环境变量,这很重要.
任何人都可以对此有所了解吗?
在我的应用程序中,我有设置信号处理程序来捕获Segfaults,并打印bactraces.进程启动时,我的应用程序会加载一些插件库.
如果我的应用程序崩溃了一个段错误,由于主可执行二进制文件中的错误,我可以用以下内容分析回溯:
addr2line -Cif -e ./myapplication 0x4...
Run Code Online (Sandbox Code Playgroud)
它准确地显示了函数和source_file:line_no
但是,如何分析是否由于插件中的错误而发生崩溃,如下面的回溯?
/opt/myapplication(_Z7sigsegvv+0x15)[0x504245]
/lib64/libpthread.so.0[0x3f1c40f500]
/opt/myapplication/modules/myplugin.so(_ZN11ICAPSection7processEP12CONNECTION_TP7Filebufi+0x6af)[0x7f5588fe4bbf]
/opt/myapplication/modules/myplugin.so(_Z11myplugin_reqmodP12CONNECTION_TP7Filebuf+0x68)[0x7f5588fe51e8]
/opt/myapplication(_ZN10Processors7ExecuteEiP12CONNECTION_TP7Filebuf+0x5b)[0x4e584b]
/opt/myapplication(_Z15process_requestP12CONNECTION_TP7Filebuf+0x462)[0x4efa92]
/opt/myapplication(_Z14handle_requestP12CONNECTION_T+0x1c6d)[0x4d4ded]
/opt/myapplication(_Z13process_entryP12CONNECTION_T+0x240)[0x4d79c0]
/lib64/libpthread.so.0[0x3f1c407851]
/lib64/libc.so.6(clone+0x6d)[0x3f1bce890d]
Run Code Online (Sandbox Code Playgroud)
我的应用程序和插件库都使用gcc编译并且未被删除.我的应用程序在执行时,使用dlopen加载plugin.so不幸的是,崩溃发生在我无法在gdb下运行应用程序的站点上.
谷歌疯狂地搜索答案,但所有讨论回溯和addr2line的网站排除了可能需要分析错误插件的情况.我希望一些善良的黑客知道这个困境的解决方案,并且可以分享一些见解.对于其他程序员来说,这将是非常宝贵的.
提前谢谢.
到目前为止,我的谷歌搜索和检查出 msdn 表明 Microsoft Windows 没有提供任何等效的 TIOCOUTQ / SIOCOUTQ 来查找套接字发送缓冲区中未发送的数据量。如果一些好的 hack 发现了其他东西,并且可以在这里发布,那将非常有用。它将允许我的以下代码成为跨平台
int net_get_unsent (const int sockfd, unsigned long &sock_bytes_unsent )
{
/* Queries how much data sent on sockfd,
* may not have yet been recieved by the reciever
*
* returns more than 1 if there's unsent data,
* and fills in the amount of unsent data in sock_bytes_unsent
*
* returns 0 if all the data has been sent
*
* returns < 0 if there was …Run Code Online (Sandbox Code Playgroud) 我用C++编写的基于Windows的应用程序(基本上是HTTP/1.1代理服务器)监听来自不同用户的请求.目前它能够发送407基本挑战,并处理来自标题的响应.我知道我必须修改挑战标题,以便客户端浏览器为验证目的而制作基于NTLM的响应.但我的问题是 - 如何为407认证挑战生成正确的令牌,随机数等,然后如何验证收到的响应是否正确?最后,我想尽可能记录客户端的用户名和其他LDAP/ADS属性.
请善待,如果已经有任何线程讨论类似的话,请将我重定向到正确的帖子.大多数关于WWW的研究只引导我进行客户端编程,非常少或几乎没有 - 对于必须在HTTP服务器中进行的编码.
你们所有人都非常喜欢这里,提前感谢你们.