Tag: ssl

以编程方式从PEM获取KeyStore

如何以编程方式从包含证书和私钥的PEM文件中获取KeyStore? 我试图通过HTTPS连接向服务器提供客户端证书。 我已经确认,如果我使用openssl和keytool获取jks文件,我会动态加载客户端证书。 我甚至可以通过动态读取p12(PKCS12)文件来使其工作。 我正在研究使用BouncyCastle的PEMReader类,但我无法解决一些错误。 我正在运行带有-Djavax.net.debug = all选项的Java客户端和带有调试LogLevel的Apache Web服务器。 我不知道该寻找什么。 Apache错误日志表明: … OpenSSL: Write: SSLv3 read client certificate B OpenSSL: Exit: error in SSLv3 read client certificate B Re-negotiation handshake failed: Not accepted by client!? Java客户端程序指示: … main, WRITE: TLSv1 Handshake, length = 48 main, waiting for close_notify or alert: state 3 main, Exception while […]

接收SSLHandshakeException:handshake_failure,尽管我的客户端忽略所有证书

我有一个使用SSL / TLS连接到Web服务器的Java程序,并通过该连接发送各种HTTP请求。 服务器是localhost并且使用自签名证书,但我的代码使用自定义TrustManagers,并忽略无效证书。 它一直运作到现在。 服务器上的唯一区别是它曾用于运行jboss 6并且现在正在运行jboss 7.我不确定这是否是配置问题,或者我的代码是否有问题,但是我得到相同的错误我尝试使用其他基于Java的程序(如WebScarab或ZAP)进行连接。 在任何情况下,我可以对我的代码做些什么来解决这个问题? 这是完整的错误: Received fatal alert: handshake_failure javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source) at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source) at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source) 以下是失败前的调试消息: main, WRITE: TLSv1 Handshake, length […]

Maven:资源二进制文件在构建后更改文件大小

我正在使用appengine-maven-plugin来构建我的Java Google App Engine项目。 我在WEB-INF子文件夹中包含.p12证书 当我构建我的应用程序时,证书的文件大小增加了几KB。 这使它无效。 我也看到过.jks证书也是如此。 我已经validation了预构建证书的有效性,并使用相同的方法来确认构建后证书的无效性。 任何人都可以告诉我为什么文件大小正在改变以及为什么它不是简单地复制到WAR? 谢谢你的帮助。

Java HttpsURLConnection和TLS 1.2

我在一篇文章中读到HttpsURLConnection将透明地协商SSL连接。 官方文件说: 该类使用HostnameVerifier和SSLSocketFactory。 为这两个类定义了默认实现。 [ 1 ] 这是否意味着一旦打开连接 httpsCon = (HttpsURLConnection) url.openConnection(); 它已经加密了SSL / TLS而没有任何麻烦吗? 如何查看和设置标准实现的TLS版本? (应该是Java 8的TLS 1.2和Java 7的TLS 1.0) 参考 甲骨文公司(2011年)。 javax.net.ssl.HttpsURLConnection 。 (JavaDoc的)

进行SSL连接时,PKIX路径构建失败

