【发布时间】:2015-09-03 12:22:17
【问题描述】:
我需要在服务器(一个 XML 硬件设备)上创建并安装一个自签名证书,以对 Java 客户端/应用程序进行 SSL 身份验证,通过其接口配置,可以设置 keystores,即.jks。出于显而易见的原因,我只需要此设置用于测试目的而不是生产。以下是我创建 keystore(PKCS12 类型)的方式:
1) 生成私钥(对)
$> openssl genrsa -des3 -out private.key 1024
2) 生成证书请求(需要这样做吗?)——我只将值设置为 CN
$> openssl req -new -key private.key -out request.csr
3) 创建自签名证书
$> openssl x509 -req -days 365 -in request.csr -signkey private.key -out cert.crt
4) 创建PKCS12 密钥库
$> openssl pkcs12 -export -in cert.crt -inkey private.key -out keystore.p12
5) 创建客户端JKS
$> keytool -importkeystore -srckeystore keystore.p12 -srcstoretype pkcs12 -srcalias myalias -destkeystore client.jks -deststoretype jks -deststorepass <same pass as private key> -destalias myalias
当我在服务器/设备上安装 keystore.p12,在客户端 Java 应用程序上安装 client.jks 并发出请求时,我收到以下错误:
javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate
我是否从根本上遗漏了有关证书和 SSL 身份验证的内容?
【问题讨论】:
-
您可以使用 keytool 完成所有操作。这里根本不需要 OpenSSL。
-
您似乎对服务器(keystore.p12)和您的 Java 客户端(client.jks,显然也用作信任库)使用相同的密钥+自己的证书;这通常是一个坏主意,但可以接受测试。您不识别服务器。但是使用 p12 配置其密钥+自己的证书(密钥库)的服务器软件可以单独配置其受信任的证书(信任库)。这可能是一个不同的文件,可能采用不同的格式,或者它可能是隐含的,如 Windows“证书”存储或 MacOSX 钥匙串。寻找一种将您的证书(不是密钥或 p12,只是证书)添加到服务器信任库的方法。
-
@dave_thompson_085 keystore 与 truststore 分离,你是说我需要创建一个 client keystore(私有key + 自签名证书),即client.jks,提取其证书,并最终将其添加到server的truststore?可以用server的p12顺便给它加上client的认证——更像是用server i> 的 p12 既是 truststore 又是 keystore?并且 server 的 keystore 是否应该拥有自己的私钥+证书,或者我只能添加 client 的证书到服务器的空TS/KS?
-
This post 包含一个脚本,该脚本使用 keytool 创建证书颁发机构、服务器和客户端证书以及信任库。
标签: java ssl certificate keystore keytool