公钥基础结构:合格的证书请求生成实用程序

图片 公钥基础结构(PKI / PKI)与密钥对的主要对象之一是证书,它今天实际上已经是民用护照的类似物。

拥有证书后,公民就可以访问国家服务门户,缴税,保护他的电子邮件 ,对文档进行签名和加密等等。

证书,如护照 ,是根据申请和提供的许多文件而签发的。 获得证书的文件清单在由通信部 (新名称为数字开发,电信和大众通信部) 认可的任何认证中心上。 护照申请书具有申请人的手写签名。 收到护照后,申请人将在护照上签名,并由护照办公室工作人员和公章证明。 照片和所有者复制其签名的能力,并允许其被识别为特定护照的所有者。

使用类似的方案来获得电子签名验证密钥(SKEPEP)的证书。 首先,想要获得证书的公民必须在粘贴自己的签名时获得“技能”。 申请人通过接收包含公开密钥或电子签名验证密钥(KEPP)和私有密钥或电子签名密钥的密钥对来实现此“技能”,实际上,该密钥对允许您生成电子签名并签署电子文档。 根据以下算法对文档下的电子签名进行识别。 根据证书确定通过哪个密钥(密钥长度为64或128字节的GOST R 34.10-2001,GOST R 34.10-2012)签名。 密钥的类型决定了对文档签名时使用的哈希算法。 它可以是GOST R 34.11-94或GOST R 34.11-2012,哈希长度为256或512位。 根据所选算法,考虑源文档中的哈希。 然后根据源文档,公钥(KEPP)及其参数(所有这些都取自SKEPEP证书)计算出的哈希值,检查文档下电子签名的真实性。

为了创建密钥对,使用了多种支持加密算法GOST R 34.10-2001和GOST R 34.10-2012的加密信息保护(CPSI)方法。 应当记住,不允许在2018年12月31日之后使用GOST R 34.10-2001签名方案来生成签名! 实现各种密码算法和协议的密码信息保护工具可以是软件,也可以是硬件。 通过密码接口执行对密码信息保护的访问。 绝大多数具有俄罗斯密码学的认证密码信息保护系统都支持所有平台都支持的通用PKCS#11密码接口,或者支持MS Windows平台上的Microsoft CSP和CryptoAPI接口(以下称为MS CSP)。 例如, State Services门户支持这两个密码接口。 将进一步考虑以下两种类型的密码信息保护:


应该牢记的是,如果不仅希望在Windows平台上,而且在其他平台(Linux,macOS等)上都需要使用电子签名,那么应该选择支持俄罗斯密码的PKCS#11令牌。

除了与生成请求有关的主要功能外,该实用程序还提供了用于处理令牌和证书的功能:


主窗口上的组合字段(组合框)“选择令牌:”包含用于生成密钥对的可用密码信息保护工具的列表。 如果请求生成实用程序在Windows平台上运行,并且安装了支持俄语加密的CSP加密提供程序,则将在可用的加密信息保护工具列表中定义虚拟MS_CSP令牌(“选择令牌:”)。 因此,如果希望使用MS CSP密码提供程序,则必须在启动实用程序之前将其安装在系统上。

要添加对新PKCS#11令牌的支持,只需选择菜单项“令牌管理->添加令牌”。 添加对新令牌的支持包括为令牌/智能卡的插件类型选择PKCS#11库,并设置一个方便的名称(昵称)。 在添加对具有连接的(插入的)令牌的新型令牌的支持时(以及启动实用程序时,如果以前添加了令牌支持),则需要输入PIN码才能访问它:


