【发布时间】:2018-01-31 22:10:56
【问题描述】:
我为 HTTPS 代理编写了一个配置系统。在推送配置文件并上传证书和私钥之前,我会进行一些验证。我发现了一个案例,当 Java 使用 PemReader OpenSSL 验证私钥时,不会验证同一个文件。这会导致 httpd 服务器停止工作,因为它得到了错误的密钥。
我已经做了一个测试来重现它:
使用 openssl 我有一个错误
$ openssl rsa -in wrong_key_test.key -check
unable to load Private Key
140736227525512:error:0906D064:PEM routines:PEM_read_bio:bad base64 decode:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22/libressl/crypto/pem/pem_lib.c:828:
但是当我运行这个 junit 测试时一切正常。我的期望是有一个例外,你知道吗?是不是我的验证错了?
这就是君子
package eu.ssl.test.validator;
import static org.junit.Assert.assertNotEquals;
import java.io.File;
import java.io.IOException;
import java.io.StringReader;
import java.security.KeyFactory;
import java.security.Security;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import org.apache.commons.io.FileUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.io.pem.PemObject;
import org.bouncycastle.util.io.pem.PemReader;
import org.junit.Before;
import org.junit.Test;
public class PemReaderTest {
private String privateKey;
@Before
public void setUp() throws IOException {
this.privateKey = FileUtils.readFileToString(new File("./wrong_key_test.key"));
}
@Test
public void test() throws Exception {
Security.addProvider(new BouncyCastleProvider());
PemReader pemReader = new PemReader(new StringReader(this.privateKey));
PemObject pemObject;
try {
pemObject = pemReader.readPemObject();
} finally {
pemReader.close();
}
KeyFactory factory = KeyFactory.getInstance("RSA");
byte[] content = pemObject.getContent();
PKCS8EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(content);
RSAPrivateKey privateKey = (RSAPrivateKey) factory.generatePrivate(privKeySpec);
String privateKeyModulus = privateKey.getModulus().toString();
assertNotEquals("", privateKeyModulus);
}
}
这是PK
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA2lKPRVgFN8TfOhex+IJ6YMKUKeZgHZUGsJpHo/ipeYVeWUGa
jKVANloG3IX/I5Zo8FZ6R6BVCEisaGqH35HwktZ+vdrGzuRNGUERnZiy1nXzKDmV
CGdBY/PxErvvEyygHPd8X9HNGagjOlKLrPGyN2dAp6sMpljNevSzbXYxCX0KOm9z
ox40c2qdXFqa26mUWKVVZ6TdYSIeV1s/n3oRvAA3fbFAdTg4xM++g/V8LXyipDK4
gEqNPwJzzvE6u0P0u+MFCEgogbVZLVelLq6OzTU27pigwourVAf8eWyRYX8TOz2E
A1HDDKy7dSwTaIz7TPXfYqwe+bwLEl5vX/dQ6QIDAQABAoIBADBPcJChp5XtpI/Q
Snt5M+dRZ0PWTJJ/NZnCqfOoxKe1UWli0PYqYwkj5rzJkemoENSN7kUHP4mzuyLn
3+UjAB8eA7GzRabmcgESmvlKnthCBWpzQ302jAu4ITJKD98oUs3WHdl+LWpuAE2Z
knrUiOElofL4MLZmlCGPIF0qeDNm5QkLanMyzu7bduo8etwn2NNBHxDdc4eW2c2l
d4m1INObx4ZyAkoBWksKN8PsDH2I3FZJFvkgve1fFhff0U+CtertfOwlFoAmDv9j
FtJq2Y6H2p+Q1eyRlh0OLAK7qZ5MhgBOMe3PNxeJWa3S4Z/gevihweclmK/F9e9T
/V5JVgECgYEA/W6eKy2cgkajjgBPu4tsW8XTo9lyWnWLYUY2PacgfhT7zkZy4s4g
cfP1zjjGXZaDYgo7MPoBM0xFLYbrWQ7j8GgA18uTHZs2yjYya1a6iyi8RMdQpRzd
jzCDfHNeJ2YU1apVuqs8r99sskkg/S2gd31XCuKwYTgCVgi4GmczUiECgYEA3Ije
0F/Ojb7dV35w0K+NK6rl/RL42cDcy5qjEAlI5zUcbxubjy+gHwCBM6dwx8frIeaX
BG512loqoALKXvLzSUAWbnPsvkQCOkcBPvi48tkWh3h1QO1S1U38KrWr58+9WCLs
5tL14l8O8JQmNg/0jLA4k3OHhL/gy6VQGolLNckCgYB5T9kgnA2+AqhJ0fZYtO2i
pHihhvYJPRkB8EUIkBaqo8rBO9HEpZy8T2ZLV7wEkobDiFg7IoEumATJPTss/0a3
DmHQ6l66nlDEzNqnrPVQpagxWCNPVhjscPGPwf3A6Ely2b19xHghS9bRJNZIuu2E
JRhkWozJjLD5k+Tkpp/XYQKBgDiv/gY1+lQ5MZAh8kHSPklxPnkU/V6L0rWLZErk
+BZmco6k3BGsPk55xLxQWA8idnBaY4tCEY01DCvhS7+oV50Gmj1+Eua9eI0eX1We
fXv/DWl5LzqnRlmKGD2qQSvvHE6he5/Brm6n3KE+k6vl4gif64sLcVRQNipirfqE
PA7xAoGBAJ8wfxLaj86/f+JU2jAd34HYZpNQ1mEb2TqZkrLqk78VXaKhyZjw2IGe
Pt5ROLZNIQbVWcTSMD2TrDsZGDY5zq5hXnRXb2h1Q1PHbbixl0s3TnDZ0JGxxrLQ
iAc48q1o36aAYVSyY/JLR3Q9Su97+i55Ud5rDYW5ThLcACsjxB/mL
-----END RSA PRIVATE KEY-----
提前致谢 尼古拉
【问题讨论】:
-
被测试的私钥的来源是什么?
-
当我在你的私钥上运行你的代码时,它会从
RSAPrivateKey privateKey = (RSAPrivateKey) factory.generatePrivate(privKeySpec);行抛出一个异常
标签: java security bouncycastle private-key pem