下午好我想分享我在这个话题上的经验。
Rutoken是身份验证、信息安全和电子签名领域的硬件和软件解决方案。 本质上,这是一个闪存驱动器,可以存储用户用于登录系统的身份验证数据。
本例中使用Rutoken EDS 2.0。
要使用此 Rutoken,您需要
对于 Windows,仅安装一个驱动程序可确保安装所需的所有内容,以便操作系统可以看到您的 Rutoken 并可以使用它。
应用程序的客户端部分通过 rutoken 插件与 rutoken 进行交互。 这是一个单独安装在每个浏览器上的程序。 对于 Windows,您只需下载并安装插件,
就是这样,现在我们可以从应用程序的客户端与 Rutoken 进行交互。
本示例讨论使用挑战-响应方案在系统中实现用户授权算法的想法。
这个想法的本质如下:
- 客户端向服务器发送授权请求。
- 服务器通过发送随机字符串来响应来自客户端的请求。
- 客户端用随机 32 位填充该字符串。
- 客户端使用其证书对接收到的字符串进行签名。
- 客户端将收到的加密消息发送到服务器。
- 服务器通过接收原始未加密消息来验证签名。
- 服务器从收到的未加密消息中去除最后 32 位。
- 服务器将收到的结果与请求授权时发送的消息进行比较。
- 如果消息相同,则认为授权成功。
上面的算法中有一个证书这样的东西。 对于这个例子,您需要了解一些密码学理论。 在哈布雷上有
在本例中,我们将使用非对称加密算法。 要实现非对称算法,您必须拥有密钥对和证书。
密钥对由两部分组成:私钥和公钥。 私钥,顾名思义,必须是秘密的。 我们用它来解密信息。 公钥可以分发给任何人。 该密钥用于加密数据。 因此,任何用户都可以使用公钥加密数据,但只有私钥的所有者才能解密该信息。
证书是一种电子文档,其中包含有关拥有该证书的用户的信息以及公钥。 有了证书,用户可以对任何数据进行签名并将其发送到服务器,服务器可以验证签名并解密数据。
为了使用证书正确签署消息,您需要正确创建它。 为此,首先在 Rutoken 上创建密钥对,然后必须将证书链接到该密钥对的公钥。 证书必须具有位于 Rutoken 上的公钥,这一点很重要。 如果我们只是立即在应用程序的客户端创建密钥对和证书,那么服务器如何解密此加密消息呢? 毕竟,他对密钥对或证书一无所知。
如果您深入研究这个主题,您可以在互联网上找到有趣的信息。 我们显然信任某些认证机构。 这些证书颁发机构可以向用户颁发证书;他们将这些证书安装在其服务器上。 此后,当客户端访问该服务器时,他会看到这个证书,并且看到它是由证书颁发机构颁发的,这意味着该服务器是可以信任的。 互联网上还有大量有关如何正确设置所有内容的信息。
如果我们回到我们的问题,解决方案似乎是显而易见的。 您需要以某种方式创建自己的认证中心。 但在此之前,你需要弄清楚认证中心应该根据什么给用户颁发证书,因为他对此一无所知。 (例如,他的名字、姓氏等)有一种叫做证书请求的东西。 有关此标准的更多信息可以在例如维基百科上找到
我们将使用版本 1.7 - PKCS#10。
让我们描述一下Rutoken上生成证书的算法(原始来源:
- 我们在客户端创建密钥对并将其保存在 Rutoken 上。 (自动保存)
- 我们在客户端上创建一个证书请求。
- 我们从客户端将此请求发送到服务器。
- 当我们在服务器上收到证书请求时,我们会从证书颁发机构颁发证书。
- 我们将此证书发送给客户。
- 我们将 Rutoken 证书保存在客户端上。
- 证书必须绑定到第一步中创建的密钥对。
现在很清楚服务器如何解密客户端的签名,因为它自己向客户端颁发了证书。
在下一部分中,我们将仔细研究如何基于成熟的开源加密库 openSSL 设置证书颁发机构。
来源: habr.com