是否可以在 Perl 中使用 SSH 私钥对我的数据进行签名? [关闭]

2024-01-18

我是 Perl 新手,所以这可能是非常基本的,但我找不到解决这个问题的方法。我正在尝试签署我的数据,该数据必须使用我的通过 https 连接发送ssh private key(id_rsa)。我无法使用 Perl 来做到这一点,而且我已经花了好几天了。请有人告诉我一种可能的方法。如果需要更多信息,请询问我。提前致谢

我所要求的代码是

#!/usr/bin/perl
use File::Slurp   qw(read_file);
use Crypt::OpenSSL::RSA;
use MIME::Base64 qw( decode_base64 encode_base64 );

my $keystring = read_file( 'id_rsa' );
my $privatekey = Crypt::OpenSSL::RSA->new_private_key($keystring);
$privatekey->use_pkcs1_padding();
my $datatosign = "hello";
my $signature = $privatekey->sign($datatosign);
my $base64 = encode_base64($signature);
print "$base64"; 

运行它时出现的错误是RSA.xs:178: OpenSSL error: unsupported encryption at test.pl line 7.

注意:正如评论中所讨论的,我使用的是受密码保护的id_rsa.


因此,省略 perl,只需使用 openssl 手动执行此操作

检查密钥:

ssh-keygen -t rsa -f test_id

openssl rsa -in test_id -check
  RSA key ok

所以我们确实有一个“有效”的 RSA 私钥,我们应该能够使用它来加密。

生成比较键

但是如果您使用 openssl 生成密钥对

openssl genrsa -out openssl_gen_rsa
openssl rsa -in openssl_gen_rsa -pubout -out openssl_gen_rsa.out 

看起来你需要的命令是:

openssl rsautl -inkey test_id  -in test_file.txt -encrypt -out test_file.enc

(使用私钥加密,因此您可以使用公钥解密 - 这实际上与签名非常相似 - 通常您不会这样做)。

问题是 - 如果您比较生成的公钥,它们不匹配。test_id.pub看起来像(是的,这是真的,不,我只是用它来测试!)

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDKfjRD+Gb5EE+SgOy7eoT0siQaAqfSY7KI2wkdrdygnJ+ccW/uMCtCVPhpz00u3EW2Gz1WI    DteLKppjvUem1lKb8Tt2EWBQGyFOYKp44r3AJZgTcxLeDdqSUoiPsjWf1aUqy2Z1fBgtG+QOa7bpA8km6CbsORYX/TVg4B6vvdkkH    K8WcmzBBF3rGsTCM3VXPp56bPoMCbwCsXvIjejmq+JdGHyxUmCxe1PrPyvmoYX3OUqpFBYIjeLWGDI9EXS6jA/r7viIAxdllvulPg    IJ+4mdYzKN+T1ME0X0c+ZdFTMdeUnB9/TZmJr1j8Q/4SQm+3J9CiwtVXKxdkDsDObkcDp root@raspberrypi

我生成的密钥文件如下所示:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDG8i33AuEp1wqbJgkEsnOmQim3
QT76B/oxsVGfJEDX3h4A6CD+ypBbfhhIn0GlfHanYvcGlpOJIlk3fzspbZNeoPJS
T4a0zQ0z8uJkugl8utyl9WR4tpgBRmzXZ42T/f4QSNqjDxUidRp5zPnXs9aRDtWb
XptswiGL3eVHMpbSnwIDAQAB
-----END PUBLIC KEY-----

我可以使用我生成的对(使用公钥加密,使用私钥解密):

openssl rsautl -inkey openssl_gen_rsa.out -pubin  -in test_file.txt -encrypt -out test_file.enc2
openssl rsautl -inkey openssl_gen_rsa -in test_file.enc2 -decrypt

这有效。

将 OpenSSH 私钥转换为 RSA 公钥

因此,如果我们通过 openssl 运行您的 ssh 私钥:

openssl rsa -in test_id -pubout -out test_id.openssl.pub

We get:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyn40Q/hm+RBPkoDsu3qE
9LIkGgKn0mOyiNsJHa3coJyfnHFv7jArQlT4ac9NLtxFths9ViA7XiyqaY71HptZ
Sm/E7dhFgUBshTmCqeOK9wCWYE3MS3g3aklKIj7I1n9WlKstmdXwYLRvkDmu26QP
JJugm7DkWF/01YOAer73ZJByvFnJswQRd6xrEwjN1Vz6eemz6DAm8ArF7yI3o5qv
iXRh8sVJgsXtT6z8r5qGF9zlKqRQWCI3i1hgyPRF0uowP6+74iAMXZZb7pT4CCfu
JnWMyjfk9TBNF9HPmXRUzHXlJwff02Zia9Y/EP+EkJvtyfQosLVVysXZA7Azm5HA
6QIDAQAB
-----END PUBLIC KEY-----

