- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Java 中的 SSLServerSocket 类设置安全套接字连接,然后使用 objective-c 中的 Stream 类(CF 和 NS)。我已经使用以下代码进行了设置:
Java SSLServerSocket 代码(SecureClientWorker
处理每个连接):
public void listenSocket(int port){
try {
System.setProperty("javax.net.ssl.keyStore", "path/to/certificate(signed_by_own_root_certificate).jks");
//I try to make this root certificate trusted by iOS (see obj-c code below)
System.setProperty("javax.net.ssl.keyStorePassword", "PASSWORD...");
} catch (IOException e1) {
e1.printStackTrace();
}
try{
SSLServerSocketFactory ssf = (SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
server = (SSLServerSocket) ssf.createServerSocket(port);
logger.info("Started to listen on port: "+port);
}catch(Exception e){
logger.warning("Could not listen on port: "+port);
e.printStackTrace();
}
while(running){
SecureClientWorker w;
try{
w = new SecureClientWorker(server.accept(), this);
Thread t = new Thread(w);
t.start();
}catch(IOException e){
if(running)
e.printStackTrace();
}
}
}
Objective C 客户端代码:
[self addRootCert]; //This is where I attempt to make the root certificate trusted, If needed I can post it
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)self.ip.text, self.portNumber.text.intValue, &readStream, &writeStream);
// Set options then bridge to ARC:
NSDictionary *settings = [[NSDictionary alloc] initWithObjectsAndKeys:
(id)kCFStreamSocketSecurityLevelNegotiatedSSL, kCFStreamPropertySocketSecurityLevel,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredCertificates,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsAnyRoot,
[NSNumber numberWithBool:YES], kCFStreamSSLAllowsExpiredRoots,
[NSNumber numberWithBool:NO], kCFStreamSSLValidatesCertificateChain,
nil];
if (readStream) {
CFReadStreamSetProperty(readStream, kCFStreamPropertySSLSettings, (__bridge CFDictionaryRef)settings);
inStream = (__bridge_transfer NSInputStream*) readStream;
[inStream setDelegate:self];
[inStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inStream open];
}
if (writeStream) {
CFWriteStreamSetProperty(writeStream, kCFStreamPropertySSLSettings, (__bridge CFDictionaryRef)settings);
outStream = (__bridge_transfer NSOutputStream*) writeStream;
[outStream setDelegate:self];
[outStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outStream open];
}
但是这会导致错误代码 CFNetwork SSLHandshake failed (-9824)
并且 inStream 对象在 NSStreamDelegate
方法中返回错误 NSStreamEventErrorOccurred
.
在 Java 端,一个 IOException
似乎被抛出并带有以下内容:
in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); //ClientSocket is just the connection to the client
[...]
in.readLine();
printStackTrace 说:javax.net.ssl.SSLHandshakeException: no cipher suites in common
我是否必须创建一个 KeyManager
(正如我在其他地方读到的那样)?我该怎么做(请从无到有打开的 SSLServerSocket)?
如有任何帮助,我们将不胜感激!
编辑
我更改了服务器代码,因为它可能无法设置系统属性。
我的新代码是:
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream ksIs = new FileInputStream(new File("path/to/certificate(signed_by_own_root_certificate).jks"));
try {
ks.load(ksIs, "PASSWORD...".toCharArray());
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CertificateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (ksIs != null) {
ksIs.close();
}
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ks, "PASWD".toCharArray());
KeyManager keyManagers[] = kmf.getKeyManagers();
SSLContext sc = SSLContext.getDefault();
sc.init(keyManagers, null, new SecureRandom());
SSLServerSocketFactory socketFactory = sc.getServerSocketFactory();
server = (SSLServerSocket) socketFactory.createServerSocket(port);
但是我现在收到此错误消息:java.security.KeyManagementException:自动初始化默认 SSLContext
经过一些研究,我尝试制作自己的 TrustManager
但仍然无法正常工作
我错过了什么?
最佳答案
假设您的应用程序可以读取 keystore 文件并且密码是正确的,我的猜测是您在获取此套接字工厂之前已经在您的 Java 应用程序中的某个地方使用了 SSL/TLS 连接(这可能已完成隐含地由另一个库)。
javax.net.ssl.keyStore*
系统属性仅用于初始化默认的 SSLContext
一次。在初始化该上下文后更改它们将无济于事。
javax.net.ssl.SSLHandshakeException: no cipher suites in common
错误消息是典型的未找到或未正确加载 keystore 的情况。这是因为在没有任何证书/ key Material 的情况下,没有启用任何 RSA/DSA 密码套件:这些是远程客户端将要查找的密码套件。
检查这一点的快速方法是在命令行上设置这些属性,或者在应用程序的最开始设置它们(而不是在服务器代码的其他地方更改它们)。
如果您需要这些设置在您的应用程序中不是全局的,您确实需要初始化一个 KeyManager
。
在您编辑之后,java.security.KeyManagementException: Default SSLContext is initialized automatically
发生是因为您正在尝试重新配置默认 SSLContext
。改用新实例:
SSLContext sc = SSLContext.getInstance("TLS");
关于java - SSL 套接字连接 : CFNetwork SSLHandshake failed (-9824) connecting to Java SSLServerSocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19160684/
appName[8121:97068] 8121: CFNetwork internal error (0xc01a:/BuildRoot/Library/Caches/com.apple.xbs/S
CFNetwork 是否有任何方法可以启用匿名密码——也就是说,我们可以使用 SSL 连接代码连接到某些(保护较弱的)服务器? 最佳答案 Is there any way with CFNetwork
我正在使用缓存系统创建自己的 NSURLProtocol,我在控制台上看到了这个: 4676: CFNetwork 内部错误 (0xc01a:/SourceCache/CFNetwork_Sim/CF
我正在尝试调试此崩溃报告 - 它是在尝试上传图像时发生的(我自己无法复制崩溃)我通常会收到应用程序崩溃的特定代码行 - 我将如何调试类似的内容? Incident Identifier: 3E611C
该应用程序已获得 Apple 批准,但从 App Store 下载时不断崩溃,该应用程序在模拟器中运行良好。 这是崩溃日志。从我的搜索来看,这表明这是由于 Parse 造成的,但即使在更新 Parse
好吧,我终究无法解决这个问题。我正在使用 SMTPsender 发送电子邮件,而无需通过用户邮件 UI。我无法理解的是,当我在模拟器中运行我的应用程序时,当在运行时调用函数“sendemail”时,它
我遇到了僵尸/过度释放对象(在本例中为 CFArray)的问题。问题是我无法弄清楚它来自哪里。我同时执行了一大堆 NSURLConnections,根据 Instruments,所有导致对象过度释放的
我从 App Store 收到了一些我无法真正理解的崩溃报告。所以线程总是这样崩溃 0 libobjc.A.dylib objc_msgSend + 15 1 CFNetwork ✭
我在 Instruments 中分析我的应用程序,发现当我使用 AFNetworking 获取远程图像时 CFNetwork 的分配量令人不安。 在一个实例中,我看到了 89 MB 的分配(图像大小只
我想以编程方式检索我的应用程序的 User-Agent 字符串。 (注意:不是我的应用程序中 UIWebView 的 UA;基于 NSURLConnection 的 HTTP 请求的 UA。) 有很多
我一直在寻找两者之间的区别(通常是针对使用 HTTP/HTTPS 的简单请求),但我找不到任何东西。有什么不同吗?我问它是因为当我需要时,我只使用 NSURLConnection 并且我看到很多人推荐
在设备上运行仪器时,我间歇性地在 CFNetwork 中发生恰好 3.5 KB 的内存泄漏,负责的框架是“HostLookup_Master::HostLookup ....” 我已经阅读了很多关于这
当我尝试在 Apple Mail 中配置我的企业邮件帐户 (Exchange) 时,我可以在控制台中看到以下错误日志。但是在 Outlook 2011 邮件客户端中配置相同的帐户时我看不到此错误。当我
我正在开发一个针对 iPad 的项目,它是一个小程序,我需要它与另一个在 Windows 上运行并充当服务器的软件进行通信;因此我为 iPad 创建的应用程序将是客户端。 我正在使用 CFNetwor
我正在尝试在我的项目中添加异步传输功能。 我希望在我的申请中遵循以下内容。 表格 View 应该通过网络服务加载数据(我可以做到) 每个单元格必须有一个图像(我可以做到) 但问题是到目前为止我一直在使
我已将我的应用程序设置为允许使用此处概述的机制根据 URL 打开和关闭 SSL 证书验证: Objective-C/Cocoa: How do I accept a bad server certif
我尝试在我的应用中使用 CFNetwork,因此我尝试从 Xcode 中的 Edit Target 对话框添加 CFNetwork.framework。 有趣的是 CFNetwork 在对话框中根本不
我正在尝试使用 Cocoapods 将 CFNetwork 添加到我的项目中,而不是添加库和链接二进制文件。我试过: pod 'CFNetwork' 然后运行 pod install。我得到的错误
我在 AWS 控制台中注意到,我们的网站收到的请求比平时多得多。特别是在夜间(欧洲时间)。 然后我检查了 nginx 日志,现在我知道很多具有不同 IP 地址的设备请求网站的根目录,其中大多数使用用户
我正在使用 iOS 应用程序,在 iOS 9 中测试时出现以下错误。 CFNetwork SSLHandshake failed (-9806) NSURLSession/NSURLConnec
我是一名优秀的程序员,十分优秀!