我需要使用 java 11 生成一个 java 密钥库,并且能够在 java 8 和 java 11 中使用它。我使用格式 PKCS12。由于某种原因,当我使用 java 11 中的 keytool 生成它时,java 8 中的 keytool 无法打开它。
使用 java 11 生成
(java 11)$ keytool -genkeypair -keyalg RSA -noprompt -alias key -dname "CN=hostname, OU=XX, O=XX, L=YY, S=CZ, C=CZ" -keystore file.p12 -storepass password -keypass password -deststoretype pkcs12
Run Code Online (Sandbox Code Playgroud)
对于 java 11,密钥库运行良好。但如果我尝试使用 java 8 读取它
(java 8)$ keytool -list -keystore file.p12
keytool error: java.io.IOException: Invalid keystore format
Run Code Online (Sandbox Code Playgroud)
为什么会发生这种情况?我认为PKCS12是一种标准化格式,应该是通用的。但由于某种原因,它甚至在 java 版本之间也不起作用。
我能够通过使用 switch 将 keytool 切换到传统生成来解决这个问题-J-Dkeystore.pkcs12.legacy。
我想更改我的项目以在代码中生成密钥库。就像是:
KeyStore …Run Code Online (Sandbox Code Playgroud) keytool从 OpenJDK16 创建的 PKCS12 密钥库文件无法从 Java 8、9、10 和 11 中读取。这是错误吗?如何创建适用于 Java 8 的 PKCS12 密钥库?
我构建了一个 Maven 项目,该项目生成一个可执行 JAR 文件,该文件必须在从版本 8 到版本 16 的任何 JRE 上运行。该 JAR 文件生成一个 HTTPS 服务器(使用com.sun.net.httpserver.HttpsServer)。
在构建期间,我使用keytool生成密钥对并将其存储在捆绑在 JAR 中的 PKCS12 密钥库中(实际上,我使用的是keytool-maven-plugin):
$ /path/to/jdk16/bin/keytool -genkeypair -keystore /tmp/keystore.p12 -storepass password -storetype PKCS12 -alias https -dname "CN=localhost, OU=My HTTP Server, O=Sentry Software, C=FR" -keypass password -validity 3650 -keyalg RSA -sigalg SHA256withRSA
Run Code Online (Sandbox Code Playgroud)
Java 代码使用这个自动生成的密钥库来启动 HTTPS 服务器:
// initialize the HTTPS …Run Code Online (Sandbox Code Playgroud) 在我的一台 AWS EC2 服务器中,我部署了三项服务 [Auth、orders、Security]。我为三个服务配置了 SSL,三个服务的 SSL 是相同的,身份验证命令服务在进行一些调整后工作正常,但安全服务有“java.lang.IllegalArgumentException:parseAlgParameters failed:ObjectIdentifier() - 数据不是” t 对象 ID (tag = 48)' 问题。我的服务器有以下Java 版本: openjdk 版本“ 1.8.0_302 ” OpenJDK 运行时环境(版本 1.8.0_302-b08) OpenJDK 64 位服务器 VM(版本 25.302-b08,混合模式) 我从 Windows PC 部署了 jar 文件,对于我的 Windows PC,所有三个服务都工作正常。但这是我的 AWS Centos 服务器的问题。
最初,我使用 Openssl3 将 .crt 文件转换为 .p12,当时我的所有三个服务都存在上述问题。因此将我的 OpenSSL 降级到 1.1.1 版本。然后将我的 jar 构建到 AWS。这样“Auth”和“Order”服务就开始工作了。但我的安全服务仍然存在问题。下面是用于身份验证的 pom.xml。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent> …Run Code Online (Sandbox Code Playgroud) ' server.ssl.key-store = src/main/resources/laitadmin.p12 server.ssl.key-alias= 1 server.ssl.keyStoreType= PKCS12'
' at sun.security.util.ObjectIdentifier.<init>(ObjectIdentifier.java:257) ~[na:1.8.0_251]'
Run Code Online (Sandbox Code Playgroud)