我有一个在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"
证书问题
我最近在我的应用程序中引入了第三方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
证书似乎插入密钥库ok,但是当我重新启动第三方服务以读取新参数时,我得到了这个
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来使用的测试密钥库):
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证书并导入它(也注意到一个新的密钥库):
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证书)
我已经用Google搜索了如何在各种格式之间转换这些证书并转换为keytool可以使用的格式(并且服务正确启动)但我似乎进入了一个永无止境的循环而且没有进一步前进。 / p>
从我最初看到的,我不相信第三方应用程序本身有任何问题,因为它在HTTP下运行就好了;向Spring添加HTTPS看起来非常简单。我不是JAVA大师,所以我只能猜测这些证书不合适。
任何人都可以看到我出错的地方吗?
答案 0 :(得分:2)
您会混淆两个不同的东西:一个标识您信任的其他人的证书(通常但不总是CA =证书颁发机构),以及一个标识您自己的证书PLUS PRIVATE KEY(您自己的系统)。 SSL / TLS服务器必须具有证书PLUS PRIVATE KEY。
keytool -import -keystore /var/www/ssl/keystore.p12 -storepass 123456 -noprompt -alias server1 -file /var/www/ssl/self-signed.crt
这仅适用于第一种情况,即识别您信任的其他人的证书。对你的案子来说,这是无用的和错误的。
默认的Google搜索显示,将我现有的证书从PEM转换为相当简单(PKCS10格式,我假设,因为我正在使用" req"?)到PKCS12所以我尝试了以下命令:
openssl req
创建了一个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
你快到了。
(我将导出密码保留为空白,以便在服务重新启动时不必输入)。
PKCS12的设计始终是密码加密的,并且密码为空白'是一个非标准的案例,在OpenSSL和Java之间不能一致地工作。但是你不应该在启动时键入任何内容,key-store-password
设置应该处理。
然后我拿新的PKCS12证书并导入它(也注意到一个新的密钥库):
keytool -import -keystore test2.p12 -storepass 123456 -noprompt -alias server1 -file certificate.pfx
根本不起作用。 -import
仅导入受信任的证书(到新条目),或X.509,PkiPath'或PKCS7格式的证书链,与现有的私钥条目匹配(通常为一个在Java中生成。在任何情况下都不会导入PKCS12格式文件。
PKCS12已经是适合现代Java的密钥库。如果您想将其转换为旧格式的JKS密钥库,就像某些旧的Java系统或程序需要或更喜欢,-importkeystore
可以做到这一点;查看手册或搜索几十个现有的Q.请注意,您将PKCS12命名为后缀pfx
,但不会更改内容,无论如何,实际上PFX和PKCS12都是相同的。
返回pkcs12 -export
并在服务器配置中使用密码。就个人而言,我个人也使用以p12
结尾的文件名,但任何与服务器配置匹配的名称都应该有效。