Tag: jsse

什么是SunX509,它可以与使用IbmX509的各方合作吗?

当我手动创建KeyManager ,其中一个步骤是: KeyManagerFactory.getInstance(“SunX509”) 这对我需要指定“IbmX509”的IBM jre不起作用。 我的问题: 我读到这被称为“证书编码算法”。 那是什么意思? 什么时候使用? 当客户端使用IBM算法并且服务器使用Sun算法时会发生什么? 谢谢, 多伦

如何在Java(JSSE)中使用默认的KeyStore时提供特定的TrustStore

概观 JSSE允许用户通过指定javax.net.ssl。*参数来提供默认信任存储和密钥存储。 我想为我的应用程序提供一个非默认的TrustManager,同时允许用户像往常一样指定KeyManager,但似乎没有任何方法可以实现这一点。 细节 http://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/JSSERefGuide.html#CustomizingStores 假设在unix机器上我想允许用户使用pkcs12密钥存储区进行身份validation,而在OS XI上则希望允许用户使用系统密钥链。 在OS X上,应用程序可能会按如下方式启动: java -Djavax.net.ssl.keyStore=NONE -Djavax.net.ssl.keyStoreType=KeychainStore \ -Djavax.net.ssl.keyStorePassword=- -jar MyApplication.jar 这将正常工作:当应用程序访问需要相互身份validation(客户端证书身份validation)的https服务器时,将提示用户允许访问其钥匙串。 问题 现在假设我想将自签名证书颁发机构与我的应用程序捆绑在一起。 我可以通过构造一个TrustManagerFactory并传入一个包含我的证书( javadoc )的KeyStore来覆盖默认的信任管理器。 但是,要使用此非默认信任管理器,我需要创建并初始化SSLContext。 这里存在问题。 通过调用init(..)并传递KeyManager和TrustManager来初始化SSLContexts。 但是,使用javax.net.ssl。*参数创建KeyManager的逻辑嵌入在默认SSLContexts的实现中 – 我找不到使用默认行为获取KeyManager或KeyManagerFactory的方法,同时还指定了非默认的TrustManager或TrustManagerFactory。 因此,似乎不可能使用例如适当的操作系统特定的钥匙串实现,同时还提供用于validation远程服务器的根证书。

哪里可以找到Java 6 JSSE / JCE源代码?

哪里可以下载最新版Java的JSSE和JCE源代码? https://jdk6.dev.java.net/上提供的源代码构建版不包含javax.crypto(JCE)包和com.sun.net.ssl.internal(JSSE)包。 无法调试这些类使得解决SSL问题非常困难。

我可以避免在JSSE的命令行上放置密钥库密码吗?

我们正在使用Maven 2并使用SSL客户端身份validation保护maven存储库管理器。 为了让Maven访问存储库,必须将以下系统属性传递给Java: javax.net.ssl.trustStore中= trust.jks javax.net.ssl.trustStorePassword = javax.net.ssl.keyStore = keystore.p12 javax.net.ssl.keyStoreType = PKCS12 javax.net.ssl.keyStorePassword = 有关详细信息,请参阅此迷你指南 。 为了在Maven中设置这些系统属性,我必须使用MAVEN_OPTS环境变量(或直接在命令行上传递它们)。 无论哪种方式,当Maven实际执行时,所有这些属性都可以被系统上的其他用户看到(通过ps),包括我的密钥库密码。 有没有办法设置这些属性,以便密码不会在命令行上公开?

如何使用SSLv2启动ssl连接

我想使用SSLv2启动与远程服务器的SSL连接。 我正在使用Java。 我尝试使用以下方法在套接字中获取支持的协议: String[] suppProtocols=socket.getSupportedProtocols(); System.out.println(“The protocols supported for this socket are: “+Arrays.toString(suppProtocols)); 我在输出中得到了这个: [SSLv2Hello, SSLv3, TLSv1, TLSv1.1, TLSv1.2] 现在,我读到Java不支持SSLv2,而SSLv2Hello只使用SSLv2发送hello消息。 我无法理解这意味着什么? 是不是客户端支持SSLv2? 如何使用SSLv2建立SSL连接。

Java JSSE SSLEngine无法恢复SSL会话

我正在编写一个使用SSLEngine和NIO的应用程序,我编写了客户端和服务器。 客户端能够连接到服务器,在他连接后,我希望他能够执行会话恢复/重新协商,但目前没有运气.. 由于使用SSLEngine的代码非常大(SSLEngine的使用非常复杂!),我将编写一个简单的伪代码来演示这种情况: Server: global sslcontext initialized once await new client client.sslEngine = create new server ssl engine using the global sslcontext client.handleHandshake and wait for it to be done handle client. Client: global sslcontext initialized once sslEngine = create new client ssl engine using the global sslcontext performHandshake and wait for it to be […]

jndi LDAPS自定义HostnameVerifier和TrustManager

