软件指南针:专注于软件传播与分享

如何使用客户端的智能卡实现双重认证 (OpenVPN官方文档)

来源:原创 1195次浏览 0条评论
☞ 本文主要介绍软件OpenVPN的相关内容:如何使用客户端的智能卡实现双重认证 (OpenVPN官方文档)

   其下列版本/分支可以参考本文:

  • 全部版本/分支
英文原文:http://openvpn.net/index.php/open-source/documentation/howto.html#pkcs11

如何使用客户端的智能卡为OpenVPN配置添加双重认证

你也可以查看文章: OpenVPN智能卡操作指南

关于双重认证

双重认证(Dual-factor authentication)是结合两种因素的认证方法。

你应该有一个不可复制的设备,比如这个设备可以是一个包含私人密钥的加密令牌。改私人密钥内置于设备中,并且无法与之分离。如果持有该令牌的用户试图访问一个远程网络上受保护的服务,将会建立允许或拒绝网络访问的授权过程,可以高度确定的是,试图访问的用户就是已知的、经过认证的令牌的实际所有者。

你可以向加密设备中输入某些表示密码的东西。没有输入适当的密码,你将无法访问私人密钥。加密设备的另一个特点是,如果输入密码的错误次数超过允许的次数,私人密钥将无法使用。该行为可以确保即使用户丢失了他的设备,其他人也无法使用它。

加密设备通常被叫做"智能卡"或"令牌",并与PKI(Public Key Infrastructure,公钥基础设施)结合使用。VPN服务器能够核查X.509证书并验证用户是否持有相应的私钥。由于设备无法被复制,并且需要一个有效的密码,因此服务器能够更好地对用户进行验证。

双重认证比基于密码的认证强得多,因为哪怕是在最坏的情况下,也同一时间也只有一人能够使用加密令牌。密码能够被猜出或者泄露给他人,所以如果只使用密码认证来保护相关资源,在最坏的情况下,任何人都可以尝试获得未经授权的访问。

如果你将私钥保存在一个文件中,私钥通常会使用密码进行加密。这种方法的问题是,加密的密钥会暴露给解密攻击或运行于客户端计算机上的间谍/恶意软件。与使用加密设备不同,在多次解密失败后,文件无法自我删除。

什么是PKCS#11?

该标准制定了一个叫做Cryptoki的API,并用于那些持有加密信息和执行加密功能的设备。Cryptoki,发音为"crypto-key",是cryptographic token interface的简称,它采用了一种简单的基于对象的方法,旨在实现技术独立(与平台无关,可支持任何设备)和资源共享(支持访问多种设备的多个应用程序),现已发展成为一个通用的加密令牌的抽象层。

来源: RSA Security Inc. http://www.rsasecurity.com/rsalabs/pkcs/pkcs-11.

总之,PKCS#11是一套标准,用于让应用软件访问加密令牌(诸如智能卡或其他设备)。多数设备厂商都提供了一个实现PKCS#11供应商接口的库,应用程序可以使用该程序库来访问这些设备。PKCS#11 是一个免费的、跨平台的、独立于厂商的开放标准。

查找PKCS#11供应商程序库

你要做的第一件事就是寻找一个供应商程序库,它应该和设备驱动程序一起安装。每个供应商都有自己的程序库。譬如,供应商OpenSC PKCS#11就位于Unix系统/usr/lib/pkcs11/opensc-pkcs11.so或者Windows系统的opensc-pkcs11.dll

如何配置加密令牌

你应该遵循以下步骤:

  • 初始化PKCS#11令牌。
  • 在PKCS#11令牌上生成RSA密钥对。
  • 创建一个基于密钥对的证书请求,你可以使用OpenSC和OpenSSL来实现该目标。
  • 提交证书请求到CA(证书颁发机构),并接收一个返回的证书。
  • 加载证书到令牌中,同时注意证书的id和label属性必须与其私钥相匹配。

经过配置的令牌拥有一个私钥对象和一个证书对象,并且都共享相同的id和label属性。

