2012-06-12 27 views
4

我在Heroku面臨SSLHandshakeException如何解決Heroku上的javax.net.ssl.SSLHandshakeException?

這個應用程序不是SSL應用程序。但是這個應用程序從應用程序內部調用了一個基於ssl的web api。 通常,使用keytool爲JVM採用SSL證書解決了這種問題。

但是我如何對Heroku做這個?

日誌的位置:

2012-06-12T11:08:08+00:00 app[web.1]: Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    2012-06-12T11:08:08+00:00 app[web.1]: at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:324) ~[na:1.6.0_20] 
    2012-06-12T11:08:08+00:00 app[web.1]: at sun.security.validator.Validator.validate(Validator.java:235) ~[na:1.6.0_20] 
    2012-06-12T11:08:08+00:00 app[web.1]: at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:147) ~[na:1.6.0_20] 
    2012-06-12T11:08:08+00:00 app[web.1]: at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:230) ~[na:1.6.0_20] 
    2012-06-12T11:08:08+00:00 app[web.1]: Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 
    2012-06-12T11:08:08+00:00 app[web.1]: at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:270) ~[na:1.6.0_20] 
    2012-06-12T11:08:08+00:00 app[web.1]: at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:197) ~[na:1.6.0_20] 
    2012-06-12T11:08:08+00:00 app[web.1]: at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:255) ~[na:1.6.0_20] 
    2012-06-12T11:08:08+00:00 app[web.1]: at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:319) ~[na:1.6.0_20] 
    2012-06-12T11:08:08+00:00 app[web.1]: at sun.security.validator.Validator.validate(Validator.java:235) ~[na:1.6.0_20] 
    2012-06-12T11:08:08+00:00 app[web.1]: at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:147) ~[na:1.6.0_20] 
    2012-06-12T11:08:08+00:00 app[web.1]: at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:224) ~[na:1.6.0_20] 

回答

0

當你在進行的客戶信任一個SSL connection to a server, you should be having the Server's certificate

您應該import the server certificate into a keystore並使用javax.net.ssl.trustStorejavax.net.ssl.trustStorePassword指定密鑰庫。

檢查您是否指定了這些屬性。如果已經指定,請檢查它們是否正確指向密鑰庫。

+0

謝謝。 我會盡力的。 我發現這個ssl證書在發佈這個問題後實際上是自我認證的。 我通過要求管理員將證書更改爲適當的證書來解決此問題。 非常感謝。 –

+0

請注意,只有在服務器證書是自簽名的情況下才需要。如果它是由認可的證書頒發機構簽署的,則不必做任何事情。 – EJP

+1

最初的問題是Heroku特有的,我仍然想知道如何在Heroku上無法訪問實際的JVM時將(自簽名)證書導入JVM密鑰庫。 –

1

其實我不知道,如果Heroku上有任何支持更新密鑰庫,但你總是可以提供自己的密鑰庫爲Java環境參數在你的配置或procfile這樣

web: java -jar -Djavax.net.ssl.trustStore=path/to/keystore -Djavax.net.ssl.trustStorePassword=changeit --port $PORT target/*.war 
0

爲了解決SSL證書驗證問題(通常發生在自簽名證書上),您需要將證書添加到java密鑰庫,以告訴JVM始終信任它。

要在本地添加:

  • 找到你的密鑰庫文件(通常位於的jre/lib/security中/ cacerts中
  • 下載證書.CER文件(here are few ways to do that,我覺得用Firefox下載中最簡單的一個)
  • 導入證書到您的密鑰庫:keytool -import -keystore cacerts -file custom.cer

上傳keystor e到Heroku由adding cacerts file as a custom JVM file

相關問題