我正在与名为CommWeb的商家帐户集成,我正在向其url发送SSLpost( https://migs.mastercard.com.au/vpcdps )。 当我尝试发送post时,我得到以下exception: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 执行post的代码(我没有写,我们的代码库中已经存在)是: public static HttpResponse sendHttpPostSSL(String url, Map params) throws IOException { PostMethod postMethod = new PostMethod(url); for (Map.Entry entry : params.entrySet()) { postMethod.addParameter(entry.getKey(), StringUtils.Nz(entry.getValue())); } HttpClient client = new HttpClient(); int status = client.executeMethod(postMethod); if (status […]

如何为Java服务器提供多个SSL证书

我有一个用Java编写的内部HTTP服务器; 完整的源代码供我使用。 HTTP服务器可以配置任意数量的网站,每个网站都有一个单独的监听套接字创建: skt=SSLServerSocketFactory.getDefault().createServerSocket(prt,bcklog,adr); 使用使用Java keytool创建的标准密钥库,我不能在我的生活中找出如何获得与不同侦听套接字关联的不同证书,以便每个配置的网站都拥有自己的证书。 我现在正处于这种状态,因此一些代码示例将非常受欢迎。 但是我很欣赏JSSE如何在这方面联系起来的任何好的概述(我已经搜索了Sun的JSSE doco,直到我的大脑疼痛(从字面上看;尽管它可能与咖啡因戒断一样多))。 编辑 有没有简单的方法来使用别名将密钥存储区中的服务器证书与侦听套接字相关联? 以便: 客户有一个密钥库来管理所有证书,以及 没有必要摆弄多个钥匙店等。 我得到的印象(今天下午早些时候)我可以写一个简单的KeyManager,只有chooseServerAlias(…)返回非null,这是我想要的别名的名字 – 任何人都chooseServerAlias(…)条推理线有任何想法? 解 我使用的解决方案是根据slyvarking的回答构建的, 它创建了一个临时密钥库,并使用从单个外部密钥库中提取的所需密钥/证书填充它。 对于任何感兴趣的人(svrctfals是我的“服务器证书别名”值),代码如下: SSLServerSocketFactory ssf; // server socket factory SSLServerSocket skt; // server socket // LOAD EXTERNAL KEY STORE KeyStore mstkst; try { String kstfil=GlobalSettings.getString(“javax.net.ssl.keyStore” ,System.getProperty(“javax.net.ssl.keyStore” ,””)); String ksttyp=GlobalSettings.getString(“javax.net.ssl.keyStoreType” ,System.getProperty(“javax.net.ssl.keyStoreType” ,”jks”)); char[] kstpwd=GlobalSettings.getString(“javax.net.ssl.keyStorePassword”,System.getProperty(“javax.net.ssl.keyStorePassword”,””)).toCharArray(); mstkst=KeyStore.getInstance(ksttyp); mstkst.load(new FileInputStream(kstfil),kstpwd); } […]

如何强制Commons HTTPClient 3.1仅对HTTPS使用TLS 1.2?

我希望强制Apache Commons HTTP-Client ( 3.1版)使用TLS 1.2作为HTTPS的唯一协议。 这是因为服务器应该升级到TLS 1.2并且不再接受任何旧协议(导致返回“连接重置”)。 对于进一步的上下文,可能不相关,HTTP-Client与Axis2一起用于创建SOAP; 用于设置HttpClient的一些代码如下: MultiThreadedHttpConnectionManager connMgr = new MultiThreadedHttpConnectionManager(); this.httpClient = new HttpClient(connMgr); // initialize HttpClient parameters HttpClientParams hcParams = this.httpClient.getParams(); // Maximum time to wait to receive connection from pool hcParams.setConnectionManagerTimeout(this.maxWait); hcParams.setSoTimeout(this.timeout); hcParams.setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(this.retryCount, false)); // Initialize global Connection manager parameters HttpConnectionManagerParams cmParams = connMgr.getParams(); cmParams.setDefaultMaxConnectionsPerHost(this.maxActive); cmParams.setStaleCheckingEnabled(this.checkStaleConnections); […]

HttpClient 4.1的SSL“Peer Not Authenticated”错误

我正在构建一个简单的应用程序监视器来轮询我们的一个API URL并向我们发送电子邮件,如果它无法从响应中获取HTTP 200状态代码(这表明我们的API因某种原因而关闭)。 我正在使用HttpClient 4.1 (这很重要,因为它的API与3.x差别很大 )。 我们的API使用SSL是安全的,但输入: http://example.com/our-api 进入Web浏览器重定向到 https://example.com/our-api 没有造成任何错误。 当HttpClient尝试访问此URL( http://example.com/our-api )时,它会因javax.net.ssl.SSLPeerUnverifiedExceptionexception而失败,并显示一条消息: 同行未经过身份validation 我发现这对其他人来说发生了很多事情,正如这篇文章所certificate的那样(这也提供了一些规避这个问题的方法 – 我今晚将尝试和实施的解决方案)。 这个其他post(和其他类似的post)没有做的是解释为什么这首先发生! 所以,而不是问“我该如何解决这个问题?” 我想我会问“ 为什么会发生这种情况? ”在我提前解决其中一个建议的解决方案之前,我想知道我试图解决的问题是什么;-)

Java SSLHandshakeException:没有共同的密码套件

我正在尝试使用Java SSLSockets将安全性应用于简单的聊天应用程序。 我创建了一个自签名CA,并在其中签署了两个证书(所有使用的RSA密钥),一个用于服务器,一个用于客户端。 之后,我将证书导入服务器的密钥库,并导入客户端的另一个密钥库。 CA : openssl genrsa -out ca.key 1024 -rsa openssl req -new -key ca.key -out ca.csr openssl x509 -req -days 365 -in ca.csr -out ca.crt -signkey ca.key SERVER CERTIFICATE: openssl genrsa -out server.key 1024 -rsa openssl req -new -key server.key -out server.csr openssl ca -in server.csr -cert ca.crt -keyfile ca.key -out server.crt […]

在同一JVM上设置多个信任库

我有一个在weblogic服务器上运行的Java应用程序。 该应用程序有两个不同的模块,使用SSL连接到外部Web服务 – 比如模块A和模块B. 模块A – 基于轴构建 – 使用信任库A Moudle B – 基于Spring-ws构建 – 使用信任库B. 模块A存在。 正在介绍模块B. 我需要能够根据调用的模块在JVM中动态设置信任库。 由于某些限制,我没有选项 – 创建自定义密钥管理器。 – 使用一个信任库 我尝试使用System.setProperty im Module B codebase来设置truststore。 但是,仅当模块B首先被调用时才有效。 例如 – 假设我重新启动JVM然后调用模块A – 它在JVM中设置它自己的信任库然后我调用模块B – 它失败 – 它没有在JVM中设置它自己的信任库,即使我已经使用过System.setProperty方法。 我错过了什么,或者只是System.setProperty不会覆盖现有的设置值。 如果是这样,我的选择在这里。