gpt4 book ai didi

Java 相当于 OpenSSL s_client 命令

转载 作者:搜寻专家 更新时间:2023-10-30 21:29:41 25 4
gpt4 key购买 nike

我需要将某些 bash 脚本转换为 java 并且其中一个脚本使用带有 openssl 连接到服务器vanity-url 作为参数来检查是否可以使用 vanity-url 进行连接。请参阅下面的命令

/usr/bin/openssl s_client -connect api.sys.found1.cf.company.com:443 -servername www.app.company.com 2>/dev/null

我想在 java 中进行类似的 Activity 并测试连接性。关于如何使用 Java 建立 open-ssl 连接的任何想法。这是我需要使用外部库的东西吗?

最佳答案

我能够通过引用文档 over here 来实现这一点

基本上,需要创建一个 SSLEngine 并与 SNI 一起成功握手

 private SocketChannel createSocketChannel() throws IOException {
InetSocketAddress socketAddress = new InetSocketAddress(PROXY_ADDRESS, PROXY_PORT);
SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(socketAddress);
socketChannel.configureBlocking(false);
return socketChannel;

}

private SSLContext createSSLContext() throws KeyManagementException, NoSuchAlgorithmException {
SSLContext sslContext = SSLContext.getInstance(TLS_VERSION);
sslContext.init(null,null,null);
return sslContext;
}




private SSLEngine createSSLEngine() throws KeyManagementException, NoSuchAlgorithmException {
SSLContext sslContext = createSSLContext();
SSLEngine sslEngine = sslContext.createSSLEngine(PROXY_ADDRESS, PROXY_PORT);
sslEngine.setUseClientMode(true);

List<SNIServerName> serverNameList = new ArrayList<>();
serverNameList.add(new SNIHostName(SNI_HOST_NAME));
SSLParameters sslParameters = sslEngine.getSSLParameters();
sslParameters.setServerNames(serverNameList);

sslEngine.setSSLParameters(sslParameters);

return sslEngine;
}

创建 SSLEngine 后,handShake 必须开始

SocketChannel channel = createSocketChannel();
SSLEngine sslEngine = createSSLEngine();
doHandShake(sslEngine,channel);


private void doHandShake(SSLEngine sslEngine, SocketChannel socketChannel) throws Exception {
System.out.println("Going to do Handshake");

SSLSession session = sslEngine.getSession();

ByteBuffer myAppData = ByteBuffer.allocate(session.getApplicationBufferSize());
ByteBuffer peerAppData = ByteBuffer.allocate(session.getApplicationBufferSize());

ByteBuffer myNetData = ByteBuffer.allocate(session.getPacketBufferSize());
ByteBuffer peerNetData = ByteBuffer.allocate(session.getPacketBufferSize());

sslEngine.beginHandshake();
SSLEngineResult result;

handshakeStatus = sslEngine.getHandshakeStatus();

while (handshakeStatus != SSLEngineResult.HandshakeStatus.FINISHED &&
handshakeStatus != SSLEngineResult.HandshakeStatus.NOT_HANDSHAKING) {


switch (handshakeStatus) {
case NEED_UNWRAP:
if (! (socketChannel.read(peerNetData) <0)) {
peerNetData.flip();
result = sslEngine.unwrap(peerNetData,peerAppData);
peerNetData.compact();

handshakeStatus = result.getHandshakeStatus();

switch (result.getStatus()) {
case OK:
break;
}

}

break;
case NEED_WRAP:
myNetData.clear() ;// Empty the local network packet buffer
result = sslEngine.wrap(myAppData,myNetData);
handshakeStatus = result.getHandshakeStatus();
switch (result.getStatus()) {
case OK:
myNetData.flip();
while (myNetData.hasRemaining()) {
socketChannel.write(myNetData);
}
}
break;

case NEED_TASK:
Runnable task = sslEngine.getDelegatedTask();
if (null!=task) {
task.run();
}
handshakeStatus = sslEngine.getHandshakeStatus();
break;
}


}

handShake 完成后。你可以获得Principal对象

Principal principal = sslEngine.getSession().getPeerPrincipal();

if (principal.getName().contains(SNI_HOST_NAME)) {
System.out.println("available ... ");
}else {
System.out.println("Not available");
}

关于Java 相当于 OpenSSL s_client 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56005883/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com