【发布时间】:2019-11-14 13:08:49
【问题描述】:
我有公钥和私钥(PKCS#1:即有“BEGIN RSA PRIVATE KEY”)作为单独的字符串输入。 这些键是使用以下命令创建的:
openssl req -new -x509 -keyout ca-key.pem -out ca-cert.pem -days 365 -passout pass:abcd123 -subj "/C=IN/ST=KAD/L=CAT/O=MIN/OU=OPQ/CN=*.xyz.com/emailAddress=xxx.xxxx@xyz.com"
openssl genrsa -out client_private.key 2048
openssl req -new -sha256 -key client_private.key -subj "/C=IN/ST=KAD/L=CAT/O=MIN/OU=OPQ/CN=client.xyx.com" -out client.csr
openssl x509 -req -in client.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client.crt -days 365 -sha256
openssl x509 -in client.crt -out client.pem -outform PEM
client.csr 的内容作为公钥字符串提供 并且 client_private.key 的内容作为私钥字符串提供
现在我必须创建 java 密钥库,添加这些密钥并实用地导出为 JKS 文件。 我浏览了多个链接并尝试了充气城堡示例,但我遇到了错误。
javax.net.ssl.SSLProtocolException: Handshake message sequence violation, 2
我正在编写一个启用 SSL 和客户端身份验证的 kafka 客户端,并且设置了服务器将所有必需的参数。 创建信任库和密钥库命令行工作正常。 但是使用 java 程序我无法进行客户端身份验证(SSL 工作正常)。 以下是代码片段:
public void initClientAuthStore(String certString, String keyString)
throws GeneralSecurityException, IOException {
clientAuthStore = KeyStore.getInstance(getType());
clientAuthStore.load(null, getPassword().toCharArray());
Certificate clientCert = CertificateHandler.getCertificate(certString);
Certificate[] certificateChain = {trustStoreCertificate, clientCert};
log.debug("initClientAuthStore: Certificate is created");
// keyString.getBytes(StandardCharsets.UTF_8);
// clientAuthStore.setKeyEntry(
// keyStoreAlias, getPrivateKey(keyString), getPassword().toCharArray(), certificate);
PrivateKey privateKey = getPrivateKey(keyString);
clientAuthStore.setKeyEntry(
keyStoreAlias,
privateKey,
getPassword().toCharArray(),
certificateChain);
log.debug("initClientAuthStore: setting certificate and private key is success.");
}
public PrivateKey getPrivateKey(String key) throws IOException {
PemObject privateKeyObject;
PemReader pemReader =
new PemReader(
new InputStreamReader(
new ByteArrayInputStream(key.getBytes(Charset.forName("UTF-8"))),
StandardCharsets.UTF_8));
privateKeyObject = pemReader.readPemObject();
RSAPrivateCrtKeyParameters privateKeyParameter;
if (privateKeyObject.getType().endsWith("RSA PRIVATE KEY")) {
log.info("PRIVATE KEY TYPE: pkcs#1");
// PKCS#1 key
RSAPrivateKey rsa = RSAPrivateKey.getInstance(privateKeyObject.getContent());
privateKeyParameter =
new RSAPrivateCrtKeyParameters(
rsa.getModulus(),
rsa.getPublicExponent(),
rsa.getPrivateExponent(),
rsa.getPrime1(),
rsa.getPrime2(),
rsa.getExponent1(),
rsa.getExponent2(),
rsa.getCoefficient());
} else if (privateKeyObject.getType().endsWith("PRIVATE KEY")) {
log.info("PRIVATE KEY TYPE: pkcs#8");
// PKCS#8 key
privateKeyParameter =
(RSAPrivateCrtKeyParameters) PrivateKeyFactory.createKey(privateKeyObject.getContent());
} else {
throw new RuntimeException("Unsupported key type: " + privateKeyObject.getType());
}
JcaPEMKeyConverter jcaPemKeyConverter = new JcaPEMKeyConverter();
PrivateKey privateKey =
jcaPemKeyConverter.getPrivateKey(
PrivateKeyInfoFactory.createPrivateKeyInfo(privateKeyParameter));
log.info("PRIVATE KEY generated. {}", privateKey.getFormat());
return privateKey;
}
出现以下错误:
javax.net.ssl.SSLProtocolException: Handshake message sequence violation, 2
不确定出了什么问题,以及是否缺少任何编码/解码等。 我将 PKCS#1 私钥作为字符串输入,我必须使用充气城堡转换为 PKCS#8 并生成私钥并添加到存储中。 注意:私钥是client_private.key的内容
【问题讨论】:
标签: java keystore private-key java-10 pkcs#1