2016-08-17 50 views
0

下同hostname是被通過的Java檢查存儲在密鑰庫證書的主機名時拋出異常。我相信它正在檢查一個JKS格式的密鑰庫。我想編寫一個非常簡單的Java程序來獲取主機名,因爲Java在此異常中獲取主機名。如何獲取Java的獲取此異常

什麼代碼行會得到在Java中的主機名,所以它等於這個異常?

http://java.globinch.com/enterprise-java/security/fix-java-security-certificate-exception-no-matching-localhost-found/

特例:

com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException:沒有匹配的名稱 shr-test.hosp.org found: com.sun.jersey.api.client.ClientHandlerException: javax.net.ssl.SSLHandshakeException: java.security.c ert.CertificateException:沒有匹配的名稱 shr-test.hosp.org發現在 com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:155) at com.sun.jersey.api.client。 Client.handle(Client.java:652)在 com.sun.jersey.api.client.WebResource.handle(WebResource.java:682)在 com.sun.jersey.api.client.WebResource.access $ 200(WebResource .java:74) at com.sun.jersey.api.client.WebResource $ Builder.post(WebResource.java:560) at net.shrine.client.JerseyHttpClient.post(JerseyHttpClient.scala:63) at net.shrine.client.Poster.post(Poster.scala:10)在 net.shrine.adapter.client.RemoteAdapterClient $$ anonfun $查詢$ 2 $$ anonfun $ $適用1.適用(RemoteAdapterCl ient.scala:56) 在 net.shrine.adapter.client.RemoteAdapterClient $$ anonfun $查詢$ 2 $$ anonfun $ $適用1.適用(RemoteAdapterClient.scala:在 scala.concurrent.impl.ExecutionContextImpl $ 54) DefaultThreadFactory $$匿名$ $$ 2匿名$ 4.block(ExecutionContextImpl.scala:48) 在 scala.concurrent.forkjoin.ForkJoinPool.managedBlock(ForkJoinPool.java:3640) 在 scala.concurrent.impl.ExecutionContextImpl $ $ DefaultThreadFactory $ anon $ 2.blockOn(ExecutionContextImpl.scala:45) at scala.concurrent.package $ .blocking(package.scala:54)at net.shrine.adapter.client.RemoteAdapterClient $$ anonfun $ query $ 2.apply(RemoteAdapterClient .scala:54) at net.shri ne.adapter.client.RemoteAdapterClient $$ anonfun $查詢$ 2.適用(RemoteAdapterClient.scala:54) 在 scala.concurrent.impl.Future $ PromiseCompletingRunnable.liftedTree1 $ 1(Future.scala:24) 在 scala.concurrent .impl.Future $ PromiseCompletingRunnable.run(Future.scala:24) 在 scala.concurrent.impl.ExecutionContextImpl $ AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:121) 在 scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask的.java:260) 在 scala.concurrent.forkjoin.ForkJoinPool $ WorkQueue.runTask(ForkJoinPool.java:1339) 在 scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) 原因:javax.net.ssl.SSLHandshakeException: java.security.cert。CertificateException:沒有匹配的名稱 shr-test.hosp.org sun.security.ssl.Alerts.getSSLException(Alerts.java:192)at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1884)在 sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270)at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker。的java:1341) 在 sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:153) 在sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)在 sun.security.ssl.Handshaker .process_record(Handshaker.java:804)at sun.security.ssl.SSLSocketImpl.readRecord(SS LSocketImpl.java:1016)在 sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) 在 sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339) 在 sun.security。 ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323) 在 sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) 在 sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection。連接(AbstractDelegateHttpsURLConnection.java:185) 在 sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1091) 在 sun.net.www.protocol.https.HttpsURLConne ctionImpl.getOutputStream(HttpsURLConnectionImpl.java:250) 在 com.sun.jersey.client.urlconnection.URLConnectionClientHandler $ 1 $ 1.getOutputStream(URLConnectionClientHandler.java:238) 在 com.sun.jersey.api.client.CommittingOutputStream。 commitStream(CommittingOutputStream.java:117) at com.sun.jersey.api.client.CommittingOutputStream.write(CommittingOutputStream.java:89) at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)在 sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)在 sun.nio.cs.StreamEncoder.flush(StreamEncoder.java :141)at java.io.OutputStreamWrit er.flush(OutputStreamWriter.java:229)at java.io.BufferedWriter.flush(BufferedWriter.java:254)at com.sun.jersey.core.util.ReaderWriter.writeToAsString(ReaderWriter.java:191) at com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider.writeToAsString(AbstractMessageReaderWriterProvider.java:128) 在 com.sun.jersey.core.impl.provider.entity.StringProvider.writeTo(StringProvider.java:88) 在 com.sun.jersey.core.impl.provider.entity.StringProvider.writeTo(StringProvider.java:58) at com.sun.jersey.api.client.RequestWriter.writeRequestEntity(RequestWriter.java:300) at com.sun.jersey.client.urlconnection.URLC java.security.cert.CertificateException:onnectionClientHandler._invoke(URLConnectionClientHandler.java:217) 在 com.sun.jersey.client.urlconnection.URLConnectionClientHandler.handle(URLConnectionClientHandler.java:153) ...... 21多產生的原因:沒有 姓名匹配shr-test.hosp.org發現在 sun.security.util.HostnameChecker.matchDNS(HostnameChecker.java:208) at sun.security.util.HostnameChecker.match(HostnameChecker.java:93)at sun.security.ssl.X509TrustManagerImpl.checkIdentity(X509TrustManagerImpl.java:347) 在 sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:203) 在 sun.security.ssl.X509TrustManagerImpl。checkServerTrusted(X509TrustManagerImpl.java:126) 在 sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1323) ...... 48多個

我想問的原因是因爲我的操作系統有兩個不同的主機名值。系統主機名和VServer主機名。我能夠用配置層次來控制系統主機名。他們實際上是不同的。爲了使證書與Java看到的相匹配,我需要避免這種異常並讓它們匹配。

看到這個問題以供參考:

https://serverfault.com/questions/793689/getting-hostname-on-centos-6-6-from-command-line

這...

https://serverfault.com/questions/793689/getting-hostname-on-centos-6-6-from-command-line

+0

你肯定有什麼用您的主機名?粗略看來,您似乎試圖使用主機名A連接到服務,並獲取主機名爲B的證書。因此,如果它解析爲相同的地址,則應該連接到主機名B. – RealSkeptic

+0

我最終追求的是這個Java類如何獲得兩個主機名值?我想它使用一些JKS函數從JKS獲取證書主機名。但是它如何在這個類的值比較中獲得另一個主機名值? ... java.security.cert.CertificateException: – MacGyver

+0

它在進行連接時直接從SSL服務器獲取證書。這是SSL(或者說TLS,我想)談判的一部分。我想它會將它與您在URL中傳遞的主機名進行比較。 – RealSkeptic

回答

0

我曾在CN(通用名)字段中鍵入我的名字。所以當它執行JKS密鑰庫查找時,它找到了「MacGyver」而不是CNAME。

根本原因是創建非第三方(也稱爲使用自定義CA的自簽名SSL證書)密鑰庫時的軟件錯誤。其中一個提示詢問「你的姓和名是什麼?」,當它應該詢問「什麼是證書的通用名?」完成後,您在密鑰庫上運行keytool -list命令,該值將被放入「CN」字段。請參閱下面輸入的錯誤值,並在完成時注意「CN」值。請小心這一點。

keytool -genkey -keyalg RSA -alias shrine-snow -keystore shrine.keystore -storepass XXXXX! -validity 360 -keysize 2048 

What is your first and last name? 
    [Unknown]: Angus MacGyver 
What is the name of your organizational unit? 
    [Unknown]: Criminal Investigation 
What is the name of your organization? 
    [Unknown]: Phoenix Foundation 
What is the name of your City or Locality? 
    [Unknown]: Madison 
What is the name of your State or Province? 
    [Unknown]: Wisconsin 
What is the two-letter country code for this unit? 
    [Unknown]: US 
Is CN=Angus MacGyver, OU=Criminal Investigation, O=Phoenix Foundation, L=Madison, ST=Wisconsin, C=US correct? 
    [no]: yes 

Enter key password for <selfsigned> 
     (RETURN if same as keystore password):XXXXX! 
Re-enter new password:XXXXX! 

您可以檢查使用該商店的內容:

keytool -v -list -keystore shrine.keystore