2

我正在使用 REST API 来监控 Oracle Cloud Compute VM。

String privateKeyFilename = "/.oci/oci_api_key.pem";
PrivateKey privateKey = loadPrivateKey(privateKeyFilename);
RequestSigner signer = new RequestSigner(apiKey, privateKey);

loadPrivateKey(privateKeyFilename) 方法看起来像这样。

private static PrivateKey loadPrivateKey(String privateKeyFilename) {
    try (InputStream privateKeyStream = Files.newInputStream(Paths.get(SystemUtils.getUserHome().toString() + privateKeyFilename))) {
        return PEM.readPrivateKey(privateKeyStream);
    } catch (InvalidKeySpecException e) {
        throw new RuntimeException("Invalid format for private key");
    } catch (IOException e) {
        throw new RuntimeException("Failed to load private key");
    }
}

oci_api_key.pem 文件(示例)如下所示。

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

xCpRUz2HCa9sd0inFN7BtFO/ZgQDlcieOriynSDGYBYXMO1JWpHtjbiEvt9FbdGk
INKzMQKeDbmG1PqW0Pzflla2IIpyZKEL85s/HpT/EM2qDkKZ15JostR2W1il+u1V
xCpRUz2HCa9sd0inFN7BtFO/ZgQDlcieOriynSDGYBYXMO1JWpHtjbiEvt9FbdGk
SampleSampleSampleSampleSampleSampleSampleSampleSampleSampleSamp
eB04BHrY9RTk2Oe6Bj5j9y0oCOcF0ScTSLRoA2z2PYTY0lacAiv7lq2fWq5/iVb1
KbNqIL7oMBn0oyFr2t9/STiHXU/F5gMbxqCN+A0F+S/Cdua5U5P1icnPF2f/RL32
cUrJM1soChcI1eJIDBlVsvOLOGEM761f5WYXIyMcM0fXi2nLpihrlh9yVU6El0Vq
+vPUlqLfxjlzOZgAjzSjsFSv0MBoSxeFM3zkGQs/OTkqHBVudJ1imoNAQXWRC50k
+OfItUAQmgIpvhQ3hCOXqnMXdgzVphjPS7J39nLSJRKXEKno3t4ahMkaHB6pFRun
hpNdlY3B+9h1iPh4Zxbr+3tIIDadQwV4Ic9JdtS+iUOQ4t/0zFcnMZ33lL81v+Fj
VOpMycKYkJVLVYyrq7gIxDjADR6BGWIJnuTeVyc8NQIBTUkrvYBlJkq5ro3p2jVg
Fh0Er0H1YxfkRTQR4uXWCv5GPIE+uMDHSb+JAvwYSsHQ0Vp+b3VKdkG4p7wgJeNS
7SODuznK2z8YcSiHz/SX7EKbx8kNCOODu/Tw4cav8GS9iUH5j7BRrePMFdQVv+bz
f9l1W429oro2Fxe/RdHzm7zliquiPE+/Wiw+sBIZfJFmwQS69aQOQeDawuHP6xBi
HOwF5Jqr15yTOxwRxmyGtOvj5M5x/uoPa4217fbfmyzc+XNxII4e6r95z3MGCZs0
hVIX4dAu37+i3cnJodWuqOn/it44OiHZbLM3pWGXNWb2BYCub/AUWxOQRfURGDDR
weU25EHFn3Xp5al4T8oHXaZBjJCBlVQ57A5YFX6CBsYRarVF7PJYycvRHa2eEM/y
ZTzDJjZZIaUu0rNPuNrTW7ZSH7mwq4ekCSRRbfyM05RkGWAhNiuXu2YWy7E07bMQ
5IIOdKXzx9FonECowWkAV1vDeesbVjxQTMdO82/dq5FjaErPTNji7RwS3izw9kiX
gcd00iltXKd6rUI8s1EwrFvEpURDcybVTi1D6PAZf25RjEF6MZAeNXKj7qPg3EDs
P4Rmi8y2pn93QHQfJxWI5aLmHP8ZCHrj8XRZFYrijOqM5y2DJBxTqIijd/S9197b
-----END RSA PRIVATE KEY-----

我收到以下异常

Exception in thread "main" java.lang.IllegalArgumentException: java.io.IOException: Invalid DER: length field too big (186)
    at org.tomitribe.auth.signatures.RSA.privateKeyFromPKCS1(RSA.java:63)
    at org.tomitribe.auth.signatures.PEM.readPrivateKey(PEM.java:71)
    at com.zoho.listeners.Signing.loadPrivateKey(Signing.java:132)
    at com.zoho.listeners.Signing.main(Signing.java:86)
Caused by: java.io.IOException: Invalid DER: length field too big (186)
    at org.tomitribe.auth.signatures.RSA$DerParser.getLength(RSA.java:402)
    at org.tomitribe.auth.signatures.RSA$DerParser.read(RSA.java:358)
    at org.tomitribe.auth.signatures.RSA.newRSAPrivateCrtKeySpec(RSA.java:133)
    at org.tomitribe.auth.signatures.RSA.privateKeyFromPKCS1(RSA.java:59)
    ... 3 more

有什么输入吗?

4

1 回答 1

3

看起来它需要 DER 编码证书而不是 PEM 证书。本文的以下摘录应提供一些背景知识:

X509 文件扩展名

我们首先要了解的是每种类型的文件扩展名是什么。关于什么是 DER、PEM、CRT 和 CER 存在很多混淆,许多人错误地认为它们都是可以互换的。虽然在某些情况下有些可以互换,但最佳做法是确定您的证书是如何编码的,然后正确标记它。正确标记的证书将更容易操作。

编码(也用作扩展)

  • .DER = DER 扩展名用于二进制 DER 编码证书。这些文件也可能带有 CER 或 CRT 扩展名。正确的英语用法是“我有一个 DER 编码证书”而不是“我有一个 DER 证书”。
  • .PEM = PEM 扩展名用于不同类型的 X.509v3 文件,这些文件包含以“-- BEGIN ...”行为前缀的 ASCII (Base64) 装甲数据。

通用扩展

  • .CRT = CRT 扩展名用于证书。证书可以编码为二进制 DER 或 ASCII PEM。CER 和 CRT 扩展几乎是同义词。在 *nix 系统中最常见

[...]

这里openssl genrsa -out ~/.oci/oci_api_key.pem 2048建议使用 with without 创建密钥-aes128作为可能的解决方案。

于 2019-03-28T12:55:26.610 回答