但这仅在令牌不仅已连接而且还处于工作状态(即 初始化。 检查令牌,并在必要时对其进行初始化,更改PIN码以对其进行访问等。 使用p11conf实用程序很方便:


通过选择“令牌管理->令牌机制”项,您可以看到特定令牌的加密机制,例如,是否支持GOST R 34.10-2012算法。 对于虚拟令牌MS_CSP,列出了所有支持GOST算法及其支持的机制的CSP提供程序:


如果选定的令牌不支持选定的密钥对类型,则将显示相应的消息:


在直接填写请求字段之前,有必要决定出于什么目的需要证书,即 指定“证书的角色”。 如今,这样的角色已经积累了十几个:


每个角色都与证书中包含的许多不同的OID相关联。 因此,例如,要访问公共服务门户,需要以下oid:

{} {clientAuth, emailProtection, 1.3.6.1.4.1.311.20.2.2, 1.2.643.100.2.1, 1.2.643.2.2.34.6, 1.3.6.1.5.5.7.3.2, 1.3.6.1.5.5.7.3.4, 1.2.643.5.1.24.2.1.3, 1.2.643.6.14, 1.2.643.3.215.4, 1.2.643.3.215.5, 1.2.643.3.215.6, 1.2.643.3.215.7, 1.2.643.3.215.8, 1.2.643.3.215.9, 1.2.643.3.215.11, 1.2.643.3.215.12, 1.2.643.3.215.13, 1.3.6.1.4.1.40870.1.1.1, 1.2.643.2.64.1.1.1, 1.2.643.3.5.10.2.12, 1.2.643.6.3.2, 1.2.643.5.1.24.2.46, 1.2.643.6.45.1.1.1, 1.2.643.5.1.24.2.30, 1.2.643.5.1.28.2, 1.2.643.5.1.28.3, 1.2.643.3.202.1.8} 

可以在实用程序源代码(oid_roles_bad变量,运算符:)中找到其他角色的OID(例如,“ Gazprombank网站”,“饮酒者”等)。

 set oid_roses_bad {. . .} 

如此众多的oid的存在很难理解。 我们正在谈论合格证书,其中包含oid,TIN,PSRN,SNILS等,它们可以唯一标识个人和法人实体,而且看来这足以访问国家服务门户和其他也一样 但是,Dura lex,sed lex-法律很苛刻,但这是法律。

在“ CIPF名称”字段中,必须指出CIPF(令牌/智能卡,CSP)的名称,该名称写在俄罗斯联邦安全局的合格证书(请勿与X509证书混淆)或其他类似文件中,在购买CIPF时必须提供副本。 随后,此字段的值将包含在证书中。

因此,在确定了密码信息保护系统和密钥对之后,您就可以开始填写电子申请/电子签名验证密钥(SKEPEP)的证书申请:


要填写的第一个字段是“通用名称”,在其中输入将来的证书持有者的全名。 对于个人,这是护照中的全名。 对于法人实体,这是注册簿中的公司名称。 有关法人的信息将自动在“组织名称”(“ O”)字段中重复:


填写表格时,将检查TIN,BIN,SNILS字段的填写正确性(如果输入数字,则该字段将变为红色,正确填写的字段将变为绿色),电子邮件地址:


填写所有请求字段并单击“完成”按钮后,最后将收到证书请求:


在创建请求的过程中,将在所选令牌上生成密钥对。 同时,如果选择虚拟令牌“ MS_CSP”作为令牌,该令牌又支持各种用于存储密钥对的媒体,则建议选择一种特定的媒体:


回想一下,密钥对包含两个密钥:私有密钥和公共密钥。 公钥(也称为电子签名验证密钥)被发送到证书请求。 要查看包含公共密钥的生成的请求,请使用菜单“证书->查看请求”:


私钥仍保留在申请人的令牌上,令牌中的PIN码(密码)必须作为他的眼睛存储。 而且,由于公钥和私钥之间存在明确的对应关系,因此您始终可以检查谁拥有证书请求,然后再检查证书本身,文档上的签名等。

现在,有了所有必要的文件,并在闪存驱动器上生成了请求,您可以前往最近的认证中心并获得证书。 因此,要求在考虑到2011年4月6日《联邦法》而创建的一个CA中颁发证书。 第63-号“电子签名”:


向CA提出的请求将经历此请求的导入,审查,批准和颁发证书的阶段:


颁发的证书将在其中一种CA服务上发布,可以从中下载。 现在,已颁发的证书已足够导出到申请人的闪存驱动器:


现在,当收到证书时,它将保留放在CIPF(PKCS#11,MS CSP)上(证书->导入x509):


要验证证书是否位于令牌上,可以查看令牌/智能卡的内容(证书->在令牌上查看x509):


好吧,让它成为“装甲”(给我这样的PAPER!Final Paper,装甲。(狗心c / f)),将令牌连接到支持俄罗斯加密的Firefox浏览器,并在个人证书(包括此类证书,其令牌具有私钥):


Tcl / Tk上开发的CreateCSRCAFL63实用程序。 为了访问MS CSP和PKCS#11令牌的加密功能,已经开发了cwapi软件包,该软件包通过Tcl实现了C库的要求。 实现这些要求并不难 ,但是有时由于其例行程序会花费很多时间。 在这里,公用事业SWIG进行了救援 ,它使您可以在C / C ++库和其他语言之间创建接口模块。 这不仅是Tcl,而且是Java等。 该项目有很好的文档记录,并有很好的例子。 使用它并不困难。 在我们的例子中,为了获取接口模块,为swig实用程序编写了一个简单的源文件cwapi.i:

 %module cwapi %inline %{ #include "cwapi.h" %} %include "cwapi_SWIG.h" 

cwapi.h文件包含来自主要cwapi项目的功能描述:
 #ifdef __cplusplus extern "C" { #endif int CW_Initialize (char *configdir); int CW_Finalize (); int addp11mod (char *nickname, char *library); int remp11mod (char *nickname); char * lmod (); char * ltok (); char * lcert (char *token, int priv_cert); char* createreq (char *token, char *subject, char *keyusage, int keyparams, int pem, char *skzi, char* role); char* viewx509 (char *nickname, int CertOrReq); char* x509pem (char *nickname); char* x509fromfile(char *token, char *infile, char *trusts); int delcert (char *nickname, int priv_cert); int p12tofile (char *token, char *nickname, char *outfile); char* p12fromfile(char *token, char *infile); char* lmech(char* token); char* tinfo(char* token); #ifdef __cplusplus } #endif 

通过运行命令:

 $export SWIG_LIB=/usr/local/swig-3.0.12/Lib $/usr/local/swig-3.0.12/swig -tcl8 -o cwapi_wrap.c cwapi_.i $ 

在文件cwapi_wrap.c中,我们获得了现成的接口模块。 将其添加到cwapi项目中,对其进行重建并获得一个新的程序包,该程序包中将使用该程序包。
要获得分发工具包,使用freewrap实用程序非常方便,而cwapi库也直接包含在分发软件包中。 源代码实用程序和发行版可用于Windows和Linux平台。

我想提到另一个实用程序,即tcl2c 。 该实用程序将tcl / tk代码“包装”为C代码。

要获取可执行代码,只需运行以下命令:

 $cc -o create_csr_ create_csr.c -ltcl -ltk $ 

Linux平台的发行版还包括带有cwapi包静态连接的C发行版。

Source: https://habr.com/ru/post/zh-CN412993/


All Articles