在我的Java应用程序中,我需要使用SSL连接到同一主机,但每次都使用不同的证书。 我需要使用不同证书的原因是远程站点使用证书中嵌入的用户ID属性来标识客户端。 这是一个在3个不同操作系统上运行的服务器应用程序,我需要能够在不重新启动进程的情况下切换证书。 另一位用户建议将多个证书导入同一个密钥库。 但是,我不确定这会对我有所帮助,除非有办法告诉Java要在密钥库中使用哪个证书。
我使用SSL连接将Web客户端连接到服务器。 它长时间没有任何问题。 但从昨天起,它给出了以下错误,任何人都可以告诉我原因。 javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1172) at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:65) at net.schubart.fixme.internal.MessageInput.readExactly(MessageInput.java:166) at net.schubart.fixme.internal.MessageInput.readMessage(MessageInput.java:78) at cc.aot.itsWeb.ClientWriterThread.run(ClientWriterThread.java:241) at java.lang.Thread.run(Thread.java:619) clientWriter.ready Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1586) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:865) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1029) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:621) at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59) at java.io.OutputStream.write(OutputStream.java:58) at net.schubart.fixme.internal.Message.write(Message.java:267) at net.schubart.fixme.internal.MessageOutput.writeMessage(MessageOutput.java:53)
是否可以轻松地将客户端证书附加到使用wsdl2java生成的Axis2存根? 我需要在每个请求的基础上动态更改客户端证书,因此只需将其存储在密钥库中就不适用于我们的情况。 我已经找到了非SOAP调用的示例,但找不到与使用Axis客户端存根相关的任何内容。 尝试破解XML for SOAP调用是一个选项,我猜,albiet是一个痛苦的选择! 呻吟!
我正在尝试使用Java 7创建到远程服务器的SSL连接,并且我收到以下exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:946) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312) at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:702) at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:122) at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221) at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291) at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295) at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141) at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229) at java.io.BufferedWriter.flush(BufferedWriter.java:254) at ssl7.Client.main(Client.java:22) Caused by: java.io.EOFException: SSL peer shut down incorrectly at sun.security.ssl.InputRecord.read(InputRecord.java:482) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927) 当我使用Java 6重新运行代码时,没有例外。 我在StackOverflow的其他地方找到了对这个问题的引用,但我的情况有一个转折。 使用Java 7失败的客户端代码是 public class Client { public static void […]
使用SSL和Tomcat进入另一个问题:我已经配置了一个密钥库,其中包含密钥和证书(我希望向连接到该站点的客户端提供的服务器证书)。 我为信任库做了同样的事情(我将需要客户端身份validation)。 我现在遇到的问题是,当我通过HTTPS连接到我的Tomcat实例时,呈现给我的证书(服务器证书)不是我的实际服务器证书,而是JKS密钥库中的密钥。 使用-Djavax.net.debug = ssl显示它为客户端身份validation提供了正确的CA,但没有提供正确的服务器证书。 添加为可信证书:主题:CN = A发行者:CN = A算法:RSA; 序列号: – 从2009年11月10日星期二14:48:31 CET到2009年2月8日星期一14:48:31 CET 2010添加为可信证书:主题:X发行人:X算法:RSA; 序列号: – 有效期为2005年1月19日星期三01:00:00 CET至2015年1月19日星期一00 00:59:59 我用占位符取代了真正的价值观。 A =服务器的域名(但在这种情况下,由于某种原因,这是密钥而不是证书)。 X = VeriSign CA(这应该是正确的)。 我有一个现有的证书,我想用它来呈现给客户端,我使用keytool将其导入JKS密钥库。 Tomcat连接器配置: 连接器端口=“444”协议=“HTTP / 1.1”SSLEnabled =“true” maxThreads =“150”scheme =“https”secure =“true” clientAuth =“false”sslProtocol =“TLS” keystoreFile = “CONF / SSL / keystore.jks” keystorePass = “XX” keyAlias = “密押” […]
我正在使用JavaFX开发一个简单的嵌入式浏览器: final WebView browser = new WebView(); final WebEngine webEngine = browser.getEngine(); 当我使用webEngine加载任何http网站时,它工作正常: webEngine.load(“http://google.es”); 尽管如此,如果我尝试使用不受信任的证书(我自己的ssl证书)加载网站, webEngine不起作用,我在浏览器中看到一个白色屏幕。 有没有办法(自动)信任我的ssl证书?
我有一个应该将文件发送到Web服务的程序,这需要SSL连接。 我按如下方式运行程序: SET JAVA_HOME=C:\Program Files\Java\jre1.6.0_07 SET com.ibm.SSL.ConfigURL=ssl.client.props “%JAVA_HOME%\bin\java” -cp “.;Test.jar” ca.mypackage.Main 这很好,但是当我改变第一行时 SET JAVA_HOME=C:\Program Files\IBM\SDP\runtimes\base_v7\java\jre 我收到以下错误: com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: java.net.SocketException: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:119) at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:140) at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:86) at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:593) at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:552) at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:537) at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:434) at com.sun.xml.internal.ws.client.Stub.process(Stub.java:247) at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:132) at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:242) at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:222) at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:115) at $Proxy26.fileSubmit(Unknown Source) […]
我的问题: 我想连接到服务器(不限于HTTPS协议 – 可能是LDAP-over-SSL,可能是SMTPS,可能是IMAPS等),可能正在使用Java默认不信任的证书(因为它们是自签名)。 所需的工作流程是尝试连接,检索证书信息,将其呈现给用户,如果他接受,则将其添加到信任库,以便将其信任。 我被困在检索证书。 我有代码(请参阅post的末尾),我已经从这里和从有关java SSL的问题的答案所指向的站点进行了抄袭。 代码只是创建一个SSLSocket ,启动SSL握手,并向SSL会话询问Certificate[] 。 当我使用已经可信任的证书连接到服务器时,代码工作正常。 但是当我使用自签名证书连接到服务器时,我会得到通常的: Exception in thread “main” javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.ssl.Alerts.getSSLException(Unknown Source) at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source) at sun.security.ssl.Handshaker.fatalSE(Unknown Source) at sun.security.ssl.Handshaker.fatalSE(Unknown Source) at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source) [etc] 如果我使用-Djavax.net.debug=all运行,我看到JVM确实检索了自签名证书,但是在到达返回证书之前,它会破坏连接以使用不受信任的证书。 看起来像鸡蛋问题。 它不会让我看到证书,因为它们不受信任。 但我需要看到证书能够将它们添加到信任库,以便它们可信。 你怎么突破这个? 例如,如果我将程序运行为: […]
使用HttpsURLConnection时, SSLSocketFactory类在java中扮演什么角色? java文档没有多大帮助。 有没有办法将密钥库和信任库绑定到sslsocketfactory对象,使其指向密钥库和信任库? 否则,连接如何知道密钥库和信任库的位置(我不想使用java System Properties )?
我在Windows上运行Tomcat 6,并且希望Tomcat使用除cacerts之外的其他信任存储来处理Java客户端Web请求。 我尝试添加此设置: -Djavax.net.ssl.trustStore=”C:\ca.keystore” 到密钥注册表: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Apache Software Foundation\Procrun 2.0\Tomcat6\Parameters\Java 但这似乎不起作用。 它仍然使用JRE cacerts商店。 我们的Java代码向HTTPS端点发出Web请求,并且我希望将证书保存在JRE之外的密钥存储区中,因为在卸载/更新Java时它会被删除。