我正在尝试通过国家服务部门进行授权。网站的连接顺序很明确。目前尚不清楚如何使用证书。
我查看了几个 PHP(例如https://github.com/fr05t1k/esia)和其他语言的实现示例。
我们到处都在谈论证书(1 个文件)、私钥(1 个文件)和私钥的密码(字符串)。
我从中得到了什么:
私钥的密码
一些证书在链接http://esia.gosuslugi.ru/public/esia.zip上公开可用 我知道我只需要其中一个,具体取决于签名的类型。
客户发送的文件(他还在国家服务中心注册了该网站)。
来自客户的文件包含一个带扩展名的文件cer
(另一个证书?)和一个文件夹,其中包含多个带扩展名的文件key
(header.key、mask.key、primary.key 等)
问题:我如何使用这些数据?我需要什么证书?哪个密钥文件是私钥?还是我需要执行一些操作并从中生成私钥?
了解情况。
因此,客户端发送的密钥(6 个私钥和 1 个证书)只能导入 cryptopro。您只能使用 cryptopro 软件 ( https://www.cryptopro.ru/ ) 来使用它们。使用他们的软件,您只能签署文件、请求 - 不。另外它是免费的。
结果,我们找到了一个可以使用 GOST 加密的 docker 容器(https://github.com/rnixik/docker-openssl-gost/tree/master/php-fpm-gost)。我们为它制作了一个简单的 rest api,以使用库 ( https://github.com/ekapusta/oauth2-esia )代理对 ESIA 的请求
要使用此库,您需要转换密钥和证书。
使用此https://github.com/garex/nodejs-gost-crypto转换了密钥 使用此https://ssl4less.ru/faq/ehniceskie-voprosy/onvertirovanie-sertifikatov-pem-p7b-pfx 转换了证书-der .html
与 ESIA 交换需要加密,因此您必须拥有自己的 RSA 密钥进行签名。私钥随身携带,公共证书上传到 ESIA 柜。
由于 ESIA 还会向您发送加密信息,因此您将需要一个公共 ESIA 证书来解密此信息。
很可能是公共证书。您可以尝试打开它。Windows 应打开一个标准窗口,其中包含有关证书的信息。
但这里很难说。看起来客户端使用crypto-pro或类似的东西在闪存驱动器上生成了密钥,然后简单地复制了目录。在这里他错了。需要了解客户对集成的具体要求
对于通过公共服务进行授权,您可以使用例如自签名证书:
首先生成私钥和证书请求
在生成过程中,您将被要求输入私钥的密码。
然后为它颁发一个公共证书
您将有两个文件 domain.key(私钥)和 domain.crt(证书)。然后需要将证书上传到 ESIA 办公室。
包https://github.com/ekapusta/oauth2-esia对与 ESIA 的集成有很大帮助 。使用它的描述https://habr.com/ru/post/358834/
顺便说一下,如果你看一下github上的测试,你会发现那里有一个测试组织的助记词和它的现成密钥。将可以进行测试。
以前的答案现在无关紧要(至少对我们而言)。要求已经改变,我们不得不使用 cryptopro。
我们使用图像https://hub.docker.com/r/required/cryptopro解决了这个问题。仔细查看如何安装它并导入密钥。您必须自己下载存储库并从本地文件构建,而不仅仅是指定图像名称。
在图像内部,您需要以任何可能的方式引发一个 apishka,它将一个字符串作为输入,并为输出提供一个签名字符串。这就是这张图片的全部用途。
签名命令:
阿帕奇脚本:
Apishka 像这样抽搐:
因此,我们能够签署线路。下一步是什么?
我们使用https://github.com/ekapusta/oauth2-esia作为 OAuth 客户端
但最后我不得不重写一些东西
如何使用
PS 代码是从项目中拉出来并更正的,所以它并没有声称它是 100% 功能的,但是脚本是可见的。