Tag: sni

HTTPSURLconnection和Apache(系统)DefaultHttpClient之间的证书链不同

我面临着一个奇怪的问题,即Apache HTTPS客户端。 我正在尝试连接到已启用基本身份validation的外部HTTPS网站(仅限SSL服务器身份validation)。 以下是我的测试和结论的摘要。 使用Chrome / Firefox / IE中的任何一个连接到网站 – >成功 使用javax.net.ssl.HttpsURLConnection – >成功 使用DefaultHttpClient或SystemDefaultHttpClient – >失败 我尝试通过启用“javax.net.debug”到“ssl”进行调试。 我注意到两个客户端都选择了相同的信任存储(默认的JDK信任存储)并使用相同的协议(TLSv1)。 然而,差异在这里 我注意到JDK返回了以下扩展名 扩展server_name,server_name:[host_name:websitehostname] 而Apache Web客户端调试日志中缺少上述扩展名。 另外,我看到的另一个区别是在证书链中 以下来自JDK native的回复 *证书链[0] = [[版本:V3主题:** CN = websitename ,OU =域控制validation – RapidSSL(R),OU =参见www.rapidssl.com/resources/cps(c)13,OU = GT17702541,SERIALNUMBER = Q2La1fpFlFdNy4kUCIehYlMvw6bq64Ch签名算法:SHA1withRSA,OID = 1.2.840.113549.1.1.5 而在apache客户端以下 chain [0] = [[版本:V3主题:EMAILADDRESS = root @ i4319, CN = […]

TLS扩展“服务器名称指示”(SNI):服务器端不可用的值

基于JSSE示例,我试图在服务器端获取TLS参数“服务器名称指示”(SNI)的值 – 但没有成功。 我确信该值是由客户端发送的,因为我使用了显示该值的网络嗅探器(Wireshark)。 但是,当我使用以下代码片段时,服务器名称参数列表为空(显示“协议”): public void connectionAccepted(Socket socket) { System.out.println(“Connection accepted!”); try { /* get SNI parameter */ SSLSocket sslSocket = (SSLSocket)socket; SSLParameters sslParams = sslSocket.getSSLParameters(); List serverNames = sslParams.getServerNames(); for(SNIServerName item : serverNames){ System.out.println(“SNI: ” + item.toString()); } String[] protocols = sslParams.getProtocols(); for(String item : protocols) { System.out.println(“Protocols: ” + item.toString()); } } […]

某些站点上的Java 8 https连接失败

我无法访问某些https资源。 请帮助使https呼叫可靠。 我在这里测试的示例来自Firefox浏览器,以确保它们正常工作。 $ java -version openjdk version “1.8.0_121” OpenJDK Runtime Environment (build 1.8.0_121-8u121-b13-1~bpo8+1-b13) OpenJDK 64-Bit Server VM (build 25.121-b13, mixed mode) 我还检查了https连接工作的网站和其他失败的错误(此处的错误示例)似乎使用相同的连接加密: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,128位密钥,TLS 1.2 我需要从位于不同域和服务器上的少数Web服务收集数据。 其中一些设置为http,一些设置为https。 我没有收集任何安全信息,只需要获取网页内容。 所以我相信所有人: public class SSLSetupService { /* * Turn SSL certificate check off */ public void trustAll(){ // Create a trust manager that does not validate certificate chains […]

服务器关闭使用httpclient和Java 7建立的连接

我正在尝试连接到使用SNI提供证书的远程服务器。 我注意到服务器正在关闭使用Java 7编译和运行代码时的连接,而不是在我通过Java 8编译和运行它时。 下面是我为测试这个假设而编写的代码。 我切换Java版本并运行代码并获得不同的结果。 public static void getRequest() throws IOException, NoSuchAlgorithmException, KeyManagementException { String url = “https://sorry i can not share the exact url because of privacy concerns”; HttpClient client = getClientInstance(); HttpGet request = new HttpGet(url); HttpResponse response = client.execute(request); System.out.println(“Response Code : ” + response.getStatusLine().getStatusCode()); BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); […]

Java上的服务器名称指示(SNI)

任何人都可以帮助我开始使用Java中的服务器名称指示进行HTTP连接吗? 我正在尝试从我管理的网站请求内容。 我一直在使用Apache的HttpClient库,但我对安全内容的请求失败,因为网站仅使用SNI进行HTTPS,并且在DefaultHttpClient中未启用SNI。 我已经在Apache的HttpClient库中查找了如何处理这个问题的说明,但我看到最终得到了这个文档: http : //hc.apache.org/httpclient-3.x/sslguide.html ,这已经过时了(当HttpClient和HttpCore是Apache的commons包的一部分时,请参考代码)。 所以…任何帮助?

使用Java8的SNI客户端之谜

我有一个Apache Web服务器,它运行几个具有不同证书和SNI的TLS虚拟主机。 我可以使用curl访问各种虚拟主机(假设SNI使其工作)。 我也可以使用一个基本上只是在URL上的openConnection()的命令行Java程序来访问它们。 在我的Tomcat应用程序中,基本相同的客户端代码访问与客户端相同的Apache服务器,但总是以默认证书(defaulthost.defaultdomain)结束,而不是在URL中指定的虚拟主机的证书尝试访问。 (这会产生一个SunCertPathBuilderException – 基本上它无法validation证书的证书路径,当然这是真的,因为它是非官方证书。但是不管怎么说都不应该使用默认证书。) 就像我的应用程序/ Tomcat中的SNI已在客户端停用一样。 我不知道为什么我的应用程序和命令行之间应该有不同的行为; 相同的JDK,相同的主机等 我找到了属性jsse.enableSNIExtension ,但我确认它在两种情况下都设置为true。 问题: 任何想法,甚至是狂野的想法,为什么这两个程序表现不同? 有什么想法我会如何调试这个? 这是Arch Linux on 86_64,JDK 8u77,Tomcat 8.0.32。