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

How to create a java keystore only with a private key file?

我只有一个私钥作为 .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

我已经检查过是否缺少空格,并且文件以“-----”开头并以它结尾。

有人知道怎么做吗?

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

但是,你的目标是不明智的。 Java KeyStore API 旨在存储私钥 及其证书(或链),并且 keytool 和大多数其他程序都赢了对于没有证书的私钥,它可以正常工作或根本无法工作。 Java 中的通常做法——主要是在 OpenSSL 中也是如此——当你没有私钥的真实证书时, 创建一个 'dummy' 自签名证书;这不像真正的证书那样扩展信任,但它填补了证书形状的漏洞并允许程序至少在需要有效信任的情况下工作。

有两种方法可以做到这一点。 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用的internal类,但是j8以后越来越难用internal类了。这两个问题都由 BouncyCastle (bcpkix+bcprov) 解决,它支持 OpenSSL PEM 密钥并生成 X.509 证书等。

要读取 OpenSSL 的 'traditional' 格式的未加密私钥文件,请参阅

How to Load RSA Private Key From File
Getting RSA private key from PEM BASE64 Encoded private key file

或传统加密

对于 PKCS8 加密


并且由于您实际上还需要公钥,'traditional' 格式为您提供(如 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