windows安装Luyten
下载地址 https://github.com/deathmarine/Luyten/releases
下载直接运行exe文件
下载es官网platinum版本
docker pull docker.elastic.co/elasticsearch/elasticsearch-platinum:6.2.3
运行
[root@localhost ES623]# docker run -itd --name test docker.elastic.co/elasticsearch/elasticsearch-platinum:6.2.3 bash
8ab342a0db2c8d5fe8bcaef9ca0f50e520ef2425c9f4730615d716a1d2a4c2e3
[root@localhost ES623]#
拷贝jar
docker cp test:/usr/share/elasticsearch/plugins/x-pack/x-pack-core/x-pack-core-6.2.3.jar .
下载x-pack-core-6.2.3.jar到本地
反编译
打开后找到两个class文件,分别为org.elasticsearch.license.LicenseVerifier ,org.elasticsearch.xpack.core.XPackBuild
将反编译后的java 代码复制到自己的IDE中,按照同样的包名创建pack
我们不需要编译整个项目,只需要编译这两个文件,所以要把依赖添加到classpath中,
依赖也与之前有所变化,之前只需要x-pack 包本身,现在需要引入 elasticsearch 6.2.3 中 lib 目录下的jar包 以及 x-pack-core-6.2.3.jar 本身
LicenseVerifier
package org.elasticsearch.license;
import java.nio.*;
import java.util.*;
import java.security.*;
import org.elasticsearch.common.xcontent.*;
import org.apache.lucene.util.*;
import org.elasticsearch.common.io.*;
import java.io.*;
public class LicenseVerifier
{
public static boolean verifyLicense(final License license, final byte[] encryptedPublicKeyData) {
byte[] signedContent = null;
byte[] signatureHash = null;
try {
final byte[] signatureBytes = Base64.getDecoder().decode(license.signature());
final ByteBuffer byteBuffer = ByteBuffer.wrap(signatureBytes);
final int version = byteBuffer.getInt();
final int magicLen = byteBuffer.getInt();
final byte[] magic = new byte[magicLen];
byteBuffer.get(magic);
final int hashLen = byteBuffer.getInt();
signatureHash = new byte[hashLen];
byteBuffer.get(signatureHash);
final int signedContentLen = byteBuffer.getInt();
signedContent = new byte[signedContentLen];
byteBuffer.get(signedContent);
final XContentBuilder contentBuilder = XContentFactory.contentBuilder(XContentType.JSON);
license.toXContent(contentBuilder, (ToXContent.Params)new ToXContent.MapParams((Map)Collections.singletonMap("license_spec_view", "true")));
final Signature rsa = Signature.getInstance("SHA512withRSA");
rsa.initVerify(CryptUtils.readEncryptedPublicKey(encryptedPublicKeyData));
final BytesRefIterator iterator = contentBuilder.bytes().iterator();
BytesRef ref;
while ((ref = iterator.next()) != null) {
rsa.update(ref.bytes, ref.offset, ref.length);
}
return rsa.verify(signedContent) && Arrays.equals(Base64.getEncoder().encode(encryptedPublicKeyData), signatureHash);
}
catch (IOException ex) {}
catch (NoSuchAlgorithmException ex2) {}
catch (SignatureException ex3) {}
catch (InvalidKeyException e) {
throw new IllegalStateException(e);
}
finally {
Arrays.fill(encryptedPublicKeyData, (byte)0);
if (signedContent != null) {
Arrays.fill(signedContent, (byte)0);
}
if (signatureHash != null) {
Arrays.fill(signatureHash, (byte)0);
}
}
}
public static boolean verifyLicense(final License license) {
byte[] publicKeyBytes;
try (final InputStream is = LicenseVerifier.class.getResourceAsStream("/public.key")) {
final ByteArrayOutputStream out = new ByteArrayOutputStream();
Streams.copy(is, (OutputStream)out);
publicKeyBytes = out.toByteArray();
}
catch (IOException ex) {
throw new IllegalStateException(ex);
}
return verifyLicense(license, publicKeyBytes);
}
}
XPackBuild
package org.elasticsearch.xpack.core;
import org.elasticsearch.common.io.*;
import java.net.*;
import org.elasticsearch.common.*;
import java.nio.file.*;
import java.io.*;
import java.util.jar.*;
public class XPackBuild
{
public static final XPackBuild CURRENT;
private String shortHash;
private String date;
@SuppressForbidden(reason = "looks up path of xpack.jar directly")
static Path getElasticsearchCodebase() {
final URL url = XPackBuild.class.getProtectionDomain().getCodeSource().getLocation();
try {
return PathUtils.get(url.toURI());
}
catch (URISyntaxException bogus) {
throw new RuntimeException(bogus);
}
}
XPackBuild(final String shortHash, final String date) {
this.shortHash = shortHash;
this.date = date;
}
public String shortHash() {
return this.shortHash;
}
public String date() {
return this.date;
}
static {
final Path path = getElasticsearchCodebase();
String shortHash = null;
String date = null;
Label_0157: {
if (path.toString().endsWith(".jar")) {
try {
final JarInputStream jar = new JarInputStream(Files.newInputStream(path, new OpenOption[0]));
Throwable t = null;
try {
final Manifest manifest = jar.getManifest();
shortHash = manifest.getMainAttributes().getValue("Change");
date = manifest.getMainAttributes().getValue("Build-Date");
}
catch (Throwable t2) {
t = t2;
throw t2;
}
finally {
if (t != null) {
try {
jar.close();
}
catch (Throwable t3) {
t.addSuppressed(t3);
}
}
else {
jar.close();
}
}
break Label_0157;
}
catch (IOException e) {
throw new RuntimeException(e);
}
}
shortHash = "Unknown";
date = "Unknown";
}
CURRENT = new XPackBuild(shortHash, date);
}
}
网友评论