ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Notes/Domino 7.0 中的安全 API

Notes/Domino 7.0 中的安全 API

原创 Linux操作系统 作者:genusBIT 时间:2009-04-27 15:22:07 0 删除 编辑

本文讨论了与新的 Notes/Domino 7 Notes 加密/解密 API 相关的许多不同特性。描述了业务伙伴和其他 Notes 开发人员是如何使得他们的程序能够读取和创建 Notes 加密消息和 S/MIME 加密消息的。 在很多情况下,业务伙伴和 Notes 开发人员都希望其应用程序中具有查看和/或创建加密消息的能力。本文还介绍了实现这些和其他 Notes/Domino 7 安全特性所需的关键技术和管理细节。

由于存在 Notes 应用程序需要访问加密文档的很多不同场景,所以我希望通过这篇介绍性文章能帮助大家了解这些新 API 的工作机制。您可以调整本文中给出的实现过程,以适应自己的应用程序架构。

本文针对那些有经验的 Notes/Domino 应用程序开发人员,以及对 Notes/Domino 的安全机制有深入了解的人。另外,Domino 安全证书模型的相关知识对于阅读这篇文章也是很有帮助的。要想了解关于 Notes/Domino 7 的安全性以及其他所有特性的信息,可以查看 developerWorks: Lotus 文章“Lotus Domino 7.0 Beta 4 中的新特性”和“Lotus Notes and Domino Designer 7.0 Beta 4 中的新特性”。

Notes/Domino 7 安全 API 概述

新的安全 API 方法是 Notes/Domino 7 运行时 C 库的一部分。那些能够调用 NRPC 的应用程序可以访问 Notes/Domino 7 运行时库中的 API。

在 Notes/Domino 7 中引入新 API 之前(Notes/Domino 6.5x 中引入了它的一个子集),Notes 应用程序通过调用 NSFNoteCopyAndEncrypt 和 NSFNoteDecrypt 这两个 API 来分别执行读取/创建 Notes 加密消息和 S/MIME 加密消息。但这种方法不能够完全满足 Notes 应用程序的要求,其原因有多个方面。首先,因为应用程序必须通过调用 SECKFMSwitchToIDFile 将上下文切换到执行加密/解密的用户。在用户间进行多次上下文切换(例如,从 admin 用户切换到另一个用户,然后又切换回来)会带来性能隐患。其次,调用 SECKFMSwitchToIDFile 需要用户的 ID 文件是最新的。这就意味着 Notes 应用程序必须跟踪用户的 ID 文件并检测 ID 文件的任何更改(如名称的更改和公钥的更改)。新的 API 能够帮您检测这些更改,同时简化 ID 文件的管理。虽然使用新的安全 API 不是必需的,但使用的话可以帮助您克服上述局限性。

此外,以前的 PKCS12_ExportIDFileToFile 和 PKCS12_ImportFileToIDFile 这两个 API 可以实现在 ID 文件中导入和导出 Internet 证书及密钥。正因为 ID 文件中具有 Internet 证书和私钥,所以可以阅读 S/MIME 加密邮件以及发送 S/MIME 加密邮件。尽管该方法允许您读取 S/MIME 加密消息(如果您有一个适当的密码引擎的话),但是这种方法并不是方便的解决方案,只能用于解码 S/MIME,而对 Notes 加密消息无效。但是新的 API 使得读取/创建 Notes 加密消息和 S/MIME 加密消息都非常简单。

新的 Notes/Domino API

在 Lotus C API Notes/Domino 7.0 Reference and User Guide 中有这些 API 的更加详细、准确的介绍。本节只给出本文中将会讨论的 API 的简要说明。

SECKFMOpen

如果给它传递正确的 ID 文件名和密码,那么该函数会提供一个到 ID 文件中凭证的句柄。该凭证句柄可以传递给这里列出的其他函数,所以就不再需要通过 SECKFMSwitchToIDFile 来切换用户上下文了。没有正确的凭证就不能进行加密/解密。

SECKFMClose

该函数用于关闭 SECKFMOpen 所打开的句柄。

SECAttachIdFileToDB

该函数以 ID 文件为参数,并安全地将其附加到数据库(例如用户的邮件文件)。这就可以更加方便地对用户 ID 文件进行管理,从而不再需要 ID 文件中央知识库了。在附加到数据库的时候需要提供 ID 文件和密码。其中 ID 文件保存在数据库的 profile 备注中(具体的名称在调用函数的时候指定)。