这甚至不是与 id_rsa.pub 文件远程相似的编码 - 我想这就是为什么你会遇到这个问题。

 openssl rsautl -inkey test_id.openssl.pub -pubin  -in test_file.txt -encrypt -out test_file.openssl.pub.enc

现在可以了,您可以使用您的test_id私钥:

openssl rsautl -inkey test_id -in test_file.openssl.pub.enc -decrypt

所以是的 - 由于某种原因,ssh-keygen 生成的公钥与 openssl 期望的格式不同,因此它不起作用。

使用 openssh 密钥进行验证

不管怎样,回到原来的例子——使用私钥生成签名:

openssl rsautl -sign -inkey test_id -in test_file.txt -out test_file.sig
openssl rsautl -verify -in test_file.sig -inkey test_id.openssl.pub -pubin

但验证步骤won't使用生成的 ssh 密钥进行工作。

那么这是否回答了您的问题:possible?恐怕我不知道 ssh 公钥与“普通”rsa 公钥有何不同。

因此,我怀疑您的代码甚至不需要那么复杂 - 我认为您不需要 pkcs 填充您的密钥文件。

E.g.

#!/usr/bin/perl
use strict;
use warnings;
use File::Slurp   qw(read_file);
use Crypt::OpenSSL::RSA;
use MIME::Base64 qw( decode_base64 encode_base64 );

my $keystring = read_file ('test_id');
my $privatekey = Crypt::OpenSSL::RSA->new_private_key($keystring);
my $datatosign = "hello";
my $signature = $privatekey->sign($datatosign);
my $base64 = encode_base64($signature);
print "Signature:\n";
print "$base64";

my $public_key_text = $privatekey-> get_public_key_string();
print "Public Key:\n";
print $public_key_text;

my $rsa_pub = Crypt::OpenSSL::RSA->new_public_key ( $public_key_text );
print "Signed correctly\n" if ($rsa_pub->verify($datatosign, decode_base64($base64)));

这似乎有效。 (注意缺少 pkcs 填充线)。

加密私钥(密码)

以下来自评论:

If your id_rsa设置了密码短语,您将得到如下内容:

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,B44716076DD8B7D2B5E909BB8F70B48B

您可以再次使用 openssl 手动解密:

openssl rsa -in test_id.enc
Enter pass phrase for test_id.enc:

Or:

openssl rsa -in test_id.enc -passin pass:testpass

我不太确定你如何使用Crypt::OpenSSL::RSA- 似乎没有任何选项可以指定私钥的密码。

我认为你因此需要使用Crypt::CBC首先解密私钥。我无法对此进行测试,因为我需要安装大量依赖项。

一些谷歌搜索表明您可能可以使用Crypt::PK::RSA https://metacpan.org/pod/Crypt::PK::RSA反而。

作为替代方案 - 使用IPC::Open2并开始openssl完全不使用库来完成这些事情的过程。

e.g.

my $keystring = `openssl rsa -passin pass:testpass -in test_id.enc`;

不太好,但它会起作用。 (并测试它确实有效)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以在 Perl 中使用 SSH 私钥对我的数据进行签名? [关闭] 的相关文章

