GVKun编程网logo

java – SSL套接字连接(java中套接字socket)

21

本文将介绍java–SSL套接字连接的详细情况,特别是关于java中套接字socket的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Android

本文将介绍java – SSL套接字连接的详细情况,特别是关于java中套接字socket的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于Android套接字连接超时、c# – 如何模拟套接字连接丢失?、c# – 带有客户端身份验证的.Net和Java之间的SSL套接字、C#-PHP套接字连接的知识。

本文目录一览:

java – SSL套接字连接(java中套接字socket)

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套接字连接超时

我的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# – 如何模拟套接字连接丢失?

c# – 如何模拟套接字连接丢失?

在我们的一个客户端 – 服务器应用程序中,由于各种原因,我们需要在套接字连接丢失时测试应用程序的行为.对于此测试,我们需要模拟一个程序,该程序可以每隔几秒强制中断服务器上特定端口上的连接.通过这种方式,我们可以测试连接的客户端如何对这种连接中断做出反应的行为.

如果我可以在我的代码中执行此操作,请建议我,或者我可以将其与任何免费软件一起使用.

编辑:我们知道我们需要阻止连接几毫秒或几秒的端口.

解决方法

一项艰巨的任务!

>首先,抓住Microsoft Robotics SDK
>接下来,您将需要一个可编程的机器人手臂套件 – 其中一些在here中看起来很有前景.>现在棘手的部分 – 你需要编写一系列动作,将手臂移动到位,闭合手(从而按下RJ45释放小块),然后横向移动,以便创建拔出/重新插入动作.>完成后,将机器人手臂置于NIC以太网端口附近的系统后面,并调用方法触发序列!

c# – 带有客户端身份验证的.Net和Java之间的SSL套接字

c# – 带有客户端身份验证的.Net和Java之间的SSL套接字

我正在尝试在.NET和 Java之间创建一个SSL套接字服务器/客户端.在这种情况下,我的SSL套接字服务器将在.net中运行,客户端在 Linux下以Java运行.我的问题是握手期间连接失败,特别是当服务器从客户端请求证书时,客户端无法发送回来的东西,连接失败.

在.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套接字连接

C#-PHP套接字连接

我正在通过服务器上的PHP脚本控制的PC上编写程序.我目前正在使用PHP来来回ftp文件并使用c#读取文件并根据文件中的数据执行命令.然而,这不是一个理想的解决方案.

我想看一个关于如何使用PHP将数据发送到c#程序pver套接字的教程或示例.

我想发送的数据示例

1:control1
1:control2
1:control3
0:control4
0:control5

谁能指出我正确的方向?

解决方法

而不是尝试让你的服务器端PHP脚本将数据发送到C#程序,这将给你带来一堆令人头疼的问题,为什么不在PHP脚本上写一些东西,给定页面的特定请求,输出当前排队的说明?然后,C#程序可以只对页面进行WebRequest并接收其指令.

例如:

== 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套接字连接的相关知识,请在本站寻找。

本文标签: