2016-08-17 54 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