如何仅使用私钥文件创建Java密钥库?

时间:2019-11-07 16:43:40

标签: java keystore private-key

我只有一个私钥作为.key文件,没有其他.crt或ca内容。 我需要创建一个Java密钥库。如何转换?

到目前为止我尝试过的是:
我将.key文件重命名为.pem。
我用openssl在.pem中创建了.p12文件。

最后,我使用此命令创建Java密钥库:

keytool -importkeystore -srckeystore [MY_FILE.p12] -srcstoretype pkcs12
-srcalias [ALIAS_SRC] -destkeystore [MY_KEYSTORE.jks]
-deststoretype jks -deststorepass [PASSWORD_JKS] -destalias [ALIAS_DEST]

要求我输入密码,然后输入错误:

PEM_read_bio:no start line: ...... Expecting: TRUSTED CERTIFICATE

我已经检查了缺少的空格,并且文件以“ -----”开头,并以“ -----”结尾。

有人知道这样做的方法吗?

1 个答案:

答案 0 :(得分:1)

您没有显示所使用的openssl命令,但这可能是错误的,因为您引用的错误来自openssl和 not keytool,因此您的keytool命令可能无法工作

但是,您的目标不明智。 Java KeyStore API旨在存储带有证书(或链)的私钥 ,而keytool和大多数其他程序对于具有以下特征的私钥均无法正常工作或根本无法正常工作:没有证书。当您没有专用私钥的真实证书时,Java中(通常也是OpenSSL)通常的做法是创建一个“虚拟”自签名证书;这并不能像真实证书那样扩展信任,但是可以填补证书状的漏洞,并允许程序至少运行到需要有效信任的程度。

有两种方法可以做到这一点。 OpenSSL更容易,但是不编程,因此不是真正的主题:

openssl req -new -x509 -inkey privkey.pem [-days N] [-subj name] -out dummy.pem
# -subj name has the form /attr=value/attr=value/...
# where commonly used attrs are C (Country), ST (State/Province), 
# L (Locality), O (Organization), OU (Org Unit), CN (CommonName).
# if you omit -subj name you will be prompted for these (assuming normal config)
# -days defaults to 30
# if you modify the default config file or create and specify your own 
# you can configure a variety of X.509 extensions, but for a dummy cert 
# this is only rarely helpful, depending how you (will) use it

openssl pkcs12 -export -in dummy.pem -inkey privkey.pem -out keystore.p12 [-name alias]

# Java can use the PKCS12, but if you really want JKS for some reason
keytool -importkeystore -srckeystore keystore.p12 -destkeystore keystore.jks -deststoretype JKS \
  [-srcstorepass p] [-deststorepass p] [-srcalias x [-destalias y]]
# most j8 can read PKCS12 without specifying it (due to a compatibility setting) 
# and all j9 up autodetect the source type;
# j8 defaults dest type to JKS but j9 up do not

或者,您可以使用Java对此进行编程。 OOTB Java不会直接处理密钥的PEM格式,更重要的是仅处理OpenSSL所使用的八种格式之一,因此您应避免告诉我们您拥有哪种格式。同样,OOTB Java也没有记录证明的创建证书的方法。 keytool使用了内部类,但是在j8之后,使用内部类变得越来越困难。 BouncyCastle(bcpkix + bcprov)解决了这两个问题,该问题支持OpenSSL PEM密钥并生成X.509证书。

要读取OpenSSL的“传统”格式的未加密私钥文件,请参见
Read RSA private key of format PKCS1 in JAVA
How to Load RSA Private Key From File
Getting RSA private key from PEM BASE64 Encoded private key file

或传统加密的
Get a PrivateKey from a RSA .pem file
Decrypting an OpenSSL PEM Encoded RSA private key with Java?

用于PKCS8加密的
Reading PKCS8 in PEM format: Cannot find provider
Decrypt PEM private (RSA) key with Bouncy Castle
并且由于您实际上还需要公钥,因此哪种“传统”格式可以为您提供(如PEMKeyPair-> KeyPair),但PKCS8却没有
Bouncy Castle - how to get Public Key Info from JceOpenSSLPKCS8DecryptorProviderBuilder(我的)

用于使用Bouncy生成自签名证书
Self signed X509 Certificate with Bouncy Castle in Java
Generating X509 Certificate using Bouncy Castle Java(但不要使用SHA1)
也许Generating X509Certificate using bouncycastle X509v3CertificateBuilder