将新证书导入旧密钥库时出现密钥错误 - java.io.IOException: ObjectIdentifier() -- 数据不是对象 ID (tag = 48)

Key error when I import new certificate to old keystore - java.io.IOException: ObjectIdentifier() -- data isn't an object ID (tag = 48)

所以我有这个旧的密钥库 (mykeystore.p12),它的证书随时都会过期 + 我需要保留的其他一些密钥。

然后我从我的 CA 那里得到了这个新的 certificate.txt + privatekey.txt + bundle.txt。据我所知,我需要将所有这些文件导入到一个新的密钥库中,然后将新的密钥库导入到我的旧密钥库中。 (我尝试立即将它导入我的旧密钥库,但它覆盖了旧存储)。

因此,为了创建新的密钥库,我这样做了:

openssl pkcs12 -export -in certificate.txt -inkey privatekey.txt -out newkeys.p12 -name com -CAfile bundle.txt -caname root

如果我尝试使用 newkeys.p12,它可以工作,但它丢失了我仍然需要的所有旧密钥,所以然后将它导入我当前的旧密钥库(工作正常但证书过期)我这样做:

keytool -importkeystore -deststorepass PASSWORD -destkeystore mykeystore.p12 -srckeystore newkeys.p12 -srcstoretype PKCS12 -srcstorepass PASSWORD -alias com

但随后一切都停止工作,我什至无法启动我的网络应用程序,因为我收到此错误:

at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:934) ~[spring-context-5.3.4.jar!/:5.3.4]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:585) ~[spring-context-5.3.4.jar!/:5.3.4]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.3.jar!/:2.4.3]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) [spring-boot-2.4.3.jar!/:2.4.3]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-2.4.3.jar!/:2.4.3]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) [spring-boot-2.4.3.jar!/:2.4.3]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) [spring-boot-2.4.3.jar!/:2.4.3]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) [spring-boot-2.4.3.jar!/:2.4.3]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) [spring-boot-2.4.3.jar!/:2.4.3]
        at com.aquaass.aquadb.AquaassApplication.main(AquaassApplication.java:17) [classes!/:na]
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_275]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_275]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_275]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_275]
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) [aquadb.jar:na]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:107) [aquadb.jar:na]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) [aquadb.jar:na]
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:88) [aquadb.jar:na]
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Jetty server
        at org.springframework.boot.web.embedded.jetty.JettyWebServer.start(JettyWebServer.java:194) ~[spring-boot-2.4.3.jar!/:2.4.3]
        at org.springframework.boot.web.servlet.context.WebServerStartStopLifecycle.start(WebServerStartStopLifecycle.java:43) ~[spring-boot-2.4.3.jar!/:2.4.3]
        at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) ~[spring-context-5.3.4.jar!/:5.3.4]
        ... 23 common frames omitted
