java - SSL socket php代码需要转换为Java

标签 java php ssl sockets

我有一个 Pem 文件,我用这个 php 代码连接到一个 c++ SSL 服务器,但现在我需要这个用 Java 编写的 php 代码

$ctx = stream_context_create();

stream_context_set_option($ctx, 'ssl', 'local_cert', 'cert.pem');

stream_context_set_option($ctx, 'ssl', 'passphrase', $pass);

$fp = stream_socket_client('ssl://serverURL', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);

if (!$fp) {

    print "Failed to connect $err $errstr\n";
    return;
}

关于如何在 Java 中读取 cert.pem 文件然后建立 SSL 套接字有什么想法吗?

谢谢!

最佳答案

您将需要 Bouncy Castle在你的类路径中。

PEMReader pr = new PEMReader(new FileReader("cert.pem"));
X509Certificate cert = (X509Certificate) pr.readObject();
PEMReader kr = new PEMReader(new FileReader("privkey.pem"),
        new PasswordFinder() {
    public char[] getPassword() {
        return "passphase".toCharArray();
    }
});
KeyPair key = (KeyPair) kr.readObject();
KeyStore ksKeys = KeyStore.getInstance("JKS");
ksKeys.load(null, "passphase".toCharArray());
ksKeys.setCertificateEntry("MyCert", cert);
ksKeys.setKeyEntry("Mykey", key.getPrivate(),
        "passphase".toCharArray(), new Certificate[]{cert});
KeyManagerFactory kmf = KeyManagerFactory.getInstance(
        KeyManagerFactory.getDefaultAlgorithm());
kmf.init(ksKeys, "passphase".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
        TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ksKeys);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

Socket socket = sslContext.getSocketFactory().createSocket(
        "localhost", 4433);
BufferedReader in = new BufferedReader(new InputStreamReader(
        socket.getInputStream()));
PrintWriter out = new PrintWriter(new OutputStreamWriter(
        socket.getOutputStream()));
out.println("Hello World");
System.out.println(in.readLine());
out.close();
in.close();

如果您运行 openssl s_server -Verify cert.pem -cert cert.pem -key privkey.pem,它应该显示:

depth=0 /C=AU/ST=Some-State/O=Internet Widgits Pty Ltd
verify error:num=18:self signed certificate
verify return:1
depth=0 /C=AU/ST=Some-State/O=Internet Widgits Pty Ltd
verify return:1
Hello World
DONE
shutting down SSL
CONNECTION CLOSED
ACCEPT

关于java - SSL socket php代码需要转换为Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/722931/

相关文章:

java - WebDriver容器无法访问DockerComposeContainer服务

java - DBCP XAMPP 不接受我的时区

php - 如何计算员工一周的总小时数和分钟数

javascript - Facebook 上的错误,API 错误代码 : 100, API 错误描述 : invalid parameter, 错误消息:链接 URL 格式不正确

ssl - Magento 2 - SSL 配置后的 502 Bad Gateway

java - 为什么 Spring 中没有 DI 缓存就无法工作?

java - 为运行 java 镜像的 pod 启用其余通信

php - 如何获得最大数量的不同值

google-chrome - 如何让 Windows 10 Chrome 接受 Linux 上 CUPS 管理员生成的自签名证书

ssl - Websockets + TLS 的 Mosquitto 配置