SECExtractIdFileFromDB

这个函数是将 SECAttachIdFileToDB 函数所附加的 ID 文件取出来。取出 ID 文件是为了能够给 SECKFMOpen 函数传递正确的 ID 路径。

SECRefreshIdFile

这个函数用于检查目录中给定用户的 Notes 证书、Internet 证书和用户名是否发生了更改。您需要为这个方法传入三个参数,即 ID 文件、密码和用于检查更改的服务器。如果检测到出现了更改,就会对 ID 文件进行更新。通常情况下,如果检测到发生了更改,就应该使用 SECAttachIdFileToDB 来重新附加 ID 文件。所以在取出 ID 文件之后最好先调用一次 SECRefreshIdFile 以确保 ID 文件是最新的。

NSFNoteDecrpytExt2

这个函数是对 NSFNoteDecryptExt 的扩展。将 KFM 凭证的句柄传递给这个方法,就可以正确地将消息解密出来。

NSFNoteCopyAndEncryptExt2

这个函数则是对 NSFNoteCopyAndEncrypt 的扩展。将 KFM 凭证的句柄传递给这个方法,就可以正确地对消息进行加密。

使用新的安全 API

在进行加密/解密之前,首先必须保证具有安全文档凭证的 Notes ID 是可访问的,从而保证使用的凭证是正确的。如果您知道某个用户的 ID 文件和密码,就可使用 SECAttachIdFileToDB 函数将他的用户 ID 文件附加到他的邮件文件中。例如,您有一个 Notes 应用程序,它可以将每个用户的 ID 文件保存到名为 $MyId(其他的名称也可以,只要不重名)的 profile 文档中。一般来说,要在应用程序中实现提示和保存用户 ID 文件和密码的功能,有大量的接口可供选择使用。而具体采用什么接口取决于两个方面,一是您的应用程序以终端用户所接受的方式提供正确的接口,然后就是产品本身的体系架构。

以 Domino Web Access 为例,将 Notes ID 附加到名为 $shimmerid 的 profile 文档中。然后您可用 Notespeek 工具来验证 $shimmerid 文档的存在,这个工具可以显示出所有的 ID 列表(如图 1 所示):


图 1. Notespeek 的 ID 列表
Notespeek 的 ID 列表

对于允许用户附加 Notes ID 文件的用户接口,Domino Web Access 就是一个很好的例子。正如图 2 中 Security Preferences 附签中显示的,用户可以选择他们的 Notes ID 文件并输入密码:


图 2. Security Preferences 附签
Security Preferences 附签

您的应用程序也可以为用户提供这样类似的 GUI。一但用户输入了 ID 和密码后,Notes 应用程序就可以通过调用 SECAttachIdFileToDB 来将 ID 文件附加到邮件文件。当要对消息进行加密和解密时,Notes 应用程序必须能够访问这个 ID 文件和密码。Notes 应用程序也应该安全地处理用户数据(ID 文件和密码),因为这些用户数据是对安全性非常敏感的信息。

此外,这个方法允许应用程序的用户在必要的时候重新附加一个新的 ID 文件。例如,在用户请求新的公/私钥的时候,他们必须附上新的 ID 文件才能访问新的加密消息。

使用已附加的 ID 来阅读加密消息

首先,应用程序需要确定文档是否已加密。这个功能可以通过 Notes API 的 NSFNoteIsSignedOrSealed 方法来实现。如果确定文档已加密,那么应用程序就可以使用新的安全 API 对其解密。下面列出了处理方法的步骤:

  1. 通过使用 SECExtractIdFileFromDB 方法将用户的 ID 文件从邮件文件中取出来(这一步能够成功完成的前提是在用户的邮件文件中必须已经附加了 ID 文件。这部分内容在本节前面已经陈述过了)。要完成这一步还得知道用户 ID 文件的密码。
  2. 对取出来的 ID 文件用 SECRefreshIdFile 方法进行处理。这样就可以确保取出来的 ID 文件出现了 Notes 证书更改、Internet 证书更改和用户名更改的情况。
  3. 如果通过 SECRefreshIdFile 检测出发生了更改,那么就使用 SECAttachIdFileToDB 将 ID 文件重新附加到邮件文件中。
  4. 将取出来的 ID 文件和密码作为参数,使用 SECKFMOpen 方法来获取该 ID 文件的句柄。
  5. 在 NSFNoteDecrpytExt2 方法中使用前面取到的 ID 文件句柄,以访问加密消息。请确保解密后内容的安全,因为在通常情况下,加密消息中会包含一些敏感数据。
  6. 使用 SECKFMClose 方法关闭 ID 文件句柄。
  7. 关闭备注并从存储器上删除掉取出的 ID 文件。