Caused by: java.security.UnrecoverableKeyException: Private key not stored as PKCS#8 EncryptedPrivateKeyInfo: java.io.IOException: ObjectIdentifier() -- data isn't an object ID (tag = 48)
        at sun.security.pkcs12.PKCS12KeyStore.engineGetKey(PKCS12KeyStore.java:338) ~[na:1.8.0_275]
        at java.security.KeyStore.getKey(KeyStore.java:1023) ~[na:1.8.0_275]
        at sun.security.ssl.SunX509KeyManagerImpl.<init>(SunX509KeyManagerImpl.java:145) ~[na:1.8.0_275]
        at sun.security.ssl.KeyManagerFactoryImpl$SunX509.engineInit(KeyManagerFactoryImpl.java:70) ~[na:1.8.0_275]
        at javax.net.ssl.KeyManagerFactory.init(KeyManagerFactory.java:256) ~[na:1.8.0_275]
        at org.eclipse.jetty.util.ssl.SslContextFactory.getKeyManagers(SslContextFactory.java:1243) ~[jetty-util-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.eclipse.jetty.util.ssl.SslContextFactory$Server.getKeyManagers(SslContextFactory.java:2267) ~[jetty-util-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.eclipse.jetty.util.ssl.SslContextFactory.load(SslContextFactory.java:372) ~[jetty-util-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.eclipse.jetty.util.ssl.SslContextFactory.doStart(SslContextFactory.java:243) ~[jetty-util-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73) ~[jetty-util-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169) ~[jetty-util-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:117) ~[jetty-util-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.eclipse.jetty.server.SslConnectionFactory.doStart(SslConnectionFactory.java:97) ~[jetty-server-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73) ~[jetty-util-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169) ~[jetty-util-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:117) ~[jetty-util-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.eclipse.jetty.server.AbstractConnector.doStart(AbstractConnector.java:321) ~[jetty-server-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.eclipse.jetty.server.AbstractNetworkConnector.doStart(AbstractNetworkConnector.java:81) ~[jetty-server-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.eclipse.jetty.server.ServerConnector.doStart(ServerConnector.java:234) ~[jetty-server-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.springframework.boot.web.embedded.jetty.SslServerCustomizer$SslValidatingServerConnector.doStart(SslServerCustomizer.java:265) ~[spring-boot-2.4.3.jar!/:2.4.3]
        at org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:73) ~[jetty-util-9.4.36.v20210114.jar!/:9.4.36.v20210114]
        at org.springframework.boot.web.embedded.jetty.JettyWebServer.start(JettyWebServer.java:174) ~[spring-boot-2.4.3.jar!/:2.4.3]
        ... 25 common frames omitted
Caused by: java.io.IOException: ObjectIdentifier() -- data isn't an object ID (tag = 48)
        at sun.security.util.ObjectIdentifier.<init>(ObjectIdentifier.java:285) ~[na:1.8.0_275]
        at sun.security.util.DerInputStream.getOID(DerInputStream.java:320) ~[na:1.8.0_275]
        at com.sun.crypto.provider.PBES2Parameters.engineInit(PBES2Parameters.java:267) ~[sunjce_provider.jar:1.8.0_275]
        at java.security.AlgorithmParameters.init(AlgorithmParameters.java:293) ~[na:1.8.0_275]
        at sun.security.x509.AlgorithmId.decodeParams(AlgorithmId.java:137) ~[na:1.8.0_275]
        at sun.security.x509.AlgorithmId.<init>(AlgorithmId.java:119) ~[na:1.8.0_275]
        at sun.security.x509.AlgorithmId.parse(AlgorithmId.java:393) ~[na:1.8.0_275]
        at sun.security.pkcs.EncryptedPrivateKeyInfo.<init>(EncryptedPrivateKeyInfo.java:80) ~[na:1.8.0_275]
        at sun.security.pkcs12.PKCS12KeyStore.engineGetKey(PKCS12KeyStore.java:327) ~[na:1.8.0_275]
        ... 46 common frames omitted

起初我认为私钥之间可能存在一些冲突,它们采用不同的格式,因此存在一些冲突或其他问题(因为它们只有在同一个密钥库中时才不起作用) ,但它们似乎都是 RSA 2048。所以现在我一定认为我导入错误,但根据我的在线研究,这是这样做的,所以我很困惑,有点急于解决这个问题。我的 CA 足够好,可以生成一个新证书,但仍然是同样的问题,所以我倾向于导入出错或其他问题。

如果我将新密钥库导入到我的旧密钥库或相反,似乎都没有关系,仍然是同样的问题。为什么会出现此错误?请帮忙!

编辑 1: 现在我什至尝试在我自己的工作密钥库中生成一个新的密钥对(99% 确定我做的和去年完全一样)然后导出一个签名请求(.csr) 我已经签名了。然后我将新签名的证书和捆绑包导入到该密钥对别名,但我仍然遇到同样的错误!

Command for generating new keypair and cert:
keytool -genkey -alias com -keystore mykeystore.p12 -storetype PKCS12 -keyalg RSA -storepass PASSWORD -validity 366 -keysize 2048

Command for exporting csr:
keytool –keystore mykeystore.p12 –certreq –alias com –keyalg rsa –file sign-request.csr

编辑 2: 不同阶段的密钥库信息:

mykeystore.p12 -info:
MAC Iteration 100000
MAC verified OK
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 50000
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 50000
Certificate bag
Certificate bag
Certificate bag
Certificate bag


newkey.p12 -info:
MAC Iteration 2048
MAC verified OK
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 2048
Certificate bag
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048


merged mykeystore.p12 -info:
MAC Iteration 100000
MAC verified OK
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 50000
Shrouded Keybag: PBES2, PBKDF2, AES-256-CBC, Iteration 10000, PRF hmacWithSHA256
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 50000
Certificate bag
Certificate bag
Certificate bag
Certificate bag
Certificate bag

And this is the original keystore (from edit 1) where I created the keys
+ csr and imported signed cert (I thought I generated the keys the same 
way as last year but it appears maybe not):

MAC Iteration 100000
MAC verified OK
PKCS7 Data
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 2048
Shrouded Keybag: pbeWithSHA1And3-KeyTripleDES-CBC, Iteration 50000
Shrouded Keybag: PBES2, PBKDF2, AES-256-CBC, Iteration 10000, PRF hmacWithSHA256
PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 50000
Certificate bag
Certificate bag
Certificate bag
Certificate bag
Certificate bag
Certificate bag
Certificate bag
Certificate bag

编辑 3:

java version "1.8.0_241"
Java(TM) SE Runtime Environment (build 1.8.0_241-b07)
Java HotSpot(TM) 64-Bit Server VM (build 25.241-b07, mixed mode)

好的,它终于发展到您在 Windows 上,并试图移动和更改已安装的 Java 的部分内容。由于您显然有更新程序,我假设您使用了 Oracle 可执行安装程序(用于 JRE,或用于包含 'public' JRE 的 JDK),而不是 tgz 'installer'(实际上只是一个存档)对于 JRE 或 Server-JRE。

不支持复制 Java 的片段,尤其是 Windows。 Java 像 keytool rmid javac jar jlink jconsole 这样的实用程序在 Windows 上作为 .exe 文件提供,但它们不包含实际功能,它们只是加载的存根和 运行 Java 执行实际功能的代码,至少在 Windows 上,这段代码有时可能不在同一目录中而是通过注册表找到,注册表记录了安装程序放置它,而不是您所做的任何手动更改。

我怀疑 Java 更新程序(它不是 Windows 的一部分)至少尝试安装 8u301 或更高版本的更新,因此,你现在 运行 宁肯一种科学怪人 - Java 至少有两个不同版本的零件 ,这基本上不可能准确预测或了解它在做什么。 您可能会查看控制面板/程序和功能(又名 appwiz.cpl)以查看 记录的 已安装的内容,但如果您手动更改了内容,则此记录可能不正确/完整。

我认为你有 4 个选择:

  • 将本机恢复到8u301以下的Java单正版。考虑到你模糊的描述,我唯一有信心的方法是删除你现在拥有的一切,然后从头开始。 (IIRC 你实际上不能从 .exe 安装程序中排除更新程序,但你可以禁用它,以防止它让你再次陷入同样的​​混乱。或者可能使用一个没有 更新程序。)如果您在使用标准安装的Java时遇到问题,您可能想询问that;我没有,而且我看到很少有其他人提出问题,并且考虑到关于 Java 其他方面的许多问题,这强烈表明标准安装适用于许多人。

  • 使用另一台拥有或获得低于 8u301 的正确版本的机器。 运行安装应用程序的机器显然有 8u275,这可能是一个 OpenJDK 版本,因为除了 271 之外似乎没有 Oracle 27x 版​​本的记录;也许你可以使用它。在 Win 10 up 上,你可以使用 WSL,它实际上是一个(小的,方便的)虚拟机(如果你不想保留它可以在之后删除)。

  • 如果可以接受非标准和稍低的安全性,请使用 JKS 格式而不是 PKCS12。 Java 对 JKS 的支持没有像 PKCS12 那样改变,所以即使是混合 Java 也应该产生可用的 JKS。

  • 将 app-运行ning 机器(或环境,例如容器)升级到 8u301 或更高版本——甚至可能是 11 或 17,但 [=74= 可能存在问题] 转向模块化 Java —— 因此它可以处理 PBES2。这是最好的长期解决方案; Java 正在顺应行业趋势,虽然不一致,但会转向更好的安全性,如果你坚持过去,你最终(可能会突然)遇到越来越多的此类问题。