我是新来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私有密钥存在,我们应该能够使用encrpyting。
产生比较关键
不过,如果你使用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
(这与加密私钥,所以你用公钥解密 - 这其实非常相似签署 - 通常你不会这么做)。
问题是 - 如果你比较你产生-public-钥匙不匹配。 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
我们得到:
-----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-凯基生成的公钥是不一样的格式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
但验证的步骤将不使用生成的SSH密钥的工作。
那么,这是否回答你的问题,即它是否possible
? 我怕我不知道SSH公钥从“正常” RSA公共密钥的不同之处。
我怀疑你的代码,因此甚至不需要是因为它是复杂的 - 我不认为你需要PKCS垫密钥文件。
如
#!/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填充线)
加密的私有密钥(密码)
从意见如下:
如果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:
要么:
openssl rsa -in test_id.enc -passin pass:testpass
我不太确定你是如何做到这一点使用Crypt::OpenSSL::RSA
-似乎没有要指定一个密码到一个私有密钥的任何选项。
我思故你需要使用Crypt::CBC
首先解密私钥。 我不能对此进行测试,因为我有依赖性的负载进行安装。
谷歌搜索有点提示您可能能够使用Crypt::PK::RSA
代替。
而作为一个alernative -使用IPC::Open2
并启动openssl
过程中做的事情,而不使用库在所有。
如
my $keystring = `openssl rsa -passin pass:testpass -in test_id.enc`;
不是很漂亮,但它会工作。 (和测试它的实际工作)