【问题标题】:Two Way SSL with openssl/java使用 openssl/java 的两种方式 SSL
【发布时间】:2016-05-31 07:52:52
【问题描述】:

我有一个 java 客户端应用程序,它希望以双向 SSL 连接到服务器。 我创建一对公钥/私钥。公钥名称为 key.cert,私钥名称为 key.pem。 然后服务器端给我一个带有 server.cert 名称的公钥。 我的问题是:

  1. 什么将我端(客户端)中的三个密钥(key.cert\key.pem\server.cert)转换为 java Key Store(JKS)
  2. 什么在代码中创建Socket以连接到服务器?

【问题讨论】:

  • 不要对非代码文本使用代码格式。
  • Java 密钥库(任何类型)可以使用 GUI 开源工具“Portecle”轻松编辑。无论如何,请提高您的问题的质量。
  • 我不太清楚您所说的 Two Way SSL 是什么意思。 SSL 连接本质上是双向的。还是您的问题是关于相互身份验证,通常使用带有客户端证书的 SSL/TLS 来实现?
  • @EJP 抱歉,我编辑了原始问题。
  • @f_puras 是的,意思是相互认证。

标签: java ssl openssl jks


【解决方案1】:
        System.out.println("Connecting to " +IP + "port "
                + Port);

        // load client private key
            KeyStore clientKeys = KeyStore.getInstance("JKS");
            clientKeys.load(
                    new FileInputStream(ProjectConfig
                            .getProperty("KeyStoreAndTrustStore")),
                    ProjectConfig.getProperty(
                            "KeyStoreAndTrustStorePassword")
                            .toCharArray());
            KeyManagerFactory clientKeyManager = KeyManagerFactory
                    .getInstance("SunX509");
            clientKeyManager.init(
                    clientKeys,
                    ProjectConfig.getProperty(
                            "KeyStoreAndTrustStorePassword")
                            .toCharArray());
            // load server public key
            KeyStore serverPub = KeyStore.getInstance("JKS");
            serverPub.load(
                    new FileInputStream(ProjectConfig
                            .getProperty("KeyStoreAndTrustStore")),
                    ProjectConfig.getProperty(
                            "KeyStoreAndTrustStorePassword")
                            .toCharArray());
            TrustManagerFactory trustManager = TrustManagerFactory
                    .getInstance("SunX509");
            trustManager.init(serverPub);

            // use keys to create SSLSoket
            SSLContext ssl = SSLContext.getInstance("TLS");
            ssl.init(clientKeyManager.getKeyManagers(),
                    trustManager.getTrustManagers(),
                    SecureRandom.getInstance("SHA1PRNG"));

            sslClient = (SSLSocket) ssl.getSocketFactory().createSocket(
                    IP, Port);

            sslClient.setSoTimeout(TimeOut);
            System.out.println("connected to "
                    + sslClient.getRemoteSocketAddress());
            OutputStream outToServer = sslClient.getOutputStream();

            out = new DataOutputStream(outToServer);
            String contentToSend = ((String)Paylod);

            out.writeUTF(contentToSend);
            System.out.println(" sending data.... " + contentToSend);
            InputStream inFromServer = sslClient.getInputStream();
            in = new DataInputStream(inFromServer);
            response = in.readUTF();
            System.out.println("Server says.... " + response);
            sslClient.close();

【讨论】:

    猜你喜欢
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    相关资源
    最近更新 更多