我们正在编写一个应用程序,它将连接到不同的LDAP服务器。 对于每台服务器,我们只接受某个证书。 该证书中的主机名无关紧要。 当我们使用LDAP和STARTTLS时,这很容易,因为我们可以使用StartTlsResponse.setHostnameVerifier(..-)并将StartTlsResponse.negotiate(…)与匹配的SSLSocketFactory 。 但是,我们还需要支持LDAPS连接。 Java本身支持此function,但前提是默认的Java密钥库信任服务器证书。 虽然我们可以替换它,但我们仍然无法为不同的服务器使用不同的密钥库。 现有的连接代码如下: Hashtable env = new Hashtable(); env.put( Context.INITIAL_CONTEXT_FACTORY, “com.sun.jndi.ldap.LdapCtxFactory” ); env.put( Context.PROVIDER_URL, ( encryption == SSL ? “ldaps://” : “ldap://” ) + host + “:” + port ); if ( encryption == SSL ) { // env.put( “java.naming.ldap.factory.socket”, “CustomSocketFactory” ); } ctx = new InitialLdapContext( env, null […]

公共https网站上的jsse handshake_failure

我已经阅读了一个相关的问题 ,但它似乎没有在我看到失败的同一个地方失败。 我正在尝试一个非常简单的操作: public static void main(String [] argv) { try { URL u = new URL(“https://membership.usairways.com/Login.aspx”); Object o = u.getContent(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } 但是在我的Mac和Windows机器上使用Java 6运行时遇到handshake_failure。 其他人一直没有找到证书的问题,但调试日志( -Djavax.net.debug=ssl:handshake )显示找到的证书很好: keyStore是: keyStore类型是:jks keyStore提供者是: init keystore sunX509类型的init keymanager trustStore是:C:\ Program Files(x86)\ Java \ jre6 \ lib […]

使用JSSE时如何进行主机名validation?

我正在编写一个Java客户端(需要在桌面JRE和Android上工作),以获得通过TLS承载的专有协议(特定于我的公司)。 我正在尝试找出用Java编写TLS客户端的最佳方法,特别是确保它正确地进行主机名validation。 ( 编辑:通过它,我的意思是检查主机名是否与X.509证书匹配,以避免中间人攻击。) JSSE是编写TLS客户端的明显API,但我从“ 世界上最危险的代码 ”论文(以及实验)中注意到,JSSE在使用SSLSocketFactory API时不validation主机名。 (这是我必须使用的,因为我的协议不是HTTPS。) 因此,似乎在使用JSSE时,我必须自己进行主机名validation。 而且,不是从头开始编写代码(因为我几乎肯定会弄错),似乎我应该“借用”一些有效的现有代码。 所以,我发现的最有可能的候选者是使用Apache HttpComponents库(具有讽刺意味的是,因为我实际上并不在做HTTP) 并使用org.apache.http.conn.ssl.SSLSocketFactory类代替标准的javax .net.ssl.SSLSocketFactory类 。 我的问题是:这是一个合理的行动方案吗? 或者我完全误解了事情,走出了深层,实际上有一种更简单的方法来获取JSSE中的主机名validation,而不需要像HttpComponents那样引入第三方库? 我也查看了BouncyCastle,它有一个非JSSE API用于TLS,但它似乎更有限,因为它甚至没有进行证书链validation,更不用说主机名validation,所以它看起来像一个非-起动机。 编辑:这个问题已经回答了Java 7,但我仍然很好奇Java 6和Android的“最佳实践”是什么。 (特别是,我必须为我的应用程序支持Android。) 再次编辑:为了使我的“借用Apache HttpComponents”的提议更加具体,我创建了一个小型库 ,其中包含从Apache HttpComponents中提取的HostnameVerifier实现(最值得注意的是StrictHostnameVerifier和BrowserCompatHostnameVerifier)。 (我意识到我需要的只是validation器,我不需要像我原先想的那样使用Apache的SSLSocketFactory。)如果留给我自己的设备,这就是我将使用的解决方案。 但首先,我有什么理由不这样做吗? (假设我的目标是以与https相同的方式进行主机名validation。我意识到它本身可以辩论,并且已经在加密列表的线程中进行了讨论,但是现在我坚持使用类似HTTPS的主机名validation,即使我没有使用HTTPS。) 假设我的解决方案没有“错误”,我的问题是:是否有一种“更好”的方式来实现它,同时仍然可以在Java 6,Java 7和Android中保持可移植性? (“更好”意味着更惯用,已经广泛使用,和/或需要更少的外部代码。)

JSSE包创建两个需要两次unwraps的tls包。 为什么?

我正在使用连接的openssl客户端检查jsse tls加密和解密的java应用程序的行为。 首先,我观察到当我为客户端数据调用unwrap时,它总是解包消耗37个字节并产生0.下一个unwrap消耗一些字节并产生一些。 起初我以为客户端会首先包装一个空数组。 但后来我发现jsse代码做的相同,只不过它产生1个字节而不是0。 因此,对wrap每次调用都会消耗X个字节并产生Y个字节,但需要两个unwrap而第一个消耗37个字节并产生1个字节,第二个消耗Y-37字节并产生X-1个字节。 虽然openssl和jsse几乎一样,但我希望这是正确的。 但是我想知道,为什么会这样。 我没有看到这个原因,需要额外的资源……?