本文将介绍java–SSL套接字连接的详细情况,特别是关于java中套接字socket的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Android
本文将介绍java – SSL套接字连接的详细情况,特别是关于java中套接字socket的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Android套接字连接超时、c# – 如何模拟套接字连接丢失?、c# – 带有客户端身份验证的.Net和Java之间的SSL套接字、C#-PHP套接字连接的知识。
本文目录一览:- java – SSL套接字连接(java中套接字socket)
- Android套接字连接超时
- c# – 如何模拟套接字连接丢失?
- c# – 带有客户端身份验证的.Net和Java之间的SSL套接字
- C#-PHP套接字连接
java – SSL套接字连接(java中套接字socket)
如何创建SSL套接字连接?
我真的需要创建一个密钥库?这个密钥库应该与我的所有客户端应用程序共享?
我用以下代码创建了一个服务器:
SSLServerSocketFactory sslserversocketfactory = (SSLServerSocketFactory) SSLServerSocketFactory
.getDefault();
SSLServerSocket sslserversocket = (SSLServerSocket) sslserversocketfactory
.createServerSocket(ServerProperties.getInstance()
.getVsspAuthenticationPort());
我在android上用以下代码创建了一个客户端:
SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory
.getDefault();
SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
host, authPort);
sslsocket.startHandshake();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
sslsocket.getoutputStream()));
BufferedReader reader = new BufferedReader(new InputStreamReader(
sslsocket.getInputStream()));
但是当我尝试连接时,会抛出以下错误:
javax.net.ssl.SSLHandshakeException: no cipher suites in common
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1886)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:266)
at sun.security.ssl.ServerHandshaker.chooseCipherSuite(ServerHandshaker.java:894)
at sun.security.ssl.ServerHandshaker.clientHello(ServerHandshaker.java:622)
at sun.security.ssl.ServerHandshaker.processMessage(ServerHandshaker.java:167)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:804)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1016)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1312)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1339)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1323)
解决方法:
您需要证书来建立ssl连接,您可以在密钥库中加载证书,也可以自己加载证书.我将展示一些keystore选项的示例.
您的代码需要运行一些参数:
java -Djavax.net.ssl.keyStore=keyStoreFile -Djavax.net.ssl.keyStorePassword=keystorePassword Server
您还可以使用java代码加载密钥库,最简单的解决方案是设置系统属性:
System.setProperty("javax.net.ssl.keyStore", 'keystoreFile');
System.setProperty("javax.net.ssl.keyStorePassword", 'keystorePassword ');
您也可以使用不同的方式加载密钥库,它更复杂,但您可以执行更复杂的操作:
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("keystoreFile"), "keystorePassword".tochararray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("X509");
kmf.init(ks, "keystorePassword".tochararray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
tmf.init(ks);
SSLContext sc = SSLContext.getInstance("TLS");
TrustManager[] trustManagers = tmf.getTrustManagers();
sc.init(kmf.getKeyManagers(), trustManagers, null);
SSLServerSocketFactory ssf = sc.getServerSocketFactory();
SSLServerSocket s = (SSLServerSocket) ssf.createServerSocket(serverport);
SSLSocket c = (SSLSocket) s.accept();
对于客户端,代码最后一行有一些变化,最后3行将被替换为:
SSLSocketFactory ssf = sc.getSocketFactory();
SSLSocket s = (SSLSocket) ssf.createSocket(serverip, serverport);
s.startHandshake();
如果要为android加载密钥库,则类型必须是“BKS”而不是“JKS”.您可以轻松找到用于创建密钥库的资源.
Android套接字连接超时
我的android应用程序通过socket连接到服务器,socket以node.js编码.当它在前台停留15分钟时,它会丢失与服务器的连接.以下是将sockt连接到服务器的代码
public void connect() {
this.connectionStatus = CONNECT_STATUS_CONNECTING;
Log.v(AppConstants.DEBUG_TAG, userId + " : Connecting to Server");
if (mThread != null && mThread.isAlive()) {
return;
}
mThread = new Thread(new Runnable() {
@Override
public void run() {
try {
Log.v(AppConstants.DEBUG_TAG, userId + " : Thread Action Started");
String secret = createSecret();
int port = (mURI.getPort() != -1) ? mURI.getPort() : (mURI.getScheme().equals("wss") ? 443 : 80);
String path = TextUtils.isEmpty(mURI.getPath()) ? "/" : mURI.getPath();
if (!TextUtils.isEmpty(mURI.getQuery())) {
path += "?" + mURI.getQuery();
}
String originScheme = mURI.getScheme().equals("wss") ? "https" : "http";
URI origin = new URI(originScheme, "//" + mURI.getHost(), null);
SocketFactory factory = mURI.getScheme().equals("wss") ? getSSLSocketFactory() : SocketFactory.getDefault();
mSocket = factory.createSocket(mURI.getHost(), port);
mSocket.setKeepAlive(true);
PrintWriter out = new PrintWriter(mSocket.getoutputStream());
out.print("GET " + path + " HTTP/1.1\r\n");
out.print("Upgrade: websocket\r\n");
out.print("Connection: Upgrade\r\n");
out.print("Host: " + mURI.getHost() + "\r\n");
out.print("Origin: " + origin.toString() + "\r\n");
out.print("Sec-WebSocket-Key: " + secret + "\r\n");
out.print("Sec-WebSocket-Version: 13\r\n");
if (mExtraHeaders != null) {
for (NameValuePair pair : mExtraHeaders) {
out.print(String.format("%s: %s\r\n", pair.getName(), pair.getValue()));
}
}
out.print("\r\n");
out.flush();
HybiParser.HappyDataInputStream stream = new HybiParser.HappyDataInputStream(mSocket.getInputStream());
// Read HTTP response status line.
StatusLine statusLine = parseStatusLine(readLine(stream));
if (statusLine == null) {
Log.v(AppConstants.DEBUG_TAG, "Received no reply from server.");
throw new HttpException("Received no reply from server.");
} else if (statusLine.getStatusCode() != HttpStatus.SC_SWITCHING_PROTOCOLS) {
throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase());
}
// Read HTTP response headers.
String line;
boolean validated = false;
while (!TextUtils.isEmpty(line = readLine(stream))) {
Header header = parseHeader(line);
if (header.getName().equals("Sec-WebSocket-Accept")) {
String expected = createSecretValidation(secret);
String actual = header.getValue().trim();
if (!expected.equals(actual)) {
Log.v(AppConstants.DEBUG_TAG, "Bad Sec-WebSocket-Accept header value.");
throw new HttpException("Bad Sec-WebSocket-Accept header value.");
}
validated = true;
}
}
if (!validated) {
Log.v(AppConstants.DEBUG_TAG, "No Sec-WebSocket-Accept header.");
throw new HttpException("No Sec-WebSocket-Accept header.");
}
onConnect();
Log.v(AppConstants.DEBUG_TAG, userId + " : Thread should be connected by Now");
// Now decode websocket frames.
mParser.start(stream);
} catch (EOFException ex) {
Log.d(AppConstants.DEBUG_TAG, "WebSocket EOF!", ex);
ondisconnect(0, "EOF");
} catch (SSLException ex) {
// Connection reset by peer
Log.d(AppConstants.DEBUG_TAG, "Websocket SSL error!", ex);
ondisconnect(0, "SSL");
} catch (Exception ex) {
one rror(ex);
}
}
});
Log.v(AppConstants.DEBUG_TAG, userId + " : Thread about to be started");
mThread.start();
}
anu解决这个问题?
解决方法:
经过谷歌搜索后,我找到了解决这个问题的方法.为套接字连接添加超时.
mSocket.setSoTimeout(10000);
如果没有任何响应,10秒钟它将抛出SocketTimeoutException并在此异常的catch中关闭连接(如果存在),然后再次连接.
catch (SocketTimeoutException e){
if(mSocket.isConnected()){
disconnect();
}
connect();
}
c# – 如何模拟套接字连接丢失?
如果我可以在我的代码中执行此操作,请建议我,或者我可以将其与任何免费软件一起使用.
编辑:我们知道我们需要阻止连接几毫秒或几秒的端口.
解决方法
>首先,抓住Microsoft Robotics SDK
>接下来,您将需要一个可编程的机器人手臂套件 – 其中一些在here中看起来很有前景.>现在棘手的部分 – 你需要编写一系列动作,将手臂移动到位,闭合手(从而按下RJ45释放小块),然后横向移动,以便创建拔出/重新插入动作.>完成后,将机器人手臂置于NIC以太网端口附近的系统后面,并调用方法触发序列!
c# – 带有客户端身份验证的.Net和Java之间的SSL套接字
在.net中我使用sslStream建立连接,在Java上我使用的是标准的SSLSocket.下面是一些代码片段,但这是我到目前为止的内容:
在服务器端(Windows),我在MMC下的Personal / Certificates文件夹中有一个私有证书.我在“受信任的人/证书”中拥有来自客户的公共证书.两个证书都是由同一个CA颁发的.两个证书的证书链都有多个级别,但两者都相同.链中的根级证书也安装在受信任的证书颁发机构/证书文件夹中.
在客户端(Linux),我有一个密钥库,其中包含与服务器上安装的公共证书匹配的私有证书.我有一个信任存储,它包含来自服务器的公共证书,与服务器的私有证书匹配.
在服务器端(.net)我使用的是一个执行异步读取的Socket,然后它被包装到SSLStream中,代码片段如下所示:
NetworkStream ns = new NetworkStream(socket,false); SslStream ssl = new SslStream(ns,true); ssl.AuthenticateAsServer(serverCertificate,true,SslProtocols.Default,true);
客户端代码几乎是标准代码:
SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault(); InetAddress addr = InetAddress.getByName(servername); SSLSocket socket = (SSLSocket) factory.createSocket(addr,port); socket.setUseClientMode(true); socket.setNeedClientAuth(true); socket.setWantClientAuth(true); socket.startHandshake(); os = new DataOutputStream(socket.getoutputStream()); is = new DataInputStream(socket.getInputStream()); byte[] outBuf = new byte[50]; os.write("SEND SOMETHING".getBytes("UTF-8")); is.read(outBuf);
在java中,我设置了适当的varialbes以指向信任和密钥存储区及其密码.
现在,遵循标准SSL握手,这是发生的事情:
> ClientHello
> ServerHello
>服务器发送公共证书
>客户端将公共证书与信任存储上的证书进行匹配
>服务器发送证书请求
>使用证书请求,服务器发送有效CA列表,在此列表中仅发送我的根CA(在其他众所周知的CA的长列表中).
>客户端证书为空.
>服务器从客户端收到空证书,从而关闭连接.
就是这样,客户端不会将有效证书发送回服务器.我对此有一些疑问:
有没有人经历过这样的事情?
关于服务器发送的CA列表(Windows),.net如何确定要发送给客户端的内容?有没有办法修改该列表?
我是否需要发送用于在CA列表中签署证书的链中的所有权限?或根够了吗?
我在代码的两边都遗漏了什么吗?
任何帮助将不胜感激.
在
解决方法
socket.setNeedClientAuth(true); socket.setWantClientAuth(true);
您看到证书请求消息和客户端证书消息的事实表明服务器配置正确.
在客户端证书消息中缺少证书的最可能原因是密钥库(在客户端)可能未正确配置.您可能对this answer感兴趣,以确保正确配置了客户端密钥库.更具体地说,您需要确保将客户端证书的私钥导入到与证书链相同的别名中(并且它是链回到证书请求消息中公布的CA).
(关于你的其余问题,我不确定在C#中使用SslStream时如何修改服务器发送的CA列表.This earlier question似乎表明没有解决方案,尽管.Net的新版本可能解决了这个问题因为这个问题被问到了.通过查看SslStream api文档和相关类,我找不到任何可以做到的事情,但这并不意味着它不存在.)
C#-PHP套接字连接
我想看一个关于如何使用PHP将数据发送到c#程序pver套接字的教程或示例.
我想发送的数据示例
1:control1 1:control2 1:control3 0:control4 0:control5
谁能指出我正确的方向?
解决方法
例如:
== PHP SCRIPT ==
<?PHP //main execution. process_request(); function process_request() { $header = "200 OK"; if (!empty($_GET['q']) && validate_request()) { switch ($_GET['q']) { case "get_instructions": echo get_instructions(); break; case "something_else": //do something else depending on what data the C# program requested. break; default: $header = "403 Forbidden"; //not a valid query. break; } } else { $header = "403 Forbidden"; } //invalid request. header("HTTP/1.1 $header"); } function validate_request() { //this is just a basic validation,open to you for how you want to validate the request,if at all. return $_SERVER["HTTP_USER_AGENT"] == "MyAppName/1.1 (Instruction Request)"; } function get_instructions() { //pseudo function,for example purposes only. return "1:control1\n1:control2\n1:control3\n0:control4\n0:control5"; } ?>
现在实际从请求中检索数据:
== C#客户代码==
private string QueryServer(string command,Uri serverpage) { string qString = string.Empty; HttpWebRequest qRequest = (HttpWebRequest)HttpWebRequest.Create(serverpage.AbsoluteUri + "?q=" + command); qRequest.Method = "GET"; qRequest.UserAgent = "MyAppName/1.1 (Instruction Request)"; using (HttpWebResponse qResponse = (HttpWebResponse)qRequest.GetResponse()) if (qResponse.StatusCode == HttpStatusCode.OK) using (System.IO.StreamReader qReader = new System.IO.StreamReader(qResponse.GetResponseStream())) qString = qReader.ReadToEnd().Trim(); ; return qString; }
这是一个粗略的模板,具有最小的错误处理,希望它足以让您入门.
编辑:Woops,忘了包含一个示例用法:
MessageBox.Show(QueryServer("get_instructions",new Uri("http://localhost/interop.PHP")));
关于java – SSL套接字连接和java中套接字socket的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于Android套接字连接超时、c# – 如何模拟套接字连接丢失?、c# – 带有客户端身份验证的.Net和Java之间的SSL套接字、C#-PHP套接字连接的相关知识,请在本站寻找。
本文标签: