我有一个应用程序,我在其中调用一些SOAP Web服务。当我调用这些服务时,我收到了无效的证书错误。
要解决此问题,我在位于路径%JAVA_HOME%/jre/lib/security/cacerts
的密钥库中添加了Web服务的安全证书。
现在,当我从独立应用程序调用Web服务时,我成功地获取了数据。
但是,当我尝试从我的Web应用程序(使用 Play framework 2.2.4 构建)调用相同的Web服务时,我得到了与之前相同的错误(即无效证书)。 在搜索解决方案后,我发现我应该将play框架配置为使用该密钥库。
我正在尝试配置播放框架2.2.4以使用自定义密钥库,我有一些疑问。 (我已按照以下链接https configuration for play framework中的说明进行操作,但对我来说似乎并不清楚)
application.conf
文件中,还是应该将它们放在操作系统的环境变量中,或者在运行应用程序时是否必须指定它们。play -Dhttps.port=9443 -Dhttps.keyStore=<Path to the keystore> -Dhttps.keyStorePassword=<Password> run
),但它不起作用。由于我刚开始玩框架,如果有人可以分享步骤或小教程来做同样的事情,那将会非常有用。
答案 0 :(得分:0)
请注意,密钥库和信任库之间存在差异。虽然前者拥有私钥,但后者包含其他方的公钥/证书。你在第一段(cacerts)中提到的是一个信任库。
因此,如果您指定https.keyStore
,则表示您未配置包含您希望从其他方接受的证书的商店。
使用-Djavax.net.ssl.trustStore
配置信任库。此处介绍了更多选项:https://docs.oracle.com/cd/E29587_01/PlatformServices.60x/ps_security/src/csec_ssl_jsp_start_server.html或调试指南:http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/ReadDebug.html
答案 1 :(得分:0)
You can start the play Netty server in https mode and to use certificates.
In the server can achieve it using -D parameters for Netty.
1) sbt "project pepeGrillo-server" "run -Dhttps.port=9443 -Dhttp.port=disabled -Djdk.tls.ephemeralDHKeySize=2048
-Djdk.tls.rejectClientInitiatedRenegotiation=true
-Dplay.server.https.keyStore.path={path-4-server-cer-for-domain}localhost.jks
-Dplay.server.https.keyStore.password={your-password}"
2)然后你需要设置播放ws客户端以使用信任存储。将以下内容添加到application.conf中。这将确保注入的ws具有使用客户端可信密钥的Web安全设置
play.ws.ssl {
keyManager = {
stores = [
{ type = "JKS", path = "/etc/containerHostca.jks", password = "noSe"}
]
}
trustManager = {
stores = [
{ type = "JKS", path = "/etc/containerHosttrust.jks", password = "carloTA" }
]
}
}
https://www.playframework.com/documentation/2.5.x/CertificateGeneration