随机推荐

  • 如何只为 pandas 中数据帧的某些列绘制直方图

    这是我拥有的数据 在此输入图像描述 https i stack imgur com EwuSA png 假设我有一个名为 df 的变量中的数据框 如果我执行 df hist 它将为数据框中的每个类别显示一个直方图 但我只想为从类别 1 到类
  • 从 docker-compose 中退出代码打破 while 循环

    我有一个案例 有一个 WordPress 项目 我应该在其中创建一个脚本来更新插件并将源代码更改提交到单独的分支 在这样做时我遇到了一个奇怪的问题 输入变量 akimset 4 0 3 all in one wp migration 6 7
  • 在一条消息 MQTT 中发布多个主题

    我有一个设备可以从不同的传感器收集大量数据 我想通过一条消息将它们发送给我的经纪人 在客户端 我只想在给定时间查看其中一些数据 我不想看到全部数据 我可以在一条消息中发布多个主题 然后在客户端只能看到其中的一些主题吗 我知道我可以使用通配符
  • 如何在打印事件上触发javascript?

    当用户打印页面时是否可以触发javascript事件 当用户选择打印页面时 我想删除对 j avascript 库的依赖 因为该库非常适合屏幕但不适合打印 知道如何实现这一目标吗 对于任何从谷歌偶然发现这个答案的人 让我尝试澄清一下 正如
  • Couchbase/N1QL:从参数提供的值列表中选择

    作为后续从集合中按 类别 获取顶部行 https stackoverflow com questions 72447539 get top rows by category from a collection我仍然想获取每个类别 ID 的前
  • Azure WebJobs - 在哪里托管?它们作为长时间运行的进程安全吗?

    From Azure 网站始终在线 https stackoverflow com questions 26578934 azure website always on and Azure 网站上 始终开启 设置的含义 https stac
  • Android viewModel 保存的StateHandle

    这更多的是一个概念性问题 Android 最近引入了在 viewModel 内部处理进程死亡期间状态的概念 而不是savedInstanceState以前位于 Activity 或 Fragment 中 我的问题是如何测试这个进程的死亡 如
  • 如何在 Robot Framework 中标记数据驱动模板测试

    我有很多数据驱动的测试 这样我就可以对多行 数据运行相同的测试 效果很好 但是 我们还使用 TestRail 并通过 RF 测试上的标签将 RF 测试链接到 TestRail 目前我只为每个模板标记一个 TestRailID 例如 Test
  • 如何在Linux用户空间中实现高精度定时器?

    我的 BeagleBoard 上安装了 Angstrom Linux 我想实现非常精确的计时器 每 500us 触发一次 我读到hrtimers 但我发现的所有实现都是针对内核空间的 我想在用户空间中实现它 有没有可以调用这些的APIhrt
  • React-hook-form 和 Material UI FormControl

    所以我试图为我的表单注册一些单选按钮 但它不会注册
  • ImageMagick 和 Java Runtime Exec 的问题

    我有一个奇怪的问题 我认识的 java 专家都无法解决 我需要在我的应用程序上使用 imagemagick 将我网站上的电子邮件转换为图像 这样就没有锅可以轻松地获取电子邮件 使用 image magick 命令行解决了问题 如下所示转换
  • 为什么 std::initializer_list 会复制项目?

    我一直以为std initializer list是一个轻量级代理对象 它只会从列表项中获取 const 引用 而不是复制它们 但后来我发现在这种情况下实际上执行了复制 struct Test Test std cout lt lt thi
  • 使用 Vue Js 和 Vue Cli 构建 Chrome 扩展

    我目前正在构建一个 Chrome 扩展程序vuejs https vuejs org 供电前端 使用这个效果非常好vuecli https cli vuejs org 直到应用程序开始使用Webextension API 普通网站无法访问此
  • PyQt5 无法导入 QtGui

    我刚刚从 PyQt4 迁移到 5 并且 QtGui 遇到问题 我使用 32 位 Windows 安装程序安装 而不是我自己的版本 当我做 from PyQt5 import QtGui I get class MainWindow QtGu
  • Feign 客户端中不支持 Spring Data Pageable 作为 RequestParam

    我一直在尝试为我的其余 api 公开一个 Feign Client 它采用 Pageable 作为输入并定义了 PageDefaults 控制器 GetMapping value data produces MediaType APPLIC
  • 从 Eclipse 连接到 MySQL (CDT)

    我尝试使用 Eclipse 中的 C 连接到 MySQL 数据库 并参考了互联网上的所有建议 但没有一个是完全有帮助的 我正在使用 Eclipse 和 MinGW 连接到 MySQL 我添加了 C Program Files boost C
  • htaccess 重写传递两个变量或一个取决于两者是否可用?

    我想将第一个目录作为变量传递 将子目录作为另一个变量传递 它适用于具有两个目录 something something2 的 url 但当我尝试仅使用一个目录 something 时 我收到错误 404 RewriteRule posts
  • 在浏览器中渲染 docx 文件

    我正在使用 docx4j 将 microsoft word 文档转换为 pdf 然后在浏览器中显示它http www docx4java org trac docx4j http www docx4java org trac docx4j它
  • 在 Python Pandas 中训练朴素贝叶斯的不同类型的特征

    我想使用许多特征来训练朴素贝叶斯分类器来对 A 或 非 A 进行分类 我有三个不同值类型的特征 1 total length 正整数 2 元音比率 以小数 分数表示 3 twoLetters lastName 包含多个两个字母字符串的数组
  • 是否可以在 Perl 中使用 SSH 私钥对我的数据进行签名? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我是 Perl 新手 所以这可能是非常基本的 但我找不到解决这个问题的方法 我正在尝试签署我的数据 该数据必须使用我的通