使用已附加的 ID 来创建加密消息

在应用程序中使用新的安全 API 来实现对消息加密。其方法如下:

  1. 通过使用 SECExtractIdFileFromDB 方法将用户的 ID 文件从邮件文件中取出来(同样,完成这一步的前提是在用户的邮件文件中必须存在 ID 文件)。同时还需要知道用户 ID 文件的密码。
  2. 对取出来的 ID 文件用 SECRefreshIdFile 方法进行处理。这样可以确保取出来的 ID 文件出现了 Notes 证书更改、Internet 证书更改和用户名更改的情况。
  3. 如果通过 SECRefreshIdFile 检测出发生了更改,就使用 SECAttachIdFileToDB 将 ID 文件重新附加到邮件文件中。
  4. 以取出来的 ID 文件和密码作为参数,通过 SECKFMOpen 方法来获取该 ID 文件的句柄。
  5. 在 NSFNoteCopyAndEncryptExt2 方法中使用取到的 ID 文件句柄,用以对文档加密。
  6. 使用 SECKFMClose 方法关闭 ID 文件句柄。
  7. 关闭备注并从存储器上删除掉取出的 ID 文件。

    Notes ID 管理的其他概念

    通常情况下,您希望自己的应用程序能对来自各种不同用户的消息进行加密或解密。在这种情况下,如果对每个 ID 都单个地进行附加,那么这项工作会非常的繁琐。因而,Notes 应用程序可以利用一个批处理工具来一次附加多个 ID 文件,从而简化该过程。

    Notes 应用程序只要对所有为了进行加密/解密而需要附加到用户邮件文件的 ID 文件和密码具有访问权限,它就可以通过 SECAttachIdFileToDB 方法来附加所有的 ID 文件。您必须创建一个工具来循环执行 ID 文件的附加。该工具需要某种类型的安全知识库,其中包含了要读取的用户 ID 文件和密码。这些 ID 文件和密码要以安全、保密的方式保存。

    如何给予用户修改其 Notes ID 密码的能力

    出于安全方面的原因,您可能还需要为每个产品用户提供修改 Notes ID 密码的能力,应用程序在创建/读取加密消息时会用到这个密码。而什么时候会需要修改密码呢?举个例子,当密码外泄了,用户就需要修改他们的密码。此外,Notes 应用程序也需要创建一定的政策,以保证用户按照一定的规则基础来对应用程序中所需要的 Notes ID 密码进行修改。

    图 3 显示了 Domino Web Access 中的 Change Internet Password 对话框。用户可以在这个对话框中修改他们的 Notes ID 密码。您的应用程序可以使用这个对话框作为模型:


    图 3. Change Internet Password
    Change Internet Password

    您可能想要提供一个接口,用于收集用户的现有密码和新密码。该接口然后可以将数据传递给应用程序。实现方法如下:

    1. 通过使用 SECExtractIdFileFromDB 方法从邮件文件中取出用户 ID 文件。
    2. 对取出的 ID 文件用 SECRefreshIdFile 方法进行处理。这样就可以确保取出来的 ID 文件出现了 Notes 证书更改、Internet 证书更改和用户名更改的情况。
    3. 输入新密码,通过 SECKFMChangePassword 方法实现修改密码。
    4. 通过 SECAttachIdFileToDB 方法,将 ID 文件重新附加到邮件文件中。
    5. 关闭备注并从存储器上删除掉取出的 ID 文件。

      结束语

      本文介绍了 Notes/Domino 7 中引入的一些新的安全 API。还展示了如何使用这些 API,并给出了一些实际的应用程序示例。我希望这篇文章能够对您有所帮助。同时也欢迎大家向我们推荐其他关于 Notes/Domino 7 安全性的主题,我们将会在以后的文章中进行讨论。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14751907/viewspace-591933/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-07-04

  • 博文量
    233
  • 访问量
    436589