当前位置: 首页 > 知识库问答 >
问题:

使用SSLSocket Java创建应用程序

郎仰岳
2023-03-14

我想创建一个应用程序使用SSLSocket:客户端向服务器发送字符串,服务器将使用字符串的大写字母,并发送回客户端进行显示。

public class SSLServer {
    public static void main(String args[]) throws Exception
    {
        try{
        //Creaet a SSLServersocket
        SSLServerSocketFactory factory=(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
        SSLServerSocket sslserversocket=(SSLServerSocket) factory.createServerSocket(1234);
        //Tạo 1 đối tượng Socket từ serversocket để lắng nghe và chấp nhận kết nối từ client
        SSLSocket sslsocket=(SSLSocket) sslserversocket.accept();
        //Tao cac luong de nhan va gui du lieu cua client
        DataInputStream is=new DataInputStream(sslsocket.getInputStream());
        PrintStream os=new PrintStream(sslsocket.getOutputStream());
        while(true)  //khi dang ket noi voi client
        {
            //Doc du lieu den
            String input=is.readUTF();
            String ketqua=input.toUpperCase();
            //Du lieu tra ve
            os.println(ketqua);
        }
        }
        catch(IOException e)
        {
           System.out.print(e);
        }
    }
}
public class SSLClient {
    public static void main(String args[])
    {
        try
        {
        //Mo 1 client socket den server voi so cong va dia chi xac dinh
        SSLSocketFactory factory=(SSLSocketFactory) SSLSocketFactory.getDefault();
        SSLSocket sslsocket=(SSLSocket) factory.createSocket("127.0.0.1",1234);

        //Tao luong nhan va gui du lieu len server
        DataOutputStream os=new DataOutputStream(sslsocket.getOutputStream());
        DataInputStream is=new DataInputStream(sslsocket.getInputStream());

        //Gui du lieu len server
        String str="helloworld";
        os.writeBytes(str);

        //Nhan du lieu da qua xu li tu server ve
        String responseStr;
        if((responseStr=is.readUTF())!=null)
        {
            System.out.println(responseStr);
        }

        os.close();
        is.close();
        sslsocket.close();
        }
        catch(UnknownHostException e)
        {
             System.out.println(e.getMessage());
        }
        catch(IOException e)
        {
            System.out.println(e.getMessage());
        }
    }
}

当运行SSLServer时。它显示以下错误:

javax.net.ssl.SSLException: No available certificate or key corresponds 
    to the SSL cipher suites which are enabled

我有搜索和做一些方法,但是。。你能帮助我吗。

共有3个答案

杨高翰
2023-03-14

检查已安装的证书。确保他们支持您正在谈判的密码套件。

霍财
2023-03-14

@科瓦罗迪的答案是正确的。但是,如果您想通过编程方式设置配置以避免全局设置(如我),您可以像下面这样(Kotlin):

val password = "yourPassword".toCharArray()

val keyStore = KeyStore.getInstance(File("yourKeystorePath.jks"), password)

val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
trustManagerFactory.init(keyStore)

val keyManagerFactory = KeyManagerFactory.getInstance("NewSunX509")
keyManagerFactory.init(keyStore, password)

val context = SSLContext.getInstance("TLS") //"SSL" "TLS"
context.init(keyManagerFactory.keyManagers, trustManagerFactory.trustManagers, null)

val factory = context.serverSocketFactory

(factory.createServerSocket(LISTENING_PORT) as SSLServerSocket).use { serverSocket ->
    logger.trace("Listening on port: $LISTENING_PORT")

    // ...
}

或者在Java中:

final char[] password = "yourPassword".toCharArray();

final KeyStore keyStore = KeyStore.getInstance(new File("yourKeystorePath.jks"), password);

final TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);

final KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("NewSunX509");
keyManagerFactory.init(keyStore, password);

final SSLContext context = SSLContext.getInstance("TLS");//"SSL" "TLS"
context.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

final SSLServerSocketFactory factory = context.getServerSocketFactory();

try (SSLServerSocket serverSocket = ((SSLServerSocket) factory.createServerSocket(LISTENING_PORT))) { 
    logger.trace("Listening on port: " + LISTENING_PORT);

    // ...
}
汝岳
2023-03-14

这将生成证书:

keytool -genkey -keystore yourKEYSTORE -keyalg RSA

输入密码,然后使用ssl调试信息启动服务器(将密钥库放入SSLServer.class目录):

java -Djavax.net.ssl.keyStore=yourKEYSTORE -Djavax.net.ssl.keyStorePassword=yourPASSWORD -Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol -Djavax.net.debug=ssl SSLServer

然后启动客户端(将密钥库放入SSLClient.class目录):

java -Djavax.net.ssl.trustStore=yourKEYSTORE -Djavax.net.ssl.trustStorePassword=yourPASSWORD SSLClient
 类似资料:
  • 我将使用ADFS作为身份提供者(IDP)实现对java应用程序的单点登录。通过OneLogin找到了此解决方案SSO,并使用了其示例应用程序。除此之外,还有另一个解决方案Shibboleth。 我想知道与我的上下文匹配的最佳解决方案是什么。之间,这不是Spring应用程序。 谢谢

  • Ember CLI,Ember的命令行界面提供了一个标准的项目结构,一组开发工具和一个插件系统。这允许Ember开发人员专注于构建应用程序,而不是构建使它们运行的​​支持结构。可通过ember --help显示Ember CLI提供的命令,或通过ember help <command-name>查看特定命令的信息。 创建应用程序 $ ember new super-rentals 上述ember

  • C:\Users\Price Charles 在C:\Users\Price Charles\larotiks中创建新的React应用程序。 安装包。这可能需要几分钟。使用cra模板安装反应、反应-多姆和反应-脚本... 我正在创建我的反应项目,但它总是卡在这里,不能继续创建我的项目。请帮帮我

  • 我想创建反应应用程序,但我的npx创建反应应用程序myapp命令不工作D:\AED 在D:\AED\aed中创建新的React应用。 安装包。这可能需要几分钟。使用cra模板安装反应、反应-多姆和反应-脚本... 它被困在这里已经两个小时了。

  • 我是android开发的新手。我正在制作一个相机应用程序,我卡在点上,我得到了这么多的解决方案已经在网上,但我的问题没有解决,请帮助。我是自动捕获的图像和上传的服务器,但我得到所有的图像在景观模式,正确的方向,其他没有在正确的方向。在预览时,我的显示器是右转的,但是捕获图像的图像方向不对,我的代码是 public void surfaceChanged(SurfaceHolder holder,i

  • 我想使用maven创建一个多层java项目,如下所示: presentationlayer-guiModule(JSP/JSF页面的最顶层) PresentationLayer-GatewayModule(web服务的最顶层) BusinessLayer-ServiceModule(中间层) DataAccessLayer(最下层) 通用层(可从所有层访问的垂直层) 根pom 耳POM Guimo