【问题标题】:Run 'openssl req' command in Java?在 Java 中运行“openssl req”命令?
【发布时间】:2015-06-01 01:40:34
【问题描述】:

似乎 x509 证书请求只能由 Java 无法控制的 Openssl 生成。所以我决定在 Java 中调用 Openssl 命令;我的系统是Windows7-64bit,JDK 1.7,Openssl 1.02二进制分发版。

直接通过 Openssl 命令生成 CSR 请求很好,但是在 Java 中调用相同的命令会报错。

Openssl 命令:

openssl req -new -key bob.pem -out bob.csr -subj /C=CN

Java 代码:

Process p;
String command="openssl req -new -key bob.pem -out bob.csr -subj /C=CN";
Runtime r=Runtime.getRuntime();
p=r.exec(command);

错误信息:

unable to load Private Key
8016:error:0906D06C:PEM routines:PEM_read_bio:no start line:.\crypto\pem\pem_lib.c:701:Expecting: ANY PRIVATE KEY

.pem 确实是 openssl 生成的私钥。请把手给我。谢谢。

bob.pem 是通过这个命令生成的:

openssl genrsa -out bob.pem

-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEA25I5wAAGJIBvQtLXghdCjwDuNTbIQX9ISx4ZRDL5CQl8WU7U
vxEnGxJHiJBPE1aJOXSL12LGgzgsnw7G5MIMsJoGI929H8VaiM+iU96+eA6TE6xu
5DheApLiUwq62fybHg1bnXZlHhXUSIQYhTT2dvYMVXnhKO99siLIcKG8LK3H1JUE
KGKShO+0skiA0f70J8hFSGgeB2VCClMkEgoGslYkYnlKNNP38rEWaQdlQdVZGu4q
8okkRcsHsG0vJRx5G7uateoo8uWwqMhVF1tLEcYAYJhOOInofo6MVyqdZ55i8DTb
IPv80kMqx4tmxDN4Q+yjN6PpgijWIG0fA0GlcQIDAQABAoIBAQDNlxkjweH+g5Oq
Ciln0ceshr6EbQsM6NUUINafmOq9n3gjV0C0tqbbHj6EjDq+bKSIe6wEvKQLcam2
NOvefiPLqCxfoNvYx72BpIjl5waI+3yTSz15y52a41WvU7ipK3FCrlc+FQGRLfda
/vTGpVSxBql9z2UYI0aaaR8s9wNvAHzBbfbGTE0JpmTbviyZipj0y18Dykqt5eUO
Wj1Ox0+0hkub7vbVjRIRBUDdsxvLcPZMwPQwdWOsuTH/3wxe/bqczVPVlbDBDok/
xmwd03pqh0+78I6BP/r9eyxwwwe2L94lf+zsojsIu17WlzH9fGhAxfkixTA8TM8l
L/Y1LAgBAoGBAO4gBAaY4VCcoYcGoDbzOXbRBHgN/gvmtVuakidpwA+RSiO2cqgz
bik0d5sSWLqbbxXta+aQdUwX9ngeWUm2dugZP3umkjUfCvrsic6QxiX7up0M5OYF
ukFMaUL0ukr8g7VIA2JaXheia9gEIMnDTbjebA+J/qIUujqfdOACIQ1RAoGBAOwN
qk3kZajPV/Ja3Ij7mAGa5dPwomFTKfBUwbj8cMDDNK+LsR2SpPh8aaIsoWCUwgCB
O3E3TSXql/DvxcgrvRJ52XNm8hERpoCcJ+ol3VmPL+g2C9btjGb6HglON0hiXKAN
F78cSv59OhBbOqbLzhx06XtlKbaxNigWBkQW3I4hAoGBAJnK9a6pGIRu1OgXQGyd
BBUYA9Hh/50CIUmLeC+aXh/vzzlngX/ez5wvNbxiygmjj8hSseiUjh1aMKX9u98e
yIc4n0amGzHR3c6X7J0L5d3sSedax49ETboUtrs2wgbiNdJkM0NXaAPNs+ctK1wE
FnN6u8IBdwKJbomkKODwnxYxAoGBAK2yzIvuskPK91tWMwv1nwAnXFFdtA9L5AN+
SuL1l36w5fb7IwSw4QYcfpqgnst0C2HVtsjzuahZ/R6FQZOvY7zRvwplSWD4DP58
af6piD0b2VPVWVb5jCRGjo2oaZOxFZmMqNmvVxv3SB+7Eeik9fEIsrpjUZOmyUQs
GMZH0FohAoGBANHXkYWRQKSJp02kmwJ1GZ/6905KnDOY9pjFEXTb657yYXvPb1tp
B8pVBwtsrXb6XT827Dpn3Rf/bitqwWwJuWwSc37C/6AavUHQGo1lm8+m86Imy4XJ
xOOhZIpmJocMSF9TBBYFLvJV+s3/1aXrnFPuc5rrh3A1jWtT/zN+lUON
-----END RSA PRIVATE KEY-----

【问题讨论】:

  • “似乎 x509 证书请求只能由 Openssl 生成,Java 无法控制”一开始是错误的。 Java keytool 可以为已在密钥库中的密钥对生成 CSR。这里的问题似乎是您的 .pem 文件不包含私钥。
  • ProcessBuilder and running OpenSSL command which contains spaces 的可能重复项。另外,我相信你需要-newkey。否则,现有密钥(如果存在bob.pem)格式错误。有关 PEM 格式,请参阅OpenSSL's rsautl cannot load public key created with PEM_write_RSAPublicKey。您应该 cat 密钥 bob.pem 并在问题中提供它。
  • 我认为密钥库与 Java 相关联,这是一个限制。顺便说一句,我试图用密钥库中现有的自签名证书替换另一个证书,但必须选择另一个别名。是否可以用新证书替换自签名证书?谢谢。
  • @frogdn 如果新证书是 CSR 的 CA 签名结果,您应该使用与生成 CSR 时相同的别名。由于您已经在使用 Java 代码,因此不清楚“限制”问题是什么。
  • 第一件事:你刚刚泄露了这个私钥,应该把它扔掉。您应该使用exec(String[]), 而不是exec(String). keytoolopenssl 命令复杂得多。

标签: java openssl


【解决方案1】:

使用exec(String[]) 而不是exec(String) 来调用Openssl 命令。一种安全的方法是在单独的字符串中列出每个参数

【讨论】:

    【解决方案2】:

    您总是可以将 openssl 命令放在 bash 脚本中,然后像这样从您的程序中启动 bash 脚本

    Process bash_script = Runtime.getRuntime().exec("/your/directory/openssl_script.sh");
    

    【讨论】:

      猜你喜欢
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-16
      • 2012-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多