在
我们以前的一篇文章中,我们讨论了在公司门户网站上进行两因素身份验证的重要性。 上一次,我们演示了如何在IIS Web服务器中配置安全身份验证。
在评论中,我们被要求为Linux最常见的Web服务器-nginx和Apache编写说明。
您问-我们写了。
您需要什么入门?
- 任何现代Linux发行版。 我在MX Linux 18.2_x64上进行了测试设置。 这当然不是服务器发行版,但是Debian几乎没有任何区别。 对于其他发行版,库/配置的路径可能会略有不同。
- 令牌。 我们将继续使用PKI Rutoken EDS模型,该模型非常适合企业应用程序的高速性能。
- 要在Linux上使用令牌,您需要安装以下软件包:
libccid libpcsclite1 pcscd pcsc-tools opensc
证书撰写
在以前的文章中,我们依赖于将使用Microsoft CA颁发服务器和客户端证书的事实。 但是,由于我们正在Linux中配置所有内容,因此,我们同时将讨论一种发行这些证书的替代方法-不离开Linux。
作为CA,我们将使用XCA(
https://hohnstaedt.de/xca/ ),它可以在任何现代Linux发行版中使用。 我们还将在XCA中执行的所有操作也可以使用OpenSSL和pkcs11-tool实用程序在命令行模式下完成,但是为了简单明了起见,在本文中我们将不再赘述。
开始使用
- 安装:
$ apt-get install xca
- 并运行:
$ xca
- 我们为CA创建数据库-/root/CA.xdb
我们建议您将证书颁发机构数据库存储在只有管理员有权访问的文件夹中。 这对于保护用于签署所有其他证书的根证书的私钥很重要。
创建密钥和根CA证书
公钥基础结构(PKI)基于分层系统。 该系统的核心是根证书颁发机构或根CA。 必须首先创建他的证书。
- 我们为CA创建RSA-2048私钥。 为此,请在“ 私钥”选项卡上,单击“ 新建密钥”,然后选择适当的类型。
- 设置新密钥对的名称。 我叫它-CA Key。
- 我们使用创建的密钥对写出CA证书本身。 为此,请转到“ 证书”选项卡,然后单击“ 新证书” 。
- 请务必选择SHA-256 ,因为不再认为使用SHA-1是安全的。
- 作为模板,请确保选择[默认]CA。 不要忘记单击全部应用 ,否则该模板将不适用。
- 在主题选项卡上,选择我们的密钥对。 您可以在那里填写证书的所有主要字段。
创建密钥和https服务器证书
- 同样,我们为服务器创建RSA-2048私钥,我称其为-服务器密钥。
- 创建证书时,我们选择服务器证书必须在CA证书上签名。
- 不要忘记选择SHA-256 。
- 作为模板,选择[default] HTTPS_server 。 单击全部应用 。
- 然后,在“ 主题”选项卡上,选择我们的密钥并填写必填字段。

我们为用户创建密钥和证书
- 用户的私钥将存储在我们的令牌中。 要使用它,您需要从我们的站点安装PKCS#11库。 对于流行的发行版,我们在此处分发现成的软件包-https: //www.rutoken.ru/support/download/pkcs/ 。 我们还有用于arm64,armv7el,armv7hf,e2k,mipso32el的程序集,可以在我们的SDK中获取这些程序集-https://www.rutoken.ru/developers/sdk/。 除了用于Linux的程序集之外,还有用于macOS,freebsd和android的程序集。
- 将新的PKCS#11提供程序添加到XCA。 为此,请转到“ PKCS#11提供程序”选项卡上的“ 选项”菜单。
- 单击“ 添加”,然后选择PKCS#11库的路径。 在我的情况下是\ usr \ lib \ librtpkcs11ecp.so。
- 我们需要格式化的令牌Rutoken EDS PKI。 下载rtAdmin实用程序-https://dev.rutoken.ru/pages/viewpage.action ? pageId = 7995615
- 我们执行
$ rtAdmin -f -q -z /usr/lib/librtpkcs11ecp.so -u <PIN- >
- 作为密钥的类型,我们选择-PKI Rutoken EDS上的RSA-2048密钥。 我将此密钥命名为“客户端密钥”。
- 输入PIN码。 我们正在等待密钥对的硬件生成完成
- 我们类似于服务器证书为用户创建证书。 这次选择[default] HTTPS_client模板 ,不要忘记单击Apply all(全部应用) 。
- 在主题选项卡上,输入用户信息。 我们对保存令牌的证书的请求表示肯定。
结果,在XCA的“
证书”选项卡上,您应该会得到类似的信息。
这组最少的密钥和证书足以直接开始设置服务器。
要进行配置,我们需要导出CA证书,服务器证书和服务器私钥。
为此,请在XCA中的相应标签上选择所需的条目,然后点击
导出 。
Nginx的
我不会写有关如何安装和运行Nginx服务器的信息-互联网上有足够的关于该主题的文章,更不用说官方文档了。 让我们开始设置HTTPS和两因素令牌认证。
将以下行添加到nginx.conf中的server部分:
server { listen 443 ssl; ssl_verify_depth 1; ssl_certificate /etc/nginx/Server.crt; ssl_certificate_key /etc/nginx/ServerKey.pem; ssl_client_certificate /etc/nginx/CA.crt; ssl_verify_client on; }
可以在以下位置找到有关Nginx中与ssl配置相关的所有参数的详细说明-https:
//nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_client_certificate我将仅简要介绍一下我自己问过的那些内容:
- ssl_verify_client-表示需要验证证书信任链。
- ssl_verify_depth-确定链中受信任的根证书搜索的深度。 由于我们的客户证书是立即在根证书上签名的,因此深度设置为1。如果用户证书在中间CA上签名,则必须在此参数中指定2,依此类推。
- ssl_client_certificate-指定受信任的根证书的路径,该路径用于验证对用户证书的信任。
- ssl_certificate / ssl_certificate_key-指示服务器证书/私钥的路径。
不要忘记运行nginx -t来检查配置中是否没有错字,并且所有文件都在需要的地方,依此类推。
其实一切! 如您所见,设置非常简单。
在Firefox中检查工作
由于我们完全在Linux上完成所有工作,因此我们假定用户也在Linux上工作(如果他们使用Windows,
请参阅上一篇文章中有关设置浏览器的说明 。
- 我们启动Firefox。
- 让我们尝试在开始时没有令牌的情况下登录。 我们得到以下图片:
- 转至:偏好设置#隐私 ,然后转到安全设备...
- 单击“ 加载”以添加新的PKCS#11设备驱动程序,并指定librtpkcs11ecp.so的路径。
- 要验证证书是否可见,可以转到“ 证书管理器” 。 提示您输入PIN码。 正确输入后,您可以验证“ 您的证书”选项卡上是否已显示带有令牌的我们的证书。
- 现在我们使用令牌。 Firefox建议选择将在服务器上选择的证书。 选择我们的证书。
- 赢利!
设置完成一次,如您在证书申请窗口中所见,我们可以保存选择。 之后,每次进入门户网站时,我们只需要插入一个令牌并输入在格式化期间设置的用户PIN码即可。 经过这样的身份验证后,服务器已经知道哪个用户已登录,并且您不能再进行其他任何窗口来进行验证,而是立即让该用户进入其个人帐户。
阿帕奇
与nginx一样,没有人应该在安装apache时遇到问题。 如果您不知道如何安装此Web服务器,请使用官方文档。
并且我们开始配置HTTPS和两因素身份验证:
- 首先,您需要激活mod_ssl:
$ a2enmod ssl
- 然后启用默认的HTTPS站点设置:
$ a2ensite default-ssl
- 现在编辑配置文件:/etc/apache2/sites-enabled/default-ssl.conf:
SSLEngine on SSLProtocol all -SSLv2 SSLCertificateFile /etc/apache2/sites-enabled/Server.crt SSLCertificateKeyFile /etc/apache2/sites-enabled/ServerKey.pem SSLCACertificateFile /etc/apache2/sites-enabled/CA.crt SSLVerifyClient require SSLVerifyDepth 10
如您所见,参数的名称几乎与nginx中的参数的名称一致,因此我将不对其进行解释。 同样,任何对细节感兴趣的人-欢迎使用文档。
现在重新启动我们的服务器:
$ service apache2 reload $ service apache2 restart
如您所见,在任何Web服务器上配置两因素身份验证,在Windows上配置,在Linux上最多花费一小时。 设置浏览器大约需要5分钟。 许多人认为,设置和使用两因素身份验证非常困难且难以理解。 我希望我们的文章至少有一点,但揭穿这个神话。