gpt4 book ai didi

java - 转换 PEM 证书以在 JAVA Spring Framework 中使用

转载 作者:太空宇宙 更新时间:2023-11-03 13:50:20 24 4
gpt4 key购买 nike

我有一个在 Ubuntu 16.04.3 服务器和开发环境中运行的 Web 应用程序,我有一个在 Apache2.0.48 下生成和配置的自签名 X509 证书。这一切都很好。

我在构建脚本中用于生成 X509 的示例命令如下:

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /var/www/ssl/selfSigned.key -out /var/www/ssl/selfSigned.crt -subj "/C=US/ST=California/L=Somewhere/O=SomeGroup/OU=SomeOU/CN=192.168.0.150"

证书问题

我最近在我的应用程序中引入了一个第 3 方 JAVA 应用程序(显然是 Spring 框架),并且我一直在努力将它集成到我的应用程序中。他们的支持团队在让事情在 HTTP 环境中工作方面表现出色,并指导我使用 this link 使用自签名 X509 在 HTTPS 下设置 Spring 应用程序。

我用如下更改更新了我的 application.properties 文件:

server.port=8181
security.require-ssl=true
server.ssl.key-store-type=PKCS12
server.ssl.key-store=/var/www/secure/ssl/keystore.p12
server.ssl.key-store-password=123456
server.ssl.key-alias=server1

使用简单的导入命令(按照链接上的 1.b)

keytool -import -keystore /var/www/ssl/keystore.p12 -storepass 123456 -noprompt -alias server1 -file /var/www/ssl/self-signed.crt

证书似乎已成功插入到 keystore 中,但是当我重新启动第 3 方服务以读取新参数时,我得到了这个

Jun 15 19:32:08 ubuntu java[7016]: ***************************
Jun 15 19:32:08 ubuntu java[7016]: APPLICATION FAILED TO START
Jun 15 19:32:08 ubuntu java[7016]: ***************************
Jun 15 19:32:08 ubuntu java[7016]: Description:
Jun 15 19:32:08 ubuntu java[7016]: The Tomcat connector configured to listen on port 8181 failed to start. The port may already be in use or the connector may be misconfigured.
Jun 15 19:32:08 ubuntu java[7016]: Action:
Jun 15 19:32:08 ubuntu java[7016]: Verify the connector's configuration, identify and stop any process that's listening on port 8181, or configure this application to listen on another por
Jun 15 19:32:08 ubuntu systemd[1]: 3ps.service: Main process exited, code=exited, status=1/FAILURE
Jun 15 19:32:08 ubuntu systemd[1]: 3ps.service: Unit entered failed state.
Jun 15 19:32:08 ubuntu systemd[1]: 3ps.service: Failed with result 'exit-code'.

我想知道它是否是证书,所以我决定使用 keytool 生成证书而不是 openssl(注意使用我更新我的 application.properties 以使用的测试 keystore ):

keytool -genkeypair -alias server1 -keyalg RSA -keysize 2048 -keystore /var/www/secure/ssl/test.p12 -storetype PKCS12 -validity 3650

当我使用它时,服务至少会启动(即使应用程序没有按预期工作)所以我只能假设证书需要转换。

谷歌搜索显示将我现有的证书从 PEM(我假设是 PKCS10 格式,因为我使用的是“req”?)转换为 PKCS12 相当简单,所以我尝试使用以下命令:

openssl pkcs12 -export -out certificate.pfx -inkey self-signed.key -in self-signed.crt

(我将导出密码留空,以免在服务重启时继续输入)。然后我获取我的新 PKCS12 证书并导入它(也注意到一个新的 keystore ):

keytool -import -keystore test2.p12 -storepass 123456 -noprompt -alias server1 -file certificate.pfx

但是该命令失败并出现 keytool 错误:java.lang.Exception:输入不是 X.509 证书

我也试过

openssl crl2pkcs7 -nocrl -certfile self-signed.crt -out self-signed.p7b
keytool -import -keystore test.p12 -storepass 123456 -noprompt -alias server1 -file self-signed.p7b

...并得到相同的错误(不是 X.509 证书)

我用谷歌搜索了如何将这些证书在各种格式之间转换为 keytool 可以使用的格式(并且服务正确启动),但我似乎陷入了一个永无止境的循环,没有进一步的进展。

从我最初看到的情况来看,我不认为第 3 方应用程序本身有任何问题,因为它在 HTTP 下运行得很好;将 HTTPS 添加到 Spring 似乎非常简单。我不是 JAVA 大师,所以我只能推测证书有问题。

谁能看出我错在哪里?

最佳答案

您混淆了两个不同的东西:一个证书,用于标识您信任的其他人(通常但不总是 CA = 证书颁发机构),以及一个证书加私钥,用于标识您自己(您自己的系统)。 SSL/TLS 服务器必须有证书和私钥。

keytool -import -keystore /var/www/ssl/keystore.p12 -storepass 123456 -noprompt -alias server1 -file /var/www/ssl/self-signed.crt

这仅适用于第一种情况,即识别您信任的其他人的证书。这对您的情况是无用且错误的。

Googling shows that it's reasonably simple to convert my existing certificates from PEM (PKCS10 format I assume, as I'm using "req"?) to PKCS12 so I try that with the following command:

openssl req default 创建一个 CSR(证书签名请求),它是 PKCS10,但是你创建了一个 openssl req -x509 证书(不是 CSR),特别是自签名证书,在某些情况下,包括您的证书也会创建相应的私钥。证书和私钥都不是 PKCS10。证书是证书;对于相当新的 OpenSSL 并且由于您指定了 -nodes (其拼写是历史遗迹,现在已经过时了)私钥是 PKCS8 未加密的(技术上 ASN.1 类型 PrivateKeyInfo而不是 EncryptedPrivateKeyInfo)。

openssl pkcs12 -export -out certificate.pfx -inkey self-signed.key -in self-signed.crt

你快到了。

(I leave the export password as blank so as not to keep having to type it in when services restart).

PKCS12 设计为始终使用密码加密,将密码留空是一种非标准情况,在 OpenSSL 和 Java 之间无法一致工作。但是您不需要在启动时输入任何内容,key-store-password 设置应该可以处理。

Then I take my new PKCS12 certificate and import it (noting a new keystore too):
keytool -import -keystore test2.p12 -storepass 123456 -noprompt -alias server1 -file certificate.pfx

那根本行不通。 -import 仅导入可信证书(到新条目),或 X.509、'PkiPath' 或 PKCS7 格式的证书链与现有私钥条目(通常是一个 在 Java 中生成)。它在任何情况下都不会导入 PKCS12 格式的文件。

PKCS12 已经是适合现代 Java 的 keystore 。如果你想将它转换为旧格式的 JKS keystore ,正如一些旧的 Java 系统或程序需要或更喜欢的那样,-importkeystore 可以做到这一点;查看手册或搜索数十个现有的问题。请注意,您使用后缀 pfx 命名了 PKCS12,但这并没有改变内容,无论如何出于实际目的 PFX 和 PKCS12 是同一件事。

返回 pkcs12 -export 并在您的服务器配置中使用密码。就个人而言,为了清楚起见,我也会使用以 p12 结尾的文件名,但任何与服务器配置匹配的名称都应该有效。

关于java - 转换 PEM 证书以在 JAVA Spring Framework 中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50882433/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com