【问题标题】:Delphi Lockbox 3 DOES NOT load public key generated by OpenSSLDelphi Lockbox 3 不加载由 OpenSSL 生成的公钥
【发布时间】:2014-03-03 14:57:27
【问题描述】:

尝试使用 Lockbox 3 在 Delphi 中加载 RSA 公钥我遇到此错误:“(错误)公钥文件损坏、为空或类型错误。” 我使用以下命令通过 OpenSSL 生成了一对公钥和私钥:

openssl genrsa -out private.pem 2048   //generate private key
openssl rsa -pubout -in private.pem -out public.pem //generate public key

然后在 Delphi 中我使用以下代码加载 libeay32.dll:

  sig: TOpenSSL_Signatory;       
  ...
  Sig.Clear;
  Sig.isLoaded := True;
  if Sig.isLoaded then ShowMessage('The OpenSSL library libeay32.dll was loaded successfully.');

总是成功加载。 然后我使用下面的代码来加载公钥(即public.pem):

f:=TFileStream.Create('c:\keys\public.pem', fmOpenRead);
sig.LoadKeysFromStream(f, [partPublic]);
f.Free;

以上代码导致如下错误: “(错误)公钥文件损坏、为空或类型错误。”

如何解决这个问题,将OpenSSL生成的公钥成功加载到Delphi?

public.pem 如下图所示:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAz98tqhhArIOoTtO3HFDW
TcQz4EcSBIc3YejV9GPQq+gMdqO5VsmQhOfHyWAMwOVJ49w/fGib+zyIPmocwCqE
jnQ5UjpNhkO5JIDmlf5NZGI2JcuORg+4Anqgo0D4YGCY04w7Sk8dArLHK+PThPwC
uM2XqyRCpcyTsWRKcH5/G6k6OBBhj5kIeNOy+ZCLeADhNUNiEBXdHQWoMbC+x8Fk
E73KzoOg61BQ7HBMJmfK2p8Shi/wEqD1DPJK3IKkTS+KAB8LvLXdUTDHg1O6FbDn
FfSQWYXzV5MWZR7M3POyX6rjoGRFK+v3mG08S5qEPj/l/PBgNL6wI/aBNkFsYxgf
7QIDAQAB
-----END PUBLIC KEY-----

【问题讨论】:

  • 你能确认公钥是PEM格式吗? cat 看看你是否看到--- BEGIN PUBLIC KEY ---。如果是DER 格式,请将-outform PEM 添加到openssl rsa 命令中。如果您是 PEM 格式,请尝试将 --- BEGIN PUBLIC KEY --- 更改为 --- BEGIN RSA PUBLIC KEY ---
  • 我将 public.pem 文件的内容添加到问题中。我还将 --- BEGIN PUBLIC KEY --- 更改为 --- BEGIN RSA PUBLIC KEY --- 仍然与我在问题中提到的错误相同。但后来我也将结束标记更改为 -----END RSA PUBLIC KEY----- 导致新错误:“error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag”
  • 如果你运行 c:\OpenSSL-Win32\bin\openssl x509 -in public.pem -inform PEM -noout -text,你的公共 PEM 的文本形式会说什么
  • 运行命令后,我收到此错误:“无法加载证书 7572:error:0906D06C:PEMroutines:PEM_read_bio:no start line:.\crypto\pem\pem_lib”.c:703 :期待: 可信证书
  • Saeed/Jan - 这可能是行尾的问题吗?

标签: delphi openssl lockbox-3


【解决方案1】:

方法TOpenSSL_Signatory.LoadKeysFromStream() 期望密钥以...结尾。

-----END RSA PUBLIC KEY-----

此方法要求密钥采用 PEM (SSLeay) 格式。 SSLeay PEM 的 base64 内容标记为 -----BEGIN/END RSA PUBLIC/PRIVATE KEY-----

要生成传统 PEM 格式的密钥,请参阅 ...

您不能简单地通过重命名页眉/页脚来更改格式。您实际上必须通过将正确的选项传递给 OpenSSL 来生成 SSLeay PEM。

【讨论】:

  • 能否请您编写生成 SSLeay PEM 密钥的命令?您提供的链接没有帮助。它们不会以“-----Begin/End RSA Public/Private key-----”结尾。顺便说一句,我使用的是 64 位 OpenSSL 版本 1.0.1f 2014 年 1 月 6 日。我应该使用旧版本吗?
  • 这是一个单独的问题,与 LockBox3 无关。请发布您的问题,作为带有适当 OpenSSL 标记的新问题。也请接受我的回答(勾选复选框)。
  • 这完全是一个密码箱问题,因为我可以毫无问题地在 C# 和 php 中使用生成的密钥。密码箱肯定有问题。
  • 没有。你误会了。 Lockbox3 正确加载 SSLeay 格式的 PEM。这是函数的规范。
猜你喜欢
  • 1970-01-01
  • 2015-05-14
  • 2012-04-05
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 2022-07-26
相关资源
最近更新 更多