Easy-RSA 2.0是一个简单实用的注册工具,它是OpenVPN 2.1系列的一部分。请参照README文件中的相关的指导信息,然后使用pkitool来进行注册登记。

使用下面的命令来初始化一个令牌:

$ ./pkitool --pkcs11-slots /usr/lib/pkcs11/
$ ./pkitool --pkcs11-init /usr/lib/pkcs11/ 
使用下面的命令来注册一个证书:
$ ./pkitool --pkcs11 /usr/lib/pkcs11/   client1

如何修改OpenVPN配置以使用加密令牌

OpenVPN 2.1及以上版本才能使用使用PKCS#11功能。

确定正确的对象

每个PKCS#11供应商都支持多种设备。你可以使用如下命令来显示可用的对象列表:

$ openvpn --show-pkcs11-ids /usr/lib/pkcs11/
The following objects are available for use.
Each object shown below may be used as parameter to
--pkcs11-id option please remember to use single quote mark.
Certificate
       DN:             /CN=User1
       Serial:         490B82C4000000000075
       Serialized id:  aaaa/bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600
每个证书/私钥对都有唯一的"Serialized id"字符串。我们可以使用带单引号标记的pkcs11-id选项命令来生成请求证书的序列号字符串。
pkcs11-id 'aaaa/bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600'

搭配PKCS#11使用OpenVPN

针对PKCS#11的OpenVPN选项命令的经典命令集合如下:

pkcs11-providers /usr/lib/pkcs11/
pkcs11-id 'aaaa/bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600'
这将选择与pkcs11-id字符串匹配的对象。
针对PKCS#11的高级OpenVPN选项命令
pkcs11-providers /usr/lib/pkcs11/provider1.so /usr/lib/pkcs11/provider2.so
pkcs11-id 'aaaa/bbb/41545F5349474E415455524581D2A1A1B23C4AA4CB17FAF7A4600'
pkcs11-pin-cache 300
daemon
auth-retry nointeract
management-hold
management-signal
management 127.0.0.1 8888
management-query-passwords

这将加载两个供应商到OpenVPN中,使用pkcs11-id选项命令指定的证书,并使用管理接口来询问密码。当令牌无法被访问时,后台进程将恢复到保持状态。每次输入密码后,令牌的有效期为300秒;如果管理会话突然中断,当前会话也将中断。

PKCS#11实施注意事项

许多PKCS#11供应商可以利用多线程,从而避免Linux线程实现(setuid,chroot)所导致的问题。如果你打算使用PKCS#11,强烈推荐你升级到启用了glibc的本地POSIX线程库。

OpenSC PKCS#11供应商

供应商OpenSC PKCS#11就位于Unix系统/usr/lib/pkcs11/opensc-pkcs11.so或者Windows系统的opensc-pkcs11.dll

PKCS#11和Microsoft Cryptographic API (CryptoAPI)的区别

PKCS#11是一个免费开放的、跨平台的、独立于厂商的标准。CryptoAPI是用于微软特定平台的API。大多数智能卡厂商都同时提供了对这两种接口的支持。在Windows平台环境中,用户需要选择使用哪一个接口。

对于OpenVPN的当前实现而言,只要你不是以服务方式运行OpenVPN,使用MS CryptoAPI(选项命令cryptoapicert option)的效果会更好。如果你希望在管理员环境中使用服务来运行OpenVPN,由于以下原因当前实现将无法与多数智能卡协同工作:

多数智能卡供应商不会将证书加载到本地计算机存储中,所以该实现将无法访问用户证书。

如果OpenVPN客户端以服务方式运行,没有与终端用户直接交互,因此服务无法询问用户提供智能卡的密码,导致智能卡的密码验证过程失败。

由于PKCS#11不访问微软特定存储,也不必与终端用户直接交互,因此你可以采用PKCS#11接口,在OpenVPN的任何实现上使用智能卡。

作者:软件指南针(http://www.softown.cn),转载请保留出处!

用户评论

使用指南 故障排除 0 返回顶部