如何在c / c ++客户端服务器跨平台程序中使用gssapi kerberos?

过去几年,我不得不与海姆达尔/麻省理工学院的Gssapi一起“零星地”进行kerberosauthentication。 我必须构build一个应用程序,用作在Linux机器上运行的Web服务,并提供在Windows和/或Linux桌面和工作站上运行的浏览器等客户端应用程序。 当然不是最容易驯服的野兽。 最后,在总结我的工作时,我可以logging由于多方面的挑战而产生的困难。 开始使用gssapi编程确实是一个挑战,仅仅是因为文档很差,几乎没有任何教程。 谷歌search通常会导致一些关于什么是Kerberos的理论讨论,或导致内容写作推断,除了一些特定的语义问题,你已经知道了一切。 这里有一些非常好的黑客帮助我,所以我认为从开发人员的angular度来总结这些东西是一个好主意,并且在这里以某种wiki的forms分享这个东西,回馈给这个奇妙的地方,和程序员。

以前没有真正做过这样的wiki,我对GSSAPI和Kerberos没有任何权威,所以请善待,但更重要的是请贡献和纠正我的错误。 网站编辑,我指望你做你的魔术;)

让您的项目成功完成需要3个具体的事情才能正确完成:

  1. 设置你的testing环境
  2. 设置你的库
  3. 你的代码

正如我已经说过的,这样的项目是野兽,因为这三个都没有放在同一页的任何地方。

好吧,让我们从头开始。

新手 GSSAPI的不可避免的理论帮助客户端应用程序提供服务器的凭据来权威地识别用户。 非常有用,因为服务器应用程序可以根据用户调整他们的服务响应。 因此非常自然,因此两者 – 客户端和服务器应用程序必须被kerberized,或者像有些人会说kerberos意识到的。

基于Kerberos的身份validation要求客户端和服务器应用程序都是Kerberos Realm的成员。 KDC(Kerberos域控制器)是规范领域的指定权威。 微软的AD服务器是KDC最常见的例子之一,当然你也可以使用基于* NIX的KDC。 但肯定没有KDC,根本就没有Kerberos业务。 join域的桌面,服务器和工作站只要全部保持join域,就可以相互识别。

对于您的初始实验,请在同一领域设置客户端和服务器应用程序。 尽pipe通过在这些领域的KDC之间创build信任,或者甚至合并来自不相互信任的不同KDC的密钥表,Kerberos身份validation也可以跨领域使用。 你的代码并不需要任何改变来适应这种不同的和复杂的情况。

Kerberos身份validation基本上通过“票(或令牌)”工作。 当一个成员join领域时,KDC“授予令牌”给他们每个人。 这些令牌是独一无二的 时间和FQDN是这些票的重要因素。

在你甚至想到你的代码的第一行之前,确保你有这两个权利:

缺陷#1当您设置您的开发和testing环境时,请确保所有内容都经过testing并作为FQDN解决。 例如,如果您要检查连接性,请使用FQDN而不是IP进行ping。 不用说,因此,它们必须具有相同的DNS服务configuration。

缺陷#2确保所有运行KDC的主机系统,客户机软件,服务器软件具有相同的时间服务器。 时间同步是一个人忘记的事情,经过大量的分裂和意外之后,才意识到是不对的!

客户端和服务器应用程序都需要kerberos密钥表。 因此,如果您的应用程序要在* NIX主机中运行,并成为Microsoft域的一部分,则必须先生成一个Kerberos密钥表,然后再开始查看gss编程的其余准备步骤。

Kerberos 5的分步指南(krb5 1.0)互操作性是绝对必读的。

GSS-API编程指南是一个很好的书签。

根据您的* NIX发行版,您可以安装用于构build代码的标题和库。 然而,我的build议是下载源代码并自己构build。 是的,你可能无法一目了然,但肯定是值得的。

陷阱#3确保您的应用程序在Kerberos感知环境中运行。 我真的很难学,但也许是因为我不是很聪明。 在我最早的gssapi编程斗争阶段,我发现kerberos keytabs对于使我的应用程序感知Kerberos是绝对必要的。 但是我根本找不到如何在我的应用程序中加载这些keytabs的任何信息。 你知道为什么?!! 因为不存在这样的API! 因为:应用程序将在一个知道keytabs的环境中运行。 好吧,让我这么简单:在将环境variablesKRB5_KTNAME设置为存储KRB5_KTNAME的path之后,应该执行GSSAPI / Kerberos的应用程序。 所以你要么做一些事情

 export KRB5_KTNAME=<path/to/your/keytab> 

或者在使用gssapi的代码的第一行运行之前,充分利用setenv在应用程序中设置KRB5_KTNAME

我们现在准备在应用程序的代码中做必要的事情。

我知道,应用程序开发人员还必须审查其他几个方面,以编写和testing应用程序。 我知道一些环境variables,这可能很重要。

有谁可以请说一说吗?