我使用以下步骤创建一个新的Java密钥库,其中包含一对私有/公共密钥,供Java(内部)服务器使用TLS。请注意证书是自签名的:
1)使用AES256生成密钥
openssl genrsa -aes256 -out server.key 1024
2)生成CA的证书申请
openssl req -x509 -sha256 -new -key server.key -out server.csr
3)生成自签名到期时间10年
openssl x509 -sha256 -days 3652 -in server.csr -signkey server.key -out selfsigned.crt
4)使用KeyStoreExplorer之类的程序在新的JKS中导入该对(私钥和自签名证书)
这有效,但我想在不使用GUI的情况下实现最后一步。
我知道如何仅导入自签名证书:
// create the keystore and import the public key. THIS WILL NOT IMPORT THE PRIVATE KEY SO THE KEYSTORE CAN'T BE USED ON THE SERVER TO MAKE THE TLS CONNECTION
/usr/java/jdk1.6.0_45/bin/keytool -import -alias myservercert -file server.crt -keystore mykeystore.jks
所以问题是:如何创建Java KeyStore并使用公钥和私钥导入证书而不使用GUI?
答案 0 :(得分:169)
使用您的私钥和公共证书,您需要先创建一个PKCS12密钥库,然后将其转换为JKS。
# Create PKCS12 keystore from private key and public certificate.
openssl pkcs12 -export -name myservercert -in selfsigned.crt -inkey server.key -out keystore.p12
# Convert PKCS12 keystore into a JKS keystore
keytool -importkeystore -destkeystore mykeystore.jks -srckeystore keystore.p12 -srcstoretype pkcs12 -alias myservercert
要验证JKS的内容,可以使用以下命令:
keytool -list -v -keystore mykeystore.jks
如果这不是自签名证书,您可能希望按照此步骤导入导致可信CA证书的证书链。
答案 1 :(得分:0)
密钥库需要密钥库文件。 KeyStore
课程需要FileInputStream
。但是如果你提供null(而不是FileInputStream
实例)和empty keystore will be loaded。创建密钥库后,可以使用keytool
验证其完整性。
以下代码创建一个空密钥库
KeyStore ks2 = KeyStore.getInstance("jks"); ks2.load(null,"".toCharArray()); FileOutputStream out = new FileOutputStream("C:\\mykeytore.keystore"); ks2.store(out, "".toCharArray());
拥有密钥库后,导入证书非常容易。结帐this link查看示例代码。