OpenSSL 无法加载公钥

问题描述 投票:0回答:5

尝试在 OSX Yosomite 10.10.2 上通过命令行加密短信

创建了公共

.pem
密钥,如下所示:

ssh-keygen -f ~/.ssh/id_rsa.pub -e -t PKCS8 > id_rsa.pem

如果我尝试加密 myMessage.txt

openssl rsautl -encrypt -inkey ~/.ssh/id_rsa.pem -pubin -in ~/Desktop/myMessage.txt -out ~/Desktop/encrypted.txt

我明白了

unable to load Public key

如果我输入:

openssl asn1parse -in id_rsa.pem

退货:

Error: offset too large

但我不知道如何解决它。 我应该更改什么才能使其正常工作?

openssl ssh-keys
5个回答
42
投票

仍然不知道我的问题出了什么问题,但找到了解决方案:

  1. 生成RSA密钥:

    $ openssl genrsa -out key.pem 1024 
    $ openssl rsa -in key.pem -text -noout
    
  2. 将公钥保存在 pub.pem 文件中:

    $ openssl rsa -in key.pem -pubout -out pub.pem 
    $ openssl rsa -in pub.pem -pubin -text -noout 
    
  3. 加密一些数据:

    $ echo test test test > file.txt 
    $ openssl rsautl -encrypt -inkey pub.pem -pubin -in file.txt -out file.bin 
    
  4. 解密加密数据:

    $ openssl rsautl -decrypt -inkey key.pem -in file.bin 
    

它就像一个魅力


5
投票

我也遇到了这个问题,并认为这里有一个很好的提示:

两种公钥格式如何转换,一种是“BEGIN RSA PUBLIC KEY”,另一种是“BEGIN PUBLIC KEY”

OpenSSL 加密命令似乎需要 SSL 公钥而不是 RSA 公钥。

我们现在已经了解了足够的信息来调整示例以使其正常工作。 SSL 公钥可以通过 RSA 公钥生成:

openssl rsa -in id_rsa.pem -RSAPublicKey_in -pubout > id_pub.pem

然后可以使用

进行加密步骤

openssl rsautl -encrypt -inkey id_pub.pem -pubin -in ~/Desktop/myMessage.txt -out ~/Desktop/encrypted.txt

截至撰写本文时,MacOSX Yosemite 中的默认 OpenSSL 命令似乎是 0.9.8zg。此版本中的

rsa 命令不支持运行上述第一个命令的功能。我通过安装 OpenSSL 1.0.1p 解决了这个问题。


3
投票
当我从证书中提取公钥时,我遇到了同样的问题。

openssl x509 -pubkey -noout -in cert.crt > pubKey.pem

之后,我想用下面的命令打印有关密钥的信息。

openssl rsa -text -pubin -in pubKey.pem

并收到错误:

unable to load Public Key



解决方案

我在记事本++中打开pubKey.pem,并在

Encoding菜单中选择了UCS-2 LE BOM。所以我把它改成了UTF-8编码。更改编码后,pubKey.pem 的大小是原始大小的一半。然后它就像魅力一样发挥作用。

在 Windows 和 powershell 中测试


2
投票
您的初始解决方案应该可以工作,只是有一个小拼写错误:要指定密钥格式(PKCS8),使用“-m”选项而不是“-t”选项(它代表密钥类型:dsa、ecdsa、ed25519 或RSA)。请参阅

ssh-keygen 手册页。

ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8 > id_rsa.pem

然后,您可以使用以下方法进行加密:

openssl rsautl -加密 -inkey ~/.ssh/id_rsa.pem -pubin -in ~/Desktop/myMessage.txt -out ~/Desktop/encrypted.txt

并且,您可以使用以下方式解密:

openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in ~/Desktop/encrypted.txt -out ~/Desktop/decrypted.txt

您可以使用文本编辑器或此

diff 命令检查原始文件和解密文件之间的差异:

diff ~/Desktop/myMessage.txt ~/Desktop/decrypted.txt

事实上,

openssl rsautl -encrypt命令需要一个具有“PEM PKCS8公钥”编码格式的公钥,但ssh-keygen生成此格式的私钥和适应于authorized_keys的其他格式的公钥文件位于~/.ssh

目录中(您可以使用文本编辑器打开密钥以查看格式之间的差异)。


0
投票
我不得不在 OSX (Ventura) 上努力解决这个问题

    权限(权限错误,无法读取...)
  • 格式错误(PEM/PKCS8 与“SSH 类型”)
我带来了这个解决方案

# generate a PRIVATE KEY openssl genpkey -algorithm RSA -aes-256-cbc -outform PEM -out private_key.pem -pkeyopt rsa_keygen_bits:2048 # create a passphrase made of 4 chars minimum # SUDO ! change permissions to 600 at most sudo chmod 600 private_key.pem # but 400 should work and is event more secure sudo chmod 400 private_key.pem # SUDO again # extract THE PUBLIC KEY in PKCS8 file format sudo ssh-keygen -e -f private_key.pem -m PKCS8 > public_key.pem # enter your passphrase

public 密钥提供给想要保护 data.in.txt 文件的人。她或他将执行以下操作来加密它:

# SUDO again sudo openssl pkeyutl -encrypt -pubin -inkey public_key.pem -in data.in.txt -out data.enc.txt
您收到要解密的加密文件(data.enc.txt):

# SUDO again sudo openssl pkeyutl -decrypt -inkey private_key.pem -in data.enc.txt -out data.out.txt # then you can read the confidential information cat data.out.txt
您可以执行相同的方法,以便他/她提取他/她的公钥,以便在发送之前加密您的公钥